Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zwischen verschidenen Formularen wechseln (https://www.delphipraxis.net/107380-zwischen-verschidenen-formularen-wechseln.html)

olfrygt 26. Jan 2008 19:35


Zwischen verschidenen Formularen wechseln
 
Hallo,

Ich erstelle gerade ein Programm, welches aus mehreren Fenstern besteht, wobei immer nur eins sichtbar sein soll.
Alle Formulare sind aufgereiht. Sozusagen durchnummeriert.
Man kann immer von einem Formular zum nächsten oder eins zurück. (außer natürlich beim ersten und letzten Fenster des Programms)

Im Moment habe ich nur die ersten beiden Formulare mit den zugehörigen Units.
Beim klick auf "Weiter" im ersten Fenster wird folgendes aufgerufen:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
 Profilfaecher.Form2.Visible:=true;
 Profilfaecher.Form2.Enabled:=true;
 Form1.Visible:=false;
 Form1.Enabled:=false;
end;
D.h. ich mache das zweite Fenster aktiv und sichtbar sowie das erste inaktiv und unsichtbar. Das funktioniert auch aber:
Ich habe, um die Eigenschaften Visible und Enabled vom zweiten Formular zu ändern einfach den Namen der 2. Unit (Profilfaecher) unter "uses" der 1. Unit eingetragen.
Da ich aber auch das erste Fenster auch aus dem zweiten heraus schließen möchte, habe ich auch den Namen der 1. Unit in die uses-Spalte der 2. Unit geschrieben. Aber das funktioniert nicht:

Zitat:

[Pascal Fataler Fehler] Profilfaecher.pas(7): F2047 Zirkuläre Unit-Referenz auf 'Profilfaecher'
Die Katze beißt sich also irgendwie in den Schwanz ^^

Wie kann ich am besten Unit 1 beibringen, was Form 2 ist (ohne das ich immer Profilfaecher davor schreiben muss) und wie kann ich auch aus Unit 2 auf die Funktionen und Eigenschaften von Form1 zugreifen, ohne dass eine
Zitat:

Zirkuläre Unit-Referenz
eintritt?

MfG

Kroko1999 26. Jan 2008 19:38

Re: Zwischen verschidenen Formularen wechseln
 
trage es ab der 2.Unit unter implementation in die Uses-Klausel ein!

olfrygt 26. Jan 2008 19:44

Re: Zwischen verschidenen Formularen wechseln
 
Was meinst du genau mit "es"?

Edit: hab es rausgefunden... du meinst die einzelnen Units. Funzt perfekt. Danke

Nuclear-Ping 26. Jan 2008 19:45

Re: Zwischen verschidenen Formularen wechseln
 
Eine Methode:

- Du brauchst eine Hauptform (kannst du auf Visible := FALSE setzen), die all deine anderen Forms per uses unter implementation einbindet.
- In der Hauptform legst du unter public ein Array[0..AnzahlAnForms] of TForm an.
- Du machst in FormCreate eine Schleife, die jede Form als Member des Arrays erzeugt:
Delphi-Quellcode:
for i := Low(FormArray) to High(FormArray) do
  begin
    case i of
      0: FormArray[i] := TFormIrgendwas.Create (Self);
      1: FormArray[i] := TFormNochwas.Create (Self);
      ...
    end;
    FormArray[i].Tag := i;
  end;
- Jede Form wird von deinem Hauptform unter implementation per uses eingebunden
- Nun kannst du auf jeder Form sowas in der Art machen:
Delphi-Quellcode:
procedure TFormIrgendwas.ButtonPrevClick(Sender: TObject);
begin
  Hauptform.FormArray[Self.Tag].Visible := FALSE;
  // Du mußt hier noch auf Unterlauf (< 0) prüfen
  Hauptform.FormArray[Self.Tag - 1].Visible := TRUE;
{ oder
  Hauptform.FormArray[Self.Tag].Hide;
  Hauptform.FormArray[Self.Tag - 1].Show; }
end;
procedure TFormIrgendwas.ButtonNextClick(Sender: TObject);
begin
  Hauptform.FormArray[Self.Tag].Visible := FALSE;
  // Du mußt hier noch auf Überlauf (> MaxForms) prüfen
  Hauptform.FormArray[Self.Tag + 1].Visible := TRUE;
{ oder
  Hauptform.FormArray[Self.Tag].Hide;
  Hauptform.FormArray[Self.Tag + 1].Show; }
end;
- Am Ende nicht vergessen, die Forms im Array wieder freizugeben:
Delphi-Quellcode:
for i := Low(FormArray) to High(FormArray) do
  FreeAndNil (FormArray[i]);
- Noch was: Wenn du die anderen Forms unter den Projektoptionen automatisch erzeugst, nimm die alle (bis auf die Hauptform) raus.

Nicht getestet ...

olfrygt 26. Jan 2008 20:37

Re: Zwischen verschidenen Formularen wechseln
 
Phu... :shock: danke, dass du dir die Mühe gemacht hast.

Aber das, was ich da gerade zusammen bastle, wird bewertet und ich kann meinem Lehrer schlecht vermitteln, dass ich das mir autodidaktisch beigebracht habe ^^ Ich durchschaue es nämlich noch nicht ganz. :oops:
Nimms mir nicht übel, aber das ist zu hoch gegriffen. Zumal ich mittlerweile mir Krokos Erklärung weiter gekommen bin.

Trotzdem danke.

Nuclear-Ping 26. Jan 2008 21:13

Re: Zwischen verschidenen Formularen wechseln
 
Das Konzept davon ist, dass du in deinem Hauptformular ein Array hast, welches die ganzen Unterformulare in einer Art Liste aufnimmt, wo du sie verwalten kannst, ohne auf jeder Form einzeln wissen zu müssen, welches Formular du gerade hast, was das letzte oder was nächste ist. Das wird eben über den Index geregelt.

Die Schleife in Hauptform.FormCreate erstellt je nach Durchlauf das passende Formular und weißt ihm einen Tag-Wert zu, um sie später wieder identifizieren zu können.

Die Button-Funktionen verstecken das jeweils aktuelle Formular und zeigen das letzte (-1) bzw. das nächste (+1) an.

Wenn du 3, 4 oder mehr Forms hast, blickst du mit dem anderen Konzept irgendwann nicht mehr durch, welches Formular das nächste und letzte ist. Das wird hier verhindert, indem jedes Formular das selbst regelt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz