Ja klar,
also Frames legst du unter Datei|Neu|Frame an. Du erhälst dabei dann immer ein Fenster, dass stark an ein Form erinnert. Um ein Frame auf einem Form zu platzieren benutzt du Frameeinfügen, ist auf der Std.Palette gleich das erste (glaube ich).
Frames bekommen immer eine eigene
Unit und ermöglichen dir damit schon mal etwas modularität in jedes Programm zu bringen.
Wie gesagt, ein Frame verhält sich im Prinzip schon mal wie ein ganz normales Form, aber halt nur im Prinzip. Deshalb geh ich mal lieber auf die Unterschiede ein. Ereignisse wie OnActivate wirst du bei einem Frame nicht finden, genauso wenig wie du eine eigene Titelleiste hast. Genaugenommen verhält sich ein Frame doch eher, wie ein Panel dass du um die platzierten Elemente erweitern kannst. Ein wichtiger Vorteil von Frames besteht darin, dass sie etwas, hm, wie soll ich sagen, Zeigerartig behandelt werden. Wenn du auf zwei verschiedenen Forms das gleiche Frame platzierst und Dinge an dem Frame veränderst, dann änderst du damit beide Forms gleich mit (glaube die werden auch nur einmal im Speicher gehalten). Hier gilt es allerdings aufzupassen. Wenn du etwas an einem Frame änderst, dann tue es immer in dem Fenster, dass zu der Frame-
Unit gehört.
Hast du also dein TFrame1 und ein TForm1 wobei eine Instanz von TFrame1 auf dem TForm1 liegt. Der Einfachheit halber bezeichne ich letzteres mal als Frame2 (also Frame2 = Instanz von TFrame1 auf Form1).
Fügst du jetzt einen Button auf TFrame1 hinzu, ist der auch automatisch auf Form1 zu sehen (in Frame2). Fügst du den Button aber in Frame2 ein, so hat das keine Auswirkungen auf die eigentliche Klasse. Hast du also noch Form2 und da liegt auch eine Instanz (Frame3), dann wird sich an Frame3 genau dann was ändern, wenn du es direkt an TFrame1 änderst.
Klingt kompliziert, ist aber eigentlich ganz einfach (und gut durchdacht, wenn man sich dran gewöhnt hat). Aufpassen musst du auch mit den Variablen, die du für TFrame1 benutzt. Width und Height gibt es natürlich auch hier schon (ist ja ein Controll) und gerade wenn man die auch als private deklariert und 0 setzt gibt es lustige Effekte (kein sichtbares Frame ohne Compilerwarnung, nicht dass ich sowas mal gemacht hätte
)
Wie gesagt, achte drauf, dass du immer auf dem nicht-Form arbeitest. Da kannst du dann auch die Aktionen für Ereignisse festlegen. Die gelten dann auch immer für jede Instanz dieses Frames. Damit kannst du Frames gut wiederverwenden und hast auch eine schöne Möglichkeit ein Form etwas modularer zu gestalten.
Für das was du vorhast, kannst du dann jedes Form durch ein Frame ersetzen und diese dann beide auf dem Form (immer mit Align auf volle Clientgröße gestellt) platzieren. Deine Eingaben von TFrame1 (= alte Form1) liest deine jetzige Form aus und reicht die an Frame2 (früher Form2) weiter. Damit müssen Frame1 und Frame2 nichts von einander wissen.
Frame2 kann dann eine Funktion vom Typ Boolean haben, und die ruft dein Form auf. Ist die Erfolgreich, versteckst du Frame1 und zeigst Frame2, sonst nicht.
Delphi-Quellcode:
procedure TForm1.doSomething;
begin
if self.Frame2.connect(self.Frame1.EditLogin.Text, self.Frame1.EditPassword.Text, ....) then
begin
self.Frame1.visible := False;
self.Frame2.visible := True;
end
else
begin
// z.B. die falschen Felder markieren oder was auch immer
end;
end;
Hoffe das hilft dir weiter. Und sorry wenn Antworten heute etwas dauern