Autor Beitrag
AndreM
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Win2k, WinXP, Suse 10
D7 Ent
BeitragVerfasst: Fr 30.01.04 16:11 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 109


D6 Prof
BeitragVerfasst: Fr 30.01.04 16:45 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Win2k, WinXP, Suse 10
D7 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: 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.

_________________
MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
AndreM Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 122

Win2k, WinXP, Suse 10
D7 Ent
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 623

Win Vista Prof
D2007 Prof
BeitragVerfasst: Fr 30.01.04 21:01 
Dann musst du erst das Frame suchen:

ausblenden 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

_________________
MfG derDoc
There are only 10 types of people: those who understand binary and those who don't.
KidPaddle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 351

WinXP,Linux
D7 Prof, XE7
BeitragVerfasst: 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:
ausblenden 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