Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Form.Hide Problem [noch nicht gelöst]


blackbirdXXX - Mi 30.07.03 17:15
Titel: Form.Hide Problem [noch nicht gelöst]
Ich habe 4 gleich große Formulare. Wenn ich zum nächsten "blättern" will mache ich das mit

Delphi-Quelltext
1:
2:
Form1.Hide;
Form2.Show;


Seltsamerweise spuckt das Programm beim blättern vom 3. Formular auf das 4. Formular eine Fehlermeldung aus:

Zitat:
Debugger Excepion Notification
Project wizzard.exe raised exception class EInvalidOperation with message 'Cannot change Visible in OnShow or OnHide'. Process stopped. Use Step or Run to continue.

[ OK ] [ Help ]

[ ] View CPU Windows


Terra23 - Mi 30.07.03 17:42

Warum machst du das eigentlich nicht mit ShowModal? Soweit ich weiß, kann man dann nicht zum vorherigen Fenster zurück, ohne das aktive zu schließen. :nixweiss:


blackbirdXXX - Mi 30.07.03 20:08

Aber ich will es ja verstecken damit ich zum nächsten kommen. Beispiel Installshield


StefanH - Do 31.07.03 13:45

Hallo!

Das hatte ich auch schon :wink:
Du hast irgend eine Schleife drin (also Zeigen - Verstecken ...), oder (wies bei mir war) du rufst es auf bevor es das Formular gibt.

Stefan


matze - Do 31.07.03 14:37

du darfst das nicht in einem onformcreate aufrufen, denn da sind möglicherweise die forms die du zeigen und verstecken wilst noch nicht created !


blackbirdXXX - Sa 02.08.03 06:54

Es gibt eine Schleife. Die zählt die Dateien durch die kopiert werden und vergrößert einen Balken.
Am Ende der Schleife steht:

Delphi-Quelltext
1:
2:
3:
4:
sleep(1000);
Application.ProcessMessages;
step4.Hide;
exitform.Show;

Die Anweisung steht in der Form.Activate
Allerdings passiert das auch in der Form.Show nur das ich dort dann das Fenster nicht sehe und dann steht dort. Einfach:

Cannot change Visible in OnShow or OnHide.


Vielleicht liegt der Fehler da drinnen. Aber ich kann ihn nicht entdecken:


Delphi-Quelltext
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:
procedure Tstep4.FormShow(Sender: TObject);
var Quelldatei, Zieldatei, pfad, zv: string;
    i, max, fehler: Integer;
begin
left := form1.width div 2 - (width div 2);
 top := (form1.Height div 3) * 2;
 Application.ProcessMessages;
 pfad := ExtractFilePath(Application.ExeName);
 CreateDirectory(PChar(step2.Edit1.Text + '/'), nil );
 zv := step2.Edit1.Text + '/';

 //Kopiervorgang
  //Le.exe
   CopyFile(PChar(pfad + 'LE.ex_'), PChar(zv + 'LE.exe'), true);
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
  //help.chm
   CopyFile(PChar(pfad + 'help.ch_'), PChar(zv + 'help.chm'), true);
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
   dl.Lines.SaveToFile(zv + 'template.htm');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
  //settings
   CreateDirectory(PChar(zv + 'settings/'), nil );
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
  //Samples
   CreateDirectory(PChar(zv + 'samples/'), nil );
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
  //buttons.ini
   dl.Lines.Clear;
   dl.Lines.SaveToFile(zv + 'settings/buttons.ini');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
  //colors.ini
   dl.Lines.Clear;
   dl.Lines.SaveToFile(zv + 'settings/colors.ini');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
  //csselement.ini
   dl.Lines.SaveToFile(zv + 'settings/csselement.ini');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
  //csstag.ini
   dl.Lines.Clear;
   csstag.Lines.SaveToFile(zv + 'settings/csstag.ini');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
  //csstag.ini
   dl.Lines.Clear;
   dl.Lines.SaveToFile(zv + 'settings/fonts.ini');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
  //settings.ini
   dl.Lines.SaveToFile(zv + 'settings/settings.ini');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
  //Uninstall
   CopyFile(PChar(pfad + 'uninstall.ex_'), PChar(zv + 'uninstall.exe'), true);
   Application.ProcessMessages;
  //Samples
   dl.Lines.Clear;
   dl.Lines.SaveToFile(zv + 'samples/design1.css');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
   dl.Lines.SaveToFile(zv + 'samples/design2.css');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
   dl.Lines.SaveToFile(zv + 'samples/design3.css');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
   dl.Lines.SaveToFile(zv + 'samples/design4.css');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
   dl.Lines.SaveToFile(zv + 'samples/design5.css');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
   dl.Lines.SaveToFile(zv + 'samples/design6.css');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
   dl.Lines.SaveToFile(zv + 'samples/design7.css');
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;
   dl.Lines.SaveToFile(zv + 'samples/design8.css');
  // Link
   CopyFile(PChar(pfad + 'indexfile.da_'), PChar(zv + 'visit www.active-4.com.url'), true);
   fortschritt.Width := fortschritt.Width + 10;
   Application.ProcessMessages;

  //Startmenü Verknüpfung
  CreateFolder(SpecialDirectory(CSIDL_Programs)+'Liquid Edit');
  if step2.CheckBox2.Checked then CreateLink(zv + 'LE.exe',SpecialDirectory(CSIDL_Programs)+'Liquid Edit\Liquid Edit.lnk','Liquid Edit');
  CreateLink(zv + 'Uninstall.exe',SpecialDirectory(CSIDL_Programs)+'Liquid Edit\Deinstallation.lnk','Deinstallation');
  CreateLink(zv + 'visit www.active-4.com.url',SpecialDirectory(CSIDL_Programs)+'Liquid Edit\active-4.com.lnk','active-4.com');
  //Desktop Verknüpfung
   if step2.CheckBox1.Checked then
    begin
     CreateLink(zv + 'LE.exe',SpecialDirectory(CSIDL_Desktopdirectory)+'Liquid Edit.lnk','Liquid Edit');
    end;

   speedbutton3.Visible := false;
   fortschritt.Width := 200;
   Application.ProcessMessages;

  //release Datei
  dl.Lines.Clear;
  dl.Lines.Add('//Liquid Edit Setup File');
  dl.Lines.Add(step2.Edit1.Text);
  dl.Lines.Add(SpecialDirectory(CSIDL_Desktopdirectory)+'Liquid Edit.lnk');
  dl.Lines.Add(SpecialDirectory(CSIDL_Programs)+'Liquid Edit');
  dl.Lines.SaveToFile('C:/liquidedit.log');

   sleep(1000);
   Application.ProcessMessages;
   step4.Hide;
   exitform.Show;
end;



PS.: Ich habe den Code etwas abgekürzt. Z.B.: Werden die Lienen der dl mit allen möglichen Werten gefüllt.


StefanH - Sa 02.08.03 11:15

Du darfst dass step4.Hide nicht aufrufen :?!?:


blackbirdXXX - Sa 02.08.03 19:54

Aber bei den anderen Formularen geht es auch!


Tryer - Sa 02.08.03 21:19

In TForm.OnShow gehts halt nicht, die Fehlermeldung ist wohl eindeutig.

Was spricht gegen eine Methode "Execute" wie man sie von diversen Dialogen kennt?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TStep4.Execute;
begin
  Show;
 
  // hier jetzt das CopyFile etc.

  Hide;
end;

Statt dann Step4.Show aufzurufen benutzt Du Step4.Execute, das hört sich sogar besser an :wink:

MfG,
Tryer


Raphael O. - Sa 02.08.03 21:38

du könntest auch im
exitformOnShow-Ereignis
step4.hide aufrufen ;) :?


Aya - Sa 02.08.03 21:58

Hi,

auch wenn das jetzt mal garnix mit dem Thema zu tun hat direkt.. *g*

Wenn ich das richtig verstehe möchtest du á la InstallShield mehrere Forms hintereinander packen, durch die man durchblättern kann, ja???

Dafür würde ich dir allerdings Frames emfephlen, nicht Forms... ist wesentlich leichter zu verwalten, und genau für diesen Zweck gemacht (Auch das InstallShield benutzt Frames ;) )

Au'revoir,
Aya~


blackbirdXXX - So 03.08.03 16:02

Stimmt. Frames wären besser nur leider verwende ich in diesem Fall Delphi3 Pro und da gibt es keine Frames.

Aber ich habe es auch mit

Delphi-Quelltext
1:
2:
3:
4:
procedure Texitform.FormActivate(Sender: TObject);
begin
 step4.Close;
end;

probiert aber der Fehler ist der selbe.


StefanH - So 17.08.03 20:23

du darfst deine Form nicht schließen, wenn sie gerade gezeigt wird...


barfuesser - Mo 18.08.03 09:25

Hi,
blackbirdXXX hat folgendes geschrieben:
Stimmt. Frames wären besser nur leider verwende ich in diesem Fall Delphi3 Pro und da gibt es keine Frames.

Dann nimm doch Panels, die Du über einander legst.

barfuesser