Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Anfängerfrage: Form über Button schließen und neues öffnen


Morpheus1572 - So 15.03.09 14:04
Titel: Anfängerfrage: Form über Button schließen und neues öffnen
Moin,

ich möchte mittels eines Buttons das aktive Form schließen und ein anderes Form öffnen.

ich dachte mir, ich "verknüpfe" den Button mit der Procedure FormClose(Sender: TObject; var Action: TCloseAction), daran scheitere ich jedoch schon, weil mir nicht klar ist, wie ich diese Procedure anspreche.

und wie kann ich dann das andere form öffnen?

Gruß Morph.


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am So 15.03.2009 um 13:34


jaenicke - So 15.03.09 14:19

user profile iconMorpheus1572 hat folgendes geschrieben Zum zitierten Posting springen:
ich dachte mir, ich "verknüpfe" den Button mit der Procedure FormClose(Sender: TObject; var Action: TCloseAction), daran scheitere ich jedoch schon, weil mir nicht klar ist, wie ich diese Procedure anspreche.

Delphi-Quelltext
1:
Close;                    
Dein FormClose ist die Ereignisbehandlungsroutine, in der du Aktionen durchführen kannst als Reaktion auf das Schließen des Fensters.

Wenn es sich um das Hauptfenster handelt, schließt du damit das gesamte Programm.

Es gibt auch Hide und Show / ShowModal.

user profile iconMorpheus1572 hat folgendes geschrieben Zum zitierten Posting springen:
und wie kann ich dann das andere form öffnen?

Delphi-Quelltext
1:
2:
3:
4:
FormX.Show;
//oder 
FormX.ShowModal;
// je nachdem was du möchtest


freak4fun - So 15.03.09 14:21

Genau. Kannst du kurz darlegen, warum du das Hauptformular scjließen willst?


ffgorcky - So 15.03.09 15:25

Hallo Morpheus,

also erst mal würde ich auf den Button auf dem Formular doppelklicken,
dadurch erscheint dann die Prozedur ButtonOnClick(Sender: TObject).
Dort brauchst Du dann nur noch "Form1.Close();"(ohne die Hochkommas) eingeben um das Fenster - also in dem Fall sogar das Programm - in der Laufzeit zu schließen/beenden.

Aber - wie schon von den anderen aufgeführt - wenn Du das Hauptfenster schließt, beendest Du die ganze Anwendung!
Also würde ich empfehlen, dass Du dann lieber zwei Panels übereinander anlegst (worauf Du Deine Komponenten platzierst) und dann das obere je nach Anforderung (un-)sichtbar machst.


jaenicke - So 15.03.09 15:27

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Dort brauchst Du dann nur noch "Form1.Close(Sender);" (ohne die Hochkommas) eingeben
Close hat keine Parameter und im Formular selbst Form1. zu benutzen ist keine gute Idee, weil sich das dann auf die Instanz in der Variable statt immer auf die eigene Instanz bezieht...


Morpheus1572 - So 15.03.09 16:28

okay. ich habe mich wohl falsch ausgedrückt.

ich will nicht das form1 schließen!!!!!

ich möchte mittels eines buttons (aus dem aktuellen kindfensterder) mich automatisch in ein anderes kindfenster hineinbeamen. das aktuelle kindfenster (form2) soll sich also ersatzlos schließen und das andere Kindfenster (form3) öffnen..

Morph.

@jaenicke: darf ich dich speziell noch mal bitten auf folgenden link zu sehen? http://www.delphi-forum.de/viewtopic.php?p=553901#553901


jaenicke - So 15.03.09 16:56


Delphi-Quelltext
1:
2:
3:
Form2.Close;
Form3 := TForm3.Create(Application.MainForm);
Form3.Show;
Und in OnClose kannst du mit Action := caFree; das Fenster auch freigeben beim Schließen.


Morpheus1572 - So 15.03.09 17:15

funzt soweit nur...

wenn ich das so umsetze geht er auch in das neue form. er macht das form.create korrekt und auch geht auch in das form.show. dort rufe ich eine procedure zum füllen von dbgrids auf. davor habe ich zur kontrolle - wie weit er geht - ein showmessage. das zeigt er mir noch an. aber sobald ich ok drücke bekomme ich nen abstrakten fehler.

was mache ich falsch?


jaenicke - So 15.03.09 17:49

Dann erstellst du eine Instanz einer Klasse, die abstrakte (nicht implementierte) Teile (Prozeduren, Funktionen) enthält. Ein Beispiel wäre, wenn du TStrings direkt benutzt statt TStringList.

Ohne mehr Code kann ich aber natürlich nichts genaueres sagen.


Morpheus1572 - So 15.03.09 18:12

oki.

hiermit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure THauptformular.Tourenplanung(Sender: TObject);
begin
  Panel1.Visible:=false;       <--- ausblenden weil teilweise sichtbar wenn child drüber liegt, warum weis ich nicht
  bearbeiten1.Enabled:=true;   <--- Menüeintrag wird wieder sichtbar gemacht (noch alte version)
  Tourenplan.Enabled:=false;   <--- Menüeintrag wird ausgegraut (noch alte verion)
  TForm8.Create(Self);         <--- ich rufe das KindFenster Form8 auf
end;

rufe ich vom Form8 auf.

in Form8 existiert ein button3, der wie gesagt das Form8 schließen soll und Form3 öffnen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm8.Button3Click(Sender: TObject);
begin
  Close;                       <--- schließt wohl das Form8
Form3 := TForm3.Create(Application.MainForm);    <--- ist von dir übernommen
Form3.Show;                                      <--- ist von dir übernommen
end;


in der OnClose-Geschichte von Form8 steht folgendes:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm8.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;            <--- Schließt das Form und gibt es wieder frei
  Hauptformular.Panel1.Visible:=true;        <--- macht mir das Panel1 des Hauptformulares wider sichtbar
  Hauptformular.Tourenplan.Enabled:=True;    <--- aktiviert wieder den Menüpunkt für das Form8
end;


wenn ich das genau so lasse bekomme ich mittlerweile keine fehlermeldung mehr (nachdem ich das ShowMessage entfernt habe) ABER:
ich sehe mein Haupformular und sonst nichts. darüber hinaus habe ich nun noch in der grauen leiste unter der eigentlichen Menüleiste auch wieder die zeichen "Minimieren" "Maximieren" und das x. demnach gehe ich davon aus, dass ein kindfenster aufgebaut ist. aber ich sehe es nicht...


Morpheus1572 - So 15.03.09 18:18

okay okay okay.

je öfter ich meinen text von eben durchgelesen habe, hat es bei mir geleuchtet!!!

es lag an der art und weise, wann ich mein panel1 ausblende. ich habe es immer nur beim verlassen vom Hauptformular unsichtbar gemacht.

den befehl einfach ins formcreat des nächsten forms verschoben und schon wird alles sichtbar... :oops: :roll: :roll: :oops:


...bleibt nur noch das andere problem jaenicke.... :lol: