Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Delphi erstellt einfach die formulare...


Ebil - So 24.08.08 16:00
Titel: Delphi erstellt einfach die formulare...
Hi leute,
Im Project quelltext stehen ja die formulare die beim programmstart erstellt werden:


Delphi-Quelltext
1:
2:
3:
4:
5:
  Application.CreateForm(TfrmMain, frmMain);
  Application.CreateForm(TfrmShortcut, frmShortcut);
  Application.CreateForm(TfrmOpt, frmOpt);
  Application.CreateForm(TfrmAbout, frmAbout);
  Application.CreateForm(TfrmStartup, frmStartup);


Nun hab ich ein paar rausgenommen da ich diese erst nach einem klick auf ein button erstellen will, was natürlich kein problem sein sollte.
Gesag getan, was passiert?
Delphi erstellt die formulare trozdem beim programmstart.
Was nun? hab schon versucht die formulare zu verbergen (frm.hide, frm.visible := false), funktioniert auch nicht im FormCreate...
Langsam weiss ich nichtmehr woran es liegen könnte, theoretishc sollte es ja klappen.
Die mainform kann auch nicht geändert werden (frmMain), auch wenn sie als letzer eintrag der zu erstellenden forms erscheind, Application.MainForm gibt immer frmMain aus (nicht vom namen irritieren lassen, das war mal die mainform, soll sich nun aber ändern).

Bin ein bisschen verzweifelt :D

Ebil


Radler - So 24.08.08 16:19
Titel: Re:Delphi erstellt einfach die formulare...
Hast du die zusätzlichen Formulare nicht über Projekt > Optionen > Formulare... in die Liste der verfügbaren Formulare verschoben?
Dann werden die auch nicht beim Start automatisch erzeugt.

Viele Grüße,
Günter


Ebil - So 24.08.08 17:46

Wusste ich nichts von, hab ich nun aber gemacht, trozdem gibts probleme.
Es kam ein fehler (dublicate ressource), also hab ich die deklaration im Project quelltext entfernt


Delphi-Quelltext
1:
mMain in 'mMain.pas' {frmMain}//Das weggemacht(auch bei allen andern)                    


Wenn ich dann starte, tauchen trozdem alle forumlare auf.
Und wenn ich dann in Optionen unter formulare schau, steht dort nur das hauptformular mStartup.

Ebil


Xentar - So 24.08.08 17:52

Du weißt schon, was du da tust, oder?
Da ich von "NEIN" ausgehe, helf ich dir mal:
Die Zeile, die du gerade gepastet hast, gibt nur an, dass die Datei zum Projekt gehört! Die hat nichts damit zu tun, ob das Formular beim Starten angezeigt wird, oder nicht.
Und der Kommentar, der dahinter steht.. da bin ich mir grad nicht sicher, ob der für Delphi wichtig ist.
Aber normalerweise sollte man nicht händisch in der .dpr Datei rumfingern, wenn man nicht genau weiß, was man da macht!

Mein Vorschlag: Leg das Projekt neu an, bind alle Units wieder ein (Projekt -> Datei hinzufügen) und änder die Formulare über die Projektoptionen.


Boldar - So 24.08.08 18:28

Diese Zeile steht ja auch nicht in der .dpr!


user profile iconEbil hat folgendes geschrieben:

Es kam ein fehler (dublicate ressource), also hab ich die deklaration im Project quelltext entfernt


Xentar - So 24.08.08 19:16

Ja, und die .dpr Datei ist was? Richtig, die Projektdatei oder auch Projektquelltext.

Wenn du deine Änderungen mal rückgängig machst, und uns die genaue Fehlermeldung nennst (duplicate resource), können wir auch noch versuchen, daran rumzudoktorn.
Aber die Projektdatei neu anzulegen wär sicherlich einfacher.


Ebil - So 24.08.08 20:17

Das project ist schon verdammt groß mittlerweile, und ich weiss zum teil was ich mach, und ohne etwas auszuprobieren, lernt man nix dazu.
Die datei ist schon im urzustand, ich sagte auch nicht das diese zeile etwas mit dem anzeigen oder nichtanzeigen zu tun hat, nur das falls ich diese zeile entferne der dublicate ressource error weg geht.
Wobei ich nun merkte das es sich um eine andere zeile handelt, nun startes das prog ohne probleme, trozdem werden alle formulare erstellt, obwohl sie in Verfügbare formulare drin sind und im Project quelltext(und wer öffnet da bitte dir .dpr?), diese nicht erstellt werden, sondern erst nach einem click auf einem button erstellt werden sollten.
Sind also eigentlich wieder am anfang :D

Ebil


Ebil - Mo 25.08.08 21:05

Ich bin noch weiter am probieren und nun so weit, das er die formulare nichtmehr automatisch erstellt, aber etwas ist extrem komisch:
Im neuen hauptformular erstellt er falls der code für die neuen formulare vorhanden ist, diese trozdem automatisch, obwohl diese in einem BUTTON CLICK ereignis stehen.


