[Delphi 7] SplashScreen werkt niet

Pagina: 1
Acties:

  • Kogelvis
  • Registratie: Maart 2001
  • Laatst online: 26-08 13:03

Kogelvis

Nu ook met gitaar

Topicstarter
Hallo,

Ik ben momenteel met een programmaatje bezig in delphi en hieraan probeer ik een splashscreen toe te voegen nu heb ik een voorbeeld geplukt uit een Delphi Reference Manual maar nu zit ik met het volgende probleem

Ik heb een Form genaamd Form2 met een plaatje er in en een timer ingesteld op 3 seconden,
met die ontimer gebeurd het volgende
code:
1
2
3
4
procedure TForm2.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
end;


Op het hoofdform gebeurd het volgende
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
implementation

{$R *.dfm}
begin
    Application.Initialize;
    Form2 := TForm2.Create(Application);
    Form2.Show;
    Form2.Update;

    while Form2.Timer1.Enabled do
      Application.ProcessMessages;

    Application.CreateForm(TForm1, Form1);
    Form2.Hide;
    Form2.Free;
    Application.Run;


hierna volgen mijn procedures van het programma maar als ik het nu probeer te compileren krijg ik de volgende error
[Error] mm1.pas(63): Statement expected but 'PROCEDURE' found
Zo goed ik weet moet nu na die application.run; end. komen maar dat gaat ook niet werken aangezien ik dan in de knoop kom met mijn procedures maar wat kan ik nu doen om het wel werkend te krijgen de search / de pagina's uit de faq en de help van delphi bieden geen oplossing.

ik hoop zo voldoende info te hebben gegeven

Kan iemand mij hiervoor een oplossing bieden?

<Jeroen> Wirf: vrouwen versieren kan je gewoon in het OSI model proppen hoor :P
I am dyslexic of Borg prepare to have your ass laminated
Real Programmers always confuse Christmas and Halloween because oct31 = dec25


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Kogelvis schreef op 03 november 2002 @ 12:48:
Ik heb een Form genaamd Form2 met een plaatje er in en een timer ingesteld op 3 seconden,
met die ontimer gebeurd het volgende
code:
1
2
3
4
procedure TForm2.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
end;


Op het hoofdform gebeurd het volgende
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
implementation

{$R *.dfm}
begin
    Application.Initialize;
    Form2 := TForm2.Create(Application);
    Form2.Show;
    Form2.Update;

    while Form2.Timer1.Enabled do
      Application.ProcessMessages;

    Application.CreateForm(TForm1, Form1);
    Form2.Hide;
    Form2.Free;
    Application.Run;
Je while loopje zorgt ervoor dat het programma 3 seconden wacht inderdaad, maar het is niet echt een splash screen aangezien de rest van het programma niet laad. Pas na 3 seconden nutteloos wachten laad het programma.

En ik zou er nog een try...finally omheenzetten...
hierna volgen mijn procedures van het programma maar als ik het nu probeer te compileren krijg ik de volgende error
Die fout zit dus in mm1.pas op regel 36. Is wel handig als je die regel (en meer) laat zien. Wordt anders lastig achterhalen wat de fout is.
Zo goed ik weet moet nu na die application.run; end. komen maar dat gaat ook niet werken aangezien ik dan in de knoop kom met mijn procedures maar wat kan ik nu doen om het wel werkend te krijgen de search / de pagina's uit de faq en de help van delphi bieden geen oplossing.
ja, er moet end. achter, anders werkt je programma gewoon niet. In de knoop komen met je procedures?! Welke dan?

We adore chaos because we like to restore order - M.C. Escher


  • Osiris
  • Registratie: Januari 2000
  • Niet online
Ehm, mij is ooit vertelt dat je niet in dat stukke code moet gaan kloten waar je nu wel in bezig bent (Application.Initialize enzow dus)

Wat ik je wel aanraad is het volgende: de Form1.Create-event gebruiken om je Form2 te laten zien dan wel die timer te gebruiken en niet alles daar in dat stukke code te zetten waar je nu mee bezig bent...

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Nee, je kan daar best in klooien. Als je maar weet wat je doet. Voor splash screens is het bijna ook de enige juiste manier om het te doen. Het kan wel zoals jij voorsteld, maar wat als er meerdere forms geautocreate worden? Dan wil je wel de splashscreen zolang in beeld houden als het laden van al die forms duurt...

We adore chaos because we like to restore order - M.C. Escher


  • Osiris
  • Registratie: Januari 2000
  • Niet online
LordLarry schreef op 03 november 2002 @ 13:33:
Nee, je kan daar best in klooien. Als je maar weet wat je doet. Voor splash screens is het bijna ook de enige juiste manier om het te doen. Het kan wel zoals jij voorsteld, maar wat als er meerdere forms geautocreate worden? Dan wil je wel de splashscreen zolang in beeld houden als het laden van al die forms duurt...
True true, maar je zou misschien Always on top op een of andere manier aan kunnen zetten? :) 't is maar een voorstel :)

  • Ruben314199
  • Registratie: Juli 2002
  • Laatst online: 06-04-2025
vervang dit:
while Form2.Timer1.Enabled do
Application.ProcessMessages;

door
Sleep(2000);

scheelt een hoop gedoe.

8)

De gaafste watergekoelde pc ter wereld


  • Relix
  • Registratie: Augustus 2001
  • Laatst online: 19-11-2005

Relix

Aerith Gainsborough - Cetra

idd, en het is ook makkelijk om voordat je de forms toont, wat settings te laden vb formwidth, height, top, left, ...

op je vraag: mm1.pas, is dat je project-unit of een andere unit? het zou idd makkelijker zijn als je even de functie met die lijn (63) in laat zien, anders zal het wat moeilijk zijn...

If you come here... you'll find me... I promise


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ruben314 schreef op 03 november 2002 @ 13:35:
vervang dit:
while Form2.Timer1.Enabled do
Application.ProcessMessages;

door
Sleep(2000);

scheelt een hoop gedoe.

8)
Neeeee!!!! |:(

Sleep is echt een no-no met programmeren in windows! Bijna net zo erg als goto. :p

En daarbij vervangt het ook niet niet wat daar staat....

En daarbovenop is wat er staat ook nog eens niet gewenst...

[ Voor 0% gewijzigd door LordLarry op 03-11-2002 13:40 . Reden: quote ]

We adore chaos because we like to restore order - M.C. Escher


  • Ruben314199
  • Registratie: Juli 2002
  • Laatst online: 06-04-2025
bij mijn projectje ziet het er zo uit:

Splash := TSplash.Create(nil);
Splash.Show;
Splash.Fadein; // fadein heeft een delay

Application.Initialize;

Application.CreateForm(TMainForm, MainForm);

MainForm.Show;
MainForm.Refresh;
Splash.Update;
Splash.BringToFront;

-- [sleep of andere nuttige dingtjes] --

Splash.Fadeout; // is wel erg mooi..... ;) (en heeft een delay)
Splash.Free;

Application.Run;

fade in doet:

// fade in als we in win9x/win2k zitten.
// minimaal 1 seconden slash laten zien
procedure TSplash.Fadein;
var
I: Integer;
Info: TOSVersionInfo;
begin
// Check Windows version
Info.dwOSVersionInfoSize := SizeOf(Info);
GetVersionEx(Info);
If ((Info.dwPlatformId = VER_PLATFORM_WIN32_NT) and (Info.dwMajorVersion >= 5)) then
begin
For I:=0 to 25 do
begin
AlphaBlendValue := (10*I);
Update;
end;
Sleep(1000);
end else begin
AlphaBlendValue := 255;
Update;
Sleep(1000);
end;
end;

Fade out kun je zelf wel verzinnen denk ik :-)

De gaafste watergekoelde pc ter wereld


  • Ruben314199
  • Registratie: Juli 2002
  • Laatst online: 06-04-2025
En daarbovenop is wat er staat ook nog eens niet gewenst...
Wat wil 'ie wel dan ?

De gaafste watergekoelde pc ter wereld


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ik neem aan dat ie _minstens_ 3 seconden zn splashscreen wil laten zien *terwijl* de rest van de applicatie aan het laden is.

Nu wacht ie 3 seconden en doet niets en daarna gaat ie de applicatie laden...

We adore chaos because we like to restore order - M.C. Escher


  • Kogelvis
  • Registratie: Maart 2001
  • Laatst online: 26-08 13:03

Kogelvis

Nu ook met gitaar

Topicstarter
Ok doe ik het even makkelijker

hier is de code van Form1

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
unit mm1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, MPlayer, ToolWin, ActnMan, ActnCtrls, ExtCtrls,
  ActnColorMaps, StdCtrls, jpeg, ComCtrls, Unit2;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    MediaPlayer1: TMediaPlayer;
    XPColorMap1: TXPColorMap;
    Image1: TImage;
    Label3: TLabel;
    Image7: TImage;
    Image8: TImage;
    Image9: TImage;
    Image10: TImage;
    Image11: TImage;
    ProgressBar1: TProgressBar;
    Timer1: TTimer;
    Label2: TLabel;
    Label1: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Exit1Click(Sender: TObject);
    procedure Open1Click(Sender: TObject);
    procedure Image7Click(Sender: TObject);
    procedure Image8Click(Sender: TObject);
    procedure Image9Click(Sender: TObject);
    procedure Image10Click(Sender: TObject);
    procedure Image11Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
begin
    Application.Initialize;
    Form2 := TForm2.Create(Application);
    Form2.Show;
    Form2.Update;

    while Form2.Timer1.Enabled do
      Application.ProcessMessages;

    Application.CreateForm(TForm1, Form1);
    Form2.Hide;
    Form2.Free;
    Application.Run;

procedure TForm1.Exit1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Open1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    MediaPlayer1.FileName := OpenDialog1.FileName;
    MediaPlayer1.Open;
    Label3.Caption := ExtractFileName(MediaPlayer1.Filename);
  end;
end;

procedure TForm1.Image7Click(Sender: TObject);
begin
  if Label3.Caption = 'None' then
  begin
    ShowMessage('Please open a media file first!');
  end else
  begin
    MediaPlayer1.Previous;
  end;
end;

procedure TForm1.Image8Click(Sender: TObject);
begin
  if Label3.Caption = 'None' then
  begin
    ShowMessage('Please open a media file first!');
  end else
  begin
    MediaPlayer1.Rewind;
    MediaPlayer1.Play;
    MediaPlayer1.TimeFormat := tfMilliseconds;
    ProgressBar1.Max := MediaPlayer1.Length;
  end;
end;

procedure TForm1.Image9Click(Sender: TObject);
begin
  if Label3.Caption = 'None' then
  begin
    ShowMessage('Please open a media file first!');
  end else
  begin
    MediaPlayer1.Pause;
  end;
end;

procedure TForm1.Image10Click(Sender: TObject);
begin
  if Label3.Caption = 'None' then
  begin
    ShowMessage('Please open a media file first!');
  end else
  begin
    MediaPlayer1.Stop;
  end;
end;

procedure TForm1.Image11Click(Sender: TObject);
begin
  if Label3.Caption = 'None' then
  begin
    ShowMessage('Please open a media file first!');
  end else
  begin
    MediaPlayer1.Next;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Label3.Caption = 'None' then
  ProgressBar1.Enabled := False
  else
  ProgressBar1.Position := MediaPlayer1.Position;
  if Label1.Font.Color = clBackground then
    Label1.Font.Color := clSilver
  else
    Label1.Font.Color := clBackground;
end;

end.


waarbij

code:
1
procedure TForm1.Exit1Click(Sender: TObject);

dit regel 63 is.

edit

Wat mijn doel is is gewoon +/- 3 seconden mn splashscreen te laten zien en dan pas de hoofdapplicatie te openen het programma hoeft verder niks in te laden voor de tijd daarvoor had ik deze oplossing gevonden alleen krijg ik hem niet gecompileerd aangezien hij blijft hangen op regel 63 hij probeert waarschijnlijk die end. te vinden alleen die staat pas aan het eind en die procedures zijn wel makkelijk in de applicatie.

<Jeroen> Wirf: vrouwen versieren kan je gewoon in het OSI model proppen hoor :P
I am dyslexic of Borg prepare to have your ass laminated
Real Programmers always confuse Christmas and Halloween because oct31 = dec25


  • Ruben314199
  • Registratie: Juli 2002
  • Laatst online: 06-04-2025
is het dan niet makkelijker om gewoon met now() de verstreken tijd te checken i.p.v. met een timer ?

zoiets als

begin:=now;
...laat je splash zien
...
doe je leuke dingtjes doen en zo
...
while (now-begin<roepmaareentijd) do application.processmessages;
splash.free;

-----
die doe je in je project-source. Die krijg je door project -> view project source (uit m'n hoofd)

[ Voor 0% gewijzigd door Ruben314199 op 03-11-2002 14:05 . Reden: projectsource ]

De gaafste watergekoelde pc ter wereld


  • Kogelvis
  • Registratie: Maart 2001
  • Laatst online: 26-08 13:03

Kogelvis

Nu ook met gitaar

Topicstarter
nou ik heb het al opgelost de code is als volgt het moest dus aan het eind staan ipv aan het begin

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
unit mm1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, MPlayer, ToolWin, ActnMan, ActnCtrls, ExtCtrls,
  ActnColorMaps, StdCtrls, jpeg, ComCtrls, Unit2;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    MediaPlayer1: TMediaPlayer;
    XPColorMap1: TXPColorMap;
    Image1: TImage;
    Label3: TLabel;
    Image7: TImage;
    Image8: TImage;
    Image9: TImage;
    Image10: TImage;
    Image11: TImage;
    ProgressBar1: TProgressBar;
    Timer1: TTimer;
    Label2: TLabel;
    Label1: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    procedure Exit1Click(Sender: TObject);
    procedure Open1Click(Sender: TObject);
    procedure Image7Click(Sender: TObject);
    procedure Image8Click(Sender: TObject);
    procedure Image9Click(Sender: TObject);
    procedure Image10Click(Sender: TObject);
    procedure Image11Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Exit1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.Open1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
  begin
    MediaPlayer1.FileName := OpenDialog1.FileName;
    MediaPlayer1.Open;
    Label3.Caption := ExtractFileName(MediaPlayer1.Filename);
  end;
end;

procedure TForm1.Image7Click(Sender: TObject);
begin
  if Label3.Caption = 'None' then
  begin
    ShowMessage('Please open a media file first!');
  end else
  begin
    MediaPlayer1.Previous;
  end;
end;

procedure TForm1.Image8Click(Sender: TObject);
begin
  if Label3.Caption = 'None' then
  begin
    ShowMessage('Please open a media file first!');
  end else
  begin
    MediaPlayer1.Rewind;
    MediaPlayer1.Play;
    MediaPlayer1.TimeFormat := tfMilliseconds;
    ProgressBar1.Max := MediaPlayer1.Length;
  end;
end;

procedure TForm1.Image9Click(Sender: TObject);
begin
  if Label3.Caption = 'None' then
  begin
    ShowMessage('Please open a media file first!');
  end else
  begin
    MediaPlayer1.Pause;
  end;
end;

procedure TForm1.Image10Click(Sender: TObject);
begin
  if Label3.Caption = 'None' then
  begin
    ShowMessage('Please open a media file first!');
  end else
  begin
    MediaPlayer1.Stop;
  end;
end;

procedure TForm1.Image11Click(Sender: TObject);
begin
  if Label3.Caption = 'None' then
  begin
    ShowMessage('Please open a media file first!');
  end else
  begin
    MediaPlayer1.Next;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Label3.Caption = 'None' then
  ProgressBar1.Enabled := False
  else
  ProgressBar1.Position := MediaPlayer1.Position;
  if Label1.Font.Color = clBackground then
    Label1.Font.Color := clSilver
  else
    Label1.Font.Color := clBackground;
end;

begin
    Application.Initialize;
    Form2 := TForm2.Create(Application);
    Form2.Show;
    Form2.Update;

    while Form2.Timer1.Enabled do
      Application.ProcessMessages;

    Application.CreateForm(TForm1, Form1);
    Form2.Hide;
    Form2.Free;
    Application.Run;
end.


[edit]
Beta 2 is nu gecompileerd en de setup gedownload de geinterreseerde mensen kunnen hem downloaden door op de volgende link te klikken
CyberAudio

en iedereen bedankt voor de hulp.

[ Voor 0% gewijzigd door Kogelvis op 03-11-2002 14:16 . Reden: Beta 2 downloadlink toegevoegd ]

<Jeroen> Wirf: vrouwen versieren kan je gewoon in het OSI model proppen hoor :P
I am dyslexic of Borg prepare to have your ass laminated
Real Programmers always confuse Christmas and Halloween because oct31 = dec25


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Kogelvis schreef op 03 november 2002 @ 13:58:
Ok doe ik het even makkelijker

hier is de code van Form1

....

Wat mijn doel is is gewoon +/- 3 seconden mn splashscreen te laten zien en dan pas de hoofdapplicatie te openen het programma hoeft verder niks in te laden voor de tijd daarvoor had ik deze oplossing gevonden alleen krijg ik hem niet gecompileerd aangezien hij blijft hangen op regel 63 hij probeert waarschijnlijk die end. te vinden alleen die staat pas aan het eind en die procedures zijn wel makkelijk in de applicatie.
Ermmm....niet veel pascal ervaring nog zeker? :p

Je
code:
1
2
begin
end.

Moet altijd onderaan de unit staan.

Maar je maakt nog een veel grotere fout. Die code die jij daar tussen wil zetten staat echt totaal op de verkeerde plaats. Duidelijk een geval van copy/paste en niet weten waar de klepel hangt :p
Het was een voorbeeld hoe je code aan te passen in het project bestand (Project1.dpr ofzo). Die code zet je echt nooit in een andere unit. Het is de opstart code van je applicatie en die hoord alleen in de dpr...

Als je 3 seconden niets wil doen en dan pas je app laden kan je het idd beter zoals eerder al gemeld gewoon in de OnShow of OnCreate van je mainform douwen. Maar het lijkt mij wat vreemd. Ik heb liever dat de applicatie alvast geladen wordt in die 3 seconden...

We adore chaos because we like to restore order - M.C. Escher


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Kogelvis schreef op 03 november 2002 @ 14:05:
nou ik heb het al opgelost de code is als volgt het moest dus aan het eind staan ipv aan het begin
Dat zeg ik dus :p

Maaruh, zoals ik net hierboven gemeld heb is het echt totaal fout! Vind het bijzonder dat het uberhaupt werkt. Kijk gewoon eens naar wat Ruben314 over je project file en dan zie je vast wel wat je fout is :)

We adore chaos because we like to restore order - M.C. Escher


  • Kogelvis
  • Registratie: Maart 2001
  • Laatst online: 26-08 13:03

Kogelvis

Nu ook met gitaar

Topicstarter
LordLarry:

idd nog geen echte pascal ervaring ben beginner.
Vind het bijzonder dat het uberhaupt werkt.
Dan vind ik het toch bijzonder knap dat het precies zo in een officieel borland boek vermeld staat. dan zal dit toch wel een goeie manier zijn.

<Jeroen> Wirf: vrouwen versieren kan je gewoon in het OSI model proppen hoor :P
I am dyslexic of Borg prepare to have your ass laminated
Real Programmers always confuse Christmas and Halloween because oct31 = dec25


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Kogelvis schreef op 03 november 2002 @ 18:08:
Dan vind ik het toch bijzonder knap dat het precies zo in een officieel borland boek vermeld staat. dan zal dit toch wel een goeie manier zijn.
Dan ben ik bang dat je het verkeerd begrepen hebt wat daar staat... :)

Je moet het natuurlijk zelf weten, maar kijk gewoon eens in je dpr file en vertel me dan nog eens dat je het goed begrepen hebt.

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1