Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Zugriff auf Edit-Feld in einem Frame


AndreM - Fr 30.01.04 16:11
Titel: Zugriff auf Edit-Feld in einem Frame
Hallo Community,

ich hab mal wieder eine kleine Frage.
Und zwar habe ich mir in meinem Programm mehrere Frames erstellt, welche ich nun zur Laufzeit im Programm aufrufe. Auf diesen Frames habe ich u.a. einige Edit-Boxen plaziert, welche ich nun beim Aufruf über eine Procedure bzw. Funktion mit Daten füllen möchte.

Bei nem Form geht das ganze ja z.B. über Form1.Edit1.Text:= 'Hallo',
doch wie kann ich ein Edit-Feld innerhalb eines Frames von einer Procedure oder Funktion aus ansprechen.
Mit Frame1.Edit1.Text := 'Hallo' geht es jedenfalls nicht. :(
Oder kann ich Edit-Felder in einem Frame nicht zur Laufzeit Daten zuweisen?

Hoffe mal ihr habt einigermaßen verstanden was ich meine! :D


teebee - Fr 30.01.04 16:45
Titel: Re: Zugriff auf Edit-Feld in einem Frame
AndreM hat folgendes geschrieben:
Mit Frame1.Edit1.Text := 'Hallo' geht es jedenfalls nicht.
Was genau geht nicht? Gibt es einen Compilerfehler oder geht es 'einfach' zur Laufzeit nicht?
Ist das Edit wirklich Bestandteil des Frames? Es muss dazu auf der Framevorlage sein. Wenn Du es nur in der Form auf das Frame gezogen hast, bleibt es ein Bestandteil der Form. Falls es so ist, müsstest Du einen Compiler-Fehler kriegen.

Gruß, teebee


Udontknow - Fr 30.01.04 17:13

Wo erstellst du denn die Edit-Felder? Du musst wissen, daß der Aufruf "Form1.Edit1" ja nur dann gültig ist, wenn die Variable Edit1:TEdit im public/published-Bereich der Form vorhanden ist. Ausserdem spielt der "Ort" der Komponente für den Aufruf keine Rolle. Du könntest per "Form1.Edit1.Parent:=Form1.Frame1;" z.B. das Edit-Feld von der Form zum Frame verschieben, trotzdem gehört das Edit-Feld noch immer zur Form.

Cu,
Udontknow


AndreM - Fr 30.01.04 17:19

Ok, dann erklär ich das ganze nochmal ein wenig Ausführlicher.

Ich habe eine Form und zwei Frame in Delphi erzeugt. Auf dem Form habe ich zwei Buttons plaziert. Wenn ich nun Button 1 klicke wird Frame1 angezeigt, wenn ich Button 2 klicke wird Frame2 anhezeigt.

Auf Frame1 habe ich eine Edit-Feld eingefügt, welche ich z.B. den Wert Hallo zuweisen möchte wenn Button1 angeklickt wird.

Wenn ich nun in OnClick Event von Button ein versuche Edit1 den Wert 'Hallo' zuzuweisen erhalte ich beim kompilieren den Fehler
Undefinierter Bezeichner: 'Edit1', da Edit1 ja für das Form offiziell erst existiert, wenn im Programm auch Button 1 geklickt worden ist.

@Udontknow
Ich hab das Edit-Feld auf dem Frame plaziert. Diese werden also nicht zur Laufzeit erstellt, sondern befinden sich bereits auf dem Frame.


derDoc - Fr 30.01.04 19:37

Ich habe das gerade mal getestet und bei mir geht das wunderbar.

Du gehts über Datei | Neu | Frame und fügst alles was du benötigst deinem Frame hinzu. Danach schließt du das Frame und wählst unter Standard Frames aus. Nun sollte ein Fenster kommen, in dem du dein Frame auswählst. Platzieren kannst du es ja selber.

Nun aber zum interessanten Teil:
Mit FrameXYZ.EditXYZ.Text := 'Hallo'; kannst du den Text ändern.


AndreM - Fr 30.01.04 20:47

JaJa, so geht es. Jedoch geht es nicht, wenn ich die Frames nicht in Delphi und dann über die Framekoponente sondern innerhalb des Programmes erst zur Laufzeit in das Form laden.

Also meine Frames lade ich so per Mausklick.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  FFrame.Free;  // Alten Frame löschen
  FFrame:=NIL;

  if (item = 'Benutzerverwaltung'then
  begin
    if (zugriff_schreiben) or (zugriff_lesen) then
    begin
      FFrame:=TFrame_Benutzerverwaltung.Create(Self);
      benutzer_einlesen; 
    end
    else access_error;
  end;


    FFrame.Left:= 112;
    if Assigned(FFrame) then FFrame.Parent:=Self;


Der Code mag jetzt ein wenig komisch aussehen. Das sind lediglich aus dem Programmcode zusammenkopierte schnipsel. Die unrelevanten Stellen habe ich einfach rausgeschnitten. ;)

Und weil ich die Frames halt erst zur Laufzeit lade kennt Delphi beim compilieren Edit1 noch nicht und gibt dementsprechend eine Fehlermeldung aus! ;)


derDoc - Fr 30.01.04 21:01

Dann musst du erst das Frame suchen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  Frame: TFrameBla; //Dein Typ 
begin
  Frame := TFrameBla(FindComponent('FrameName'));
  Frame.Edit1.Text := 'Hallo';
end;


Das müsste funktionieren.

//Edit: Fehler korrigiert


KidPaddle - Sa 31.01.04 10:57

Er erstellt die Frames dynamisch. Dabei gibt es natürlich keine published Properties fuer die einzelnen Control in dem Frame.

Also muss er es zu Fuss machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TMainForm.Button1Click(Sender: TObject);
var
  Edit1             : TComponent;
begin
  Edit1 := Frame.FindComponent('Edit1');
  if Assigned(Edit1) then begin
    (Edit1 as TEdit).Text := 'Hallo';
  end;
end;


Gruß
KidPaddle