Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi frame ansprechen (https://www.delphipraxis.net/140851-frame-ansprechen.html)

Delphi-Phil 27. Sep 2009 12:59


frame ansprechen
 
Hallo zusammen,

ich habe folgendes Problem.

Ich habe ein Form da drauf ist ein Panel. Auf dieses Panel lade ich ein Frame. Auf diesem Fram sind Buttons Grids usw. jetzt ist auf diesem Frame was ja auf einem Panel klebt wieder ein Panel auf dem ich ein neues Frame laden muss mit verschiedenen Edit Feldern.

Wie kann ich das lösen...

hier noch mein code um das Frame auf das Panel zu legen was auf meinem form liegt:

Delphi-Quellcode:
procedure TFormHaupt.JvNavPnlPageSchuelerverwClick(Sender: TObject);
var
newFrame: TFrmSchuelerverwaltung;
begin
newFrame := TFrmSchuelerverwaltung.Create(PnlMain);
newframe.Align := alClient;
newFrame.Visible := true;
newframe.Parent := PnlMain;
FormData.TblKlasse.Open;
FormData.QrySchueler.Open;
end;

Uwe Raabe 27. Sep 2009 13:43

Re: frame ansprechen
 
Entweder änderst du NewFrame von einer lokalen Variablen zu einem Feld in TFormHaupt oder du gibst dem NewFrame einen eindeutigen Namen, dann kannst du es später mit PnlMain.FindChildControl wieder finden.

Delphi-Phil 27. Sep 2009 13:45

Re: frame ansprechen
 
verstehe ich nicht ganz, ich habe das noch nie gemacht!
kannst du mir mal bitte ein beispiel zeigen...!

Delphi-Phil 27. Sep 2009 15:20

Re: frame ansprechen
 
Um es nochmal einfacher auszudrücken!

ich habe ein form da drauf ein panel und auf dem panel ein frame. jetzt möchte ich eine komponente ansprechen die auf dem frame liegt aus der form unit.

Wie kann ich dies machen??

Uwe Raabe 27. Sep 2009 15:40

Re: frame ansprechen
 
Es gibt da zwei unterschiedliche Ausgangsmöglichkeiten:

1. Du hast den Frame im VCL-Designer in das Panel gesetzt: dann existiert ein Feld im Form, das du direkt ansprechen kannst.
2. Du hast den Frame zur Laufzeit hinzugefügt (wie in deinem ersten Post beschrieben), dann kannst du entweder eine eigene Variable für diesen Frame im Form definieren oder dem Frame einen Namen geben und später über FindChildControl wiedersuchen.

Wie gebe ich dem Frame einen Namen?

Delphi-Quellcode:
 
newFrame := TFrmSchuelerverwaltung.Create(PnlMain);
newFrame.Name := 'DerFrameName';
newframe.Align := alClient;
newFrame.Visible := true;
newframe.Parent := PnlMain;
Wie finde ich den Frame wieder?

Delphi-Quellcode:
var
  DerFrame: TFrmSchuelerverwaltung;
begin
  DerFrame := PnlMain.FindChildControl('DerFrameName') as TFrmSchuelerverwaltung;
 ...
Auf die Controls des Frames kannst du dann ganz einfach über die entsprechenden Namen zugreifen. Ohne weitere Informationen kann ich auch kein sinnvolles Beispiel geben. Aber angenommen, das Panel auf dem Frame heißt "DasPanel", dann erfolgt der Zugriff im vorgehenden Beispiel über "DerFrame.DasPanel".

Delphi-Phil 27. Sep 2009 16:10

Re: frame ansprechen
 
Es funktioniert irgendwie noch nicht so wie es soll. Das Zweite Frame sieht man nur noch alleine, von dem Rest ist nichts mehr zu sehen...

Hier nochmal der Code:
Delphi-Quellcode:

//Schülerverwaltung laden
procedure TFormHaupt.JvNavPnlPageSchuelerverwClick(Sender: TObject);
var
newFrame: TFrmSchuelerverwaltung;
DerFrame: TFrmSchuelerverwaltung;

newFrame2: TFrmStammdaten;
begin
newFrame := TFrmSchuelerverwaltung.Create(PnlMain);
newFrame.Name := 'Schuelerdaten';
newframe.Align := alClient;
newFrame.Visible := true;
newframe.Parent := PnlMain;

//Schülerdaten laden
FormData.TblKlasse.Open;
FormData.QrySchueler.Open;

DerFrame := PnlMain.FindChildControl('Schuelerdaten') as TFrmSchuelerverwaltung;

newFrame2 := TFrmStammdaten.Create(DerFrame.PnlSchuelerverwaltung);
newframe2.Align := alClient;
newFrame2.Visible := true;
newframe2.Parent := PnlMain;
end;

rollstuhlfahrer 27. Sep 2009 16:27

Re: frame ansprechen
 
dann mach es doch so: Sag deinem Frame auf dem Handes des Forms, dass es die Daten für das interne Panel zu laden hat und gib dabei auch dem Frame noch an, welche Daten es zu laden hat. Dann sollte das alles gehen.
Ansonsten: Sag dem Frame, dass das interne Panel public/published ist und erstelle dein internes Frame auf dem Published-Panel

Bernhard

Delphi-Phil 27. Sep 2009 16:29

Re: frame ansprechen
 
kann ich es nicht machen wie in meinem code von oben? da scheint doch nur ein denkfehler zu sein oder??

rollstuhlfahrer 27. Sep 2009 16:35

Re: frame ansprechen
 
Delphi-Quellcode:
var
  neu: TStammdaten;
begin
//...

neu := TFrmStammdaten.Create(neuFrame.PnlSchuelerverwaltung);
neu.parent := neuFrame.PnlSchuelerverwaltung;
Bernhard

Uwe Raabe 27. Sep 2009 16:43

Re: frame ansprechen
 
Zitat:

Zitat von Delphi-Phil
kann ich es nicht machen wie in meinem code von oben? da scheint doch nur ein denkfehler zu sein oder??

Ja, ändere die letzte Zeile in

Delphi-Quellcode:
newframe2.Parent := DerFrame.PnlSchuelerverwaltung;
und es sollte gehen.

Allerdings brauchst du den ganzen Kram mit DerFrame und FindChildControl gar nicht, wenn das Ganze innerhalb einer einzigen Methode stattfindet:

Delphi-Quellcode:
//Schülerverwaltung laden
procedure TFormHaupt.JvNavPnlPageSchuelerverwClick(Sender: TObject);
var
  newFrame: TFrmSchuelerverwaltung;
  newFrame2: TFrmStammdaten;
begin
  newFrame := TFrmSchuelerverwaltung.Create(PnlMain);
  newframe.Align := alClient;
  newFrame.Visible := true;
  newframe.Parent := PnlMain;

  //Schülerdaten laden
  FormData.TblKlasse.Open;
  FormData.QrySchueler.Open;

  newFrame2 := TFrmStammdaten.Create(newFrame.PnlSchuelerverwaltung);
  newframe2.Align := alClient;
  newFrame2.Visible := true;
  newframe2.Parent := newFrame.PnlSchuelerverwaltung;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 Uhr.

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