Delphi-Quelltext
1:
2:
3:
4:
procedure TfrmStartup.btStartClick(Sender: TObject);
begin
  Application.CreateForm(TfrmMob, frmMob);
end;


Das zb wird einfach erstellt, in einem Click ereignis, direkt beim start.
Wie geht sowas? Da wird nix geklickt...

Ebil


Xentar - Mo 25.08.08 23:17

Händisch erstellt man Formulare eigentlich so, wie normale Komponenten auch:

Delphi-Quelltext
1:
frmMob := TfrmMob.create(self);                    


Woran lags denn, dass die Formulare vorher trotzdem noch automatisch erstellt wurden? vielleicht hat mal jemand das gleiche Problem.


Ebil - Di 26.08.08 19:44

Wie ichs genau gelöst hab ka, einfach bisschen rumgespielt (hatte ja schona lles durch) iwann gings dann.

Auch mit deinem code (was eig. nicht anders als meiner ist), wirds automatisch erstellt, ohne das man auf den button klickt.

Ebil


Xentar - Di 26.08.08 21:14

Setz da mal nen Haltepunkt, und schau dir dann den Aufruf-Stack an, aus welcher Prozedur der da reinspringt..


Ebil - Di 26.08.08 22:04

Was genau soll ich denn nachschauen?
Der code von

procedure TfrmStartup.btStartClick(Sender: TObject);

Wird aufjedenfall ausgeführt, was ich schon ziemlich komisch find...


Ebil


Xentar - Di 26.08.08 22:13

Hab ich doch geschrieben, den Aufruf-Stack.
Ansicht -> Debug-Fenster -> Aufruf-Stack.


Ebil - Di 26.08.08 22:54

Naja kenn mich nich so mit debuggen aus (halt nur grundlagen, auch wenn ich tuts gelesen hab, tu ich mich damit imma schwer).
Da steht einiges:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
mStartup.TfrmStartup.btStartClick($144DA40)
:20158aaf TCustomForm.DoCreate + $37
:20158707 TCustomForm.AfterConstruction + $17
:201586dd TCustomForm.Create + $179
:20162785 TApplication.CreateForm + $71
Projekt.Projekt
:7c816ff7 kernel32.RegisterWaitForInputIdle + 0x49


Xentar - Di 26.08.08 23:07

Überprüf mal bitte, was du dem Ereignis OnCreate des Formulars zugewiesen hast....


Ebil - Mi 27.08.08 21:55

Nichts von bedeutung (was mir sicher auch aufgefallen wäre... :D),
Hab alles da auskommentiert, trozdem erscheinen alle fenster...
Vllt sollte ich mir langsam ne andere lösung suchen ^^,


uko - Do 28.08.08 09:23

Such doch mal das Projekt durch, ob nicht an irgendeiner Stelle btStartCklick per Hand aufgerufen wird! Ich vermute jetzt mal, daß dies entweder im OnCreate des Hauptformulars (zumindest was Delphi als Hauptformular hält!) passiert oder Du läßt TFrmStartup automatisch erzeugen und dort ist es im OnCreate oder einem überschriebenen Constructor drinnen.

Grüße,
Uli


Ebil - Do 28.08.08 16:26

Hab ich ja schon gemacht, alles durchgeschaut, und war mir so oder so sicher das ich es nicht von hand aufrufe ( es ist immerhin der startknopf, es gibt ja keinen grund den ein 2. mal zu drücken).
Deswegen ist mir das ganze unerklärlich...

Ebil


elundril - Do 28.08.08 16:28

kannst du mal das ganze projekt gezippt hochladen?

lg elundril


Ebil - Do 28.08.08 16:57

Ich sagte das das projekt schon relativ groß ist, und daran arbeite ich schon einige monate, sowas will ich wirklich nirgendwo releasen.
Muss ich wohl allein irgendwie nen anderen weg finden.

Ebil


elundril - Do 28.08.08 17:02

duch in allen units nach "create" und "show". dann solltest du die spur irgendwann finden.

lg elundril


Ebil - Fr 29.08.08 17:01

Oha ich habs,
Das es nicht im show/create/resize und was sonst noch so am anfang ausgelöst wird war, dacht ich mir ja schon.

nach langem, laaaaaaaaa(denkt euch nen paar "a"'s hinzu)em rumprobieren

Ich hab einfach mal die button procedure gelöscht, dann gab es fehler im Application.Run, und ich hab weitergesucht, gesehn das das Click ereignis noch ausgelöst wird, auch gelöscht... neues erstellt (so wie sonst halt auch immer...), und nu gings.
Keine ahnung worans lag, oder wie delphi intern was vermischt hat, nun gehts.
Danke trozdem für eure mühe.

Ebil