2011-11-18 3 views
4

내 앱이 데이터베이스를로드하는 동안 애니메이션 스플래시 화면을 만들려고합니다. 이미 스플래시 스크린을 만들었지 만 데이터베이스가 변환되는 동안 이미지를 왼쪽에서 오른쪽으로 "이동"시키고 싶습니다. 여기 애니메이션 스플래시 화면 만들기 delphi7

내 코드의 ... 잠시 동안 지금 찾고 있지만 찾을 수있는 모든 진행률 표시 줄에 관한되었다 : 내 splashscrren 형태에

SplashScreen := TSplashScreen.Create(Application) ; 
SplashScreen.Show; 
Application.Initialize; 
SplashScreen.Update; 
SplashScreen.lblStatus.Caption:='Loading...'; 
SplashScreen.Update; 
SplashScreen.lblStatus.Caption:='Updating database...'; 
SplashScreen.Update; 
Application.Initialize; 
Application.CreateForm(TfmMain, fmMain); 
Sleep(1000); 

Application.CreateForm(TfmPrefs, fmPrefs); 
Application.CreateForm(TfmCode, fmCode); 
Application.CreateForm(TfmEmps, fmEmps); 
Application.CreateForm(TfmRest, fmRest); 
Application.ShowMainForm:=FALSE; 

SplashScreen.Hide; 
SplashScreen.Free; 
Application.Run; 

, 나는 같은 이미지의 5 개 중복 생성 주 동안 양식 작성, 나는 이미지가 alternance에서 표시 및 표시되지되고 싶어 ... 예 :

while my db loads... begin 
Splashscreen.Image1.Visible:=FALSE; 
SplashScreen.Update; 
Sleep(25); 
SplashScreen.Image1.Visible:=FALSE; 
SplashScreen.Update; 
SplashScreen.Image2.Visible:=TRUE;.... 

등등!

의견이 있으십니까?

+0

귀하의 궁금한 점은 무엇입니까? 두 스레드 모두에서'Sleep '은 주 스레드에서 모든 것을 실행하고 있기 때문에 최소한 Sleep에 대한 호출 기간 동안 전체 응용 프로그램을 일시 중지합니다 ('while db loads' 코드 포함). IOW, 이미지 디스플레이를 업데이트하려고 할 때 스레드를 일시 중지 상태로두면 응용 프로그램이 중지됩니다. –

+0

Ken이 제안한 원본 게시물 : - 흠, 대신 GIF 이미지를 사용해 보시지 않으시겠습니까? 양식에 애니메이션 GIF를 표시하려면 여기에서 액세스 할 수있는 TGifImage 사용을 고려할 수 있습니다. http://www.tolderlund.eu/delphi/ – Pateman

+0

맨 위 스 니펫의 SLeep (1000)은 스플래시 화면 만 표시하기 때문에 제거됩니다. 응용 프로그램이 완료되면 ... 실제로 거기에 splashscreen을 보게 해줍니다. 두 번째 이미지는 최소한 25 밀리 초 동안 유지되므로 트레이로 나타나지 않습니다. – Gab

답변

4

시작 중에 주 스레드에서 많은 작업을하는 경우 (예 : 데이터베이스 및 여러 양식 초기화) 은 시작 화면에서 제대로 작동하지 않습니다. 주 스레드는 GUI를 사용하기에는 너무 많은 공간이 있습니다. 수면을 코드에 넣는 것은 작동하지 않습니다. 그러면 주 스레드가 어떤 작업을 전혀하지 않게 될 것이기 때문입니다.

이 두 가지 옵션을 잎 :

  1. 다른 스레드에서 데이터베이스 초기화를 수행합니다. 때로는 기본 양식 만 초기화하는 것도 좋은 방법입니다. 데이터베이스 스레드는 PostMessage 호출을 통해 스플래시 양식으로 진행 메시지를 보낼 수 있습니다.

  2. 별도의 스레드에서 시작 화면을 시작하십시오. 이것은 다른 스레드에서 VCL을 사용할 수 없기 때문에 다소 까다 롭습니다. 또한 메시지 대기열을 차단하지 않아야합니다. 운좋게도 Peter는 Windows API 호출 만 사용하여 threaded splash screen을 수행하는 좋은 예를 만들었습니다.

이 SO 스레드에는 몇 가지 추가 정보가 있습니다. displaying-splash-screen-in-delphi-when-main-thread-is-busy.

+0

+1. 코멘트의 좋은 확장. :) –

+0

@KenWhite, 고마워. 그리고 아마도 옵션 2는 윈도우 버전에 의존하는 반면, 옵션 1은 제네릭 솔루션이라고 언급 했어야합니다. –

+0

@TOndrej, # 1이 문제 일 수 있습니다. 데이터베이스 연결 (어쨌든 사용했던 모든 DB 용)은 스레드 단위이므로 개별 스레드로 초기화하면 초기화가 완료되면 주 스레드가 해당 연결에 액세스하지 못하게됩니다 (물론 완전히 다른 주제 인 보조 스레드와 주 스레드 간의 통신 수단을 설정하십시오 (). –