2012-07-26 2 views
2

가능한 중복 : Show a splash screen while a database connection (that might take a long time) runs코드를 초기화하는 가장 좋은 장소는 어느 것입니까?

로드 INI 파일과 같은 코드를 초기화하는 가장 좋은 장소입니다
Splash Screen Programatically
? 먼저 화면에 양식을 표시하여 사용자가 응용 프로그램이로드 중이고 LoadIniFile 또는 IsConnectedToInternet과 같은 긴 함수를 호출해야한다는 것을 알 수 있도록합니다. 마지막은 정말 느립니다.

양식이 아직 준비되지 않았으므로 화면에 표시되지 않으므로 OnCreate가 좋지 않습니다.

나는이 I의 조선 민주주의 인민 공화국을하지만 항상 작동하지 : LateInitialize (4-5 초) 실행될 때까지

program Test; 
begin 
    Application.Initialize; 
    Application.Title := 'Test app'; 
    Application.CreateForm(TfrmTest, frmTest); 
    frmTest.Show;    <---------------------- won't show 
    LateInitialize; 
    Application.Run; 
end. 

양식이 표시되지 않습니다.


procedure LateInitialize; 
begin 
CursorBussy; 
TRY 
    // all this won't work also. the form won't show 
    frmTest.Visible:= TRUE; 
    Application.ProcessMessages; 
    frmTest.Show; 
    Application.ProcessMessages; 
    frmTest.BringToFront; 
    frmTest.Update; 
    Application.ProcessMessages; 

    DoSomethingLengthy;  {4-5 seconds} 
FINALLY 
    CursorNotBussy; 
END; 
end;  <--------- Now the form shows. 

는 그리고 네, 내 유일한 형태 (기본 양식)입니다 frmTest.

+0

그 지위에는 어떤 대답도없고 똑같은 주제가있다. – Ampere

+2

음, 그렇습니다. 그것은 큰 녹색 체크 표시와 3 개의 upvotes가있는 [right here] (http://stackoverflow.com/a/3359841/62576)입니다. 그리고 네, 그들은 같은 주제에 있습니다. 그래서 귀하의 질문입니다, 그래서 나는 그것을 [duplicate] (http://dictionary.reference.com/browse/duplicate)로 표시했습니다. –

+4

그들이 정확히 같은 주제에 있다면, 당신의 입장에서이 질문과 정확히 중복됩니다. 그들이 대답을 받아들 였는지 여부는 중요하지 않습니다. "중복"은 질문의 속성으로 어떤 답변이든지간에 완전히 독립적입니다. 그러나 * Ken *이 연결된 질문 모두가 답변을 수락했습니다. 이미 여기에서 질문을 받았고 상황에 적절한 대답이없는 경우 사람들이 대답 할 수 있도록 해당 질문에주의를 환기시키는 방법이 있습니다. 중복 된 질문을하는 것은 그 중 하나 일뿐입니다. –

답변

2

쉬운 방법은 자신에게 메시지를 보내는 것입니다. 나는 항상 이것을한다

const 
    MSG_AFTERCREATE = WM_APP + 4711; 

... 
procedure OnCreate(Sender: TObject); 
procedure AfterCreate(var message: TMessage); message MSG_AFTERCREATE; 
... 


Implementation 

procedure OnCreate(Sender: TObject); 
begin 
    PostMessage(Self.Handle, MSG_AFTERCREATE, 0, 0); 
end; 

procedure AfterCreate(var message: TMessage); 
begin 
    //Do initializing here... the form is done creating, and are actually visible now... 
end; 
+0

좋아요! 나는 그것을 시도 할 것이다. 감사. 매우 우아합니다. 나는 아무도 이처럼 오지 않았고 지금까지 어떻게 대답했는지 궁금합니다! – Ampere

0

오래 전에 다른 포럼에서 멀리 떨어진 누군가가 양식의 수명주기를 문서화하기 위해 다음을 게시했습니다. 나는 그것이 유용하다는 것을 발견했다. 그래서 그것을 여기에서 공유하고있다.

Create  OnCreate 
Show   OnShow 
Paint  OnPaint 
Activate  OnActivate 
ReSize  OnResize 
Paint  OnPaint 

Close query OnCloseQuery 
Close  OnClose 
Deactivate OnDeactivate 
Hide   OnHide 
Destroy  OnDestroy 

OnActivate 이벤트를 사용해보십시오.

+1

그러나 'OnActivate'는 프로그램 과정에서 여러 번 실행될 수 있습니다. –

+1

-1. OnActivate는 폼이 포커스를 잃고 다시 얻는 순간마다 발생합니다 (예를 들어, 사용자가 앱의 다른 폼을 클릭하거나 다른 응용 프로그램으로 전환 한 다음 다시 사용자로 돌아 간다). 초기화 코드가 여러 번 실행되지 않는 한 OnActivate는 절대 잘못된 장소입니다. –

+2

@ Rob Kennedy & Ken White : 당신들은 전문가들입니다. 그래서 나는 당신의 뛰어난 지식을 미룰 것입니다. 그러나, 저는 항상 비슷한 것을합니다 (그러나 더 자주 OnShow 이벤트에서). 초기화 코드가 실행되었는지 여부를 나타내는 플래그 변수를 추가하기 만하면됩니다. 초기화가 발생하면 초기화 코드를 건너 뜁니다. 그는 초기화 코드를 어디에 두어야 하는지를 물었습니다. 코드 작성 방법이 아닙니다. –

3

frmTest.Show을 호출 한 후 LateInitialize을 호출하기 전에 frmTest.Update을 호출하여 화면에 표시 할 수 있습니다. 그러나 Application.Run이 호출 될 때까지는 주 메시지 루프가 실행되지 않으므로 양식이 그전에 다른 작업을 수행 할 수 없습니다.

또 다른 옵션은 양식의 OnShow 이벤트를 사용하여 양식에 PostMessage()을 통해 사용자 지정 창 메시지를 게시 한 다음 나중에 해당 메시지를받을 때 양식 호출 LateInitialize을 사용하는 것입니다. 이렇게하면 LateInitialize이 호출 될 때까지 양식이 정상적으로 그림 메시지를 처리 ​​할 수 ​​있습니다.

주 스레드를 몇 밀리 초/초 이상 차단하는 것은 실제로는 별도의 작업자 스레드로 이동해야합니다 (특히 IsConnectedToInternet 등). 주 스레드는 UI를 실행하는 데 사용해야합니다.

1

변형 1 : 대부분의 구성 요소가 초기화 변형 1.1 스스로를 그릴에 사용 TTimer 1 초 지연이,이 시간을 줄 것이다 초기화 을 기본 폼의에서 onShow TTimer에서에서 실행 : 함수에서 사용 메시지 방법과 OnShow에서 Win API PostMessage (SendMessage aka Perform는 아님)를 호출하십시오. 이것은 유사하지만보다 저렴하고 빠릅니다. 그러나 양식의 일부 복잡한 구성 요소가 완전히 그려지기 전에 "do init now"메시지가 수신 될 수 있습니다.

변형 2 : 스레드 (OmniThreadsLib 또는 일반 TThread)는 MainForm에서 OnCreate에서 그것을 시작하고 그 다음 당신이있는 경우에 진정으로 가장 좋은 방법입니다 필요한 모든 버튼, 메뉴 등 수 있도록, 백그라운드에서 모든 데이터를 준비 할 수 긴 함수와 블로킹, IsConnectedToInternet에 대해 설명했습니다.

변형 3 : 기본 폼을 표시하기 전에 SplashScreen을 사용하십시오. 사용자가 아직 읽지 않은 응용 프로그램을 보았으므로 좋습니다. 그게 그만큼 나쁘다. 사람들은 프로그램이 느리다는 느낌을 갖기 시작한다. Google 크롬은 실제 컨트롤이 조금 후에 준비 되더라도 "우리는 이미 시작되었습니다."보이기 위해 1 차 모선에서 그림으로 그 기본 양식을 그려야한다고했습니다.

+0

변종 1 : CPU가 있고 기본 양식에 자체 업데이트 시간이 없지만 TTimer의 시간이 만료 (두 번째 통과) 경우 어떻게해야합니까? – Ampere

+0

Variant2 : 초기화에서 나는 GUI (INI 파일) 및 글로벌 변수 초기화를 많이해야합니다. 쓰레드는 메인 폼과 많은 상호 작용을합니다. – Ampere

+0

변종 3 : 나는 그것을 좋아한다 – Ampere

관련 문제