Steuerelem. aus anderem Form / Unit nicht erreichb

folgendes Problem:
Programm mit 2 Formularen / Units

Unit Haupt;

uses
Neben;

type
TF_Form_Haupt

var
F_Haupt:TF_Haupt;

implementation

procedure TF_Form_HauptCreate;
var
Ergebnis:String;
begin
** Ergebnis :=TF_Neben.E_Feld.Text;
end;

und

Unit Neben;

type
TF_Form_Neben
E_Feld:TEdit;

var
F_Neben:TF_Neben;

implementation

procedure TF_Form_NebenCreate();
begin
E_Feld.Text:=‚a‘;
end;

an der mit ** markierten Stelle tritt zur beim Compilieren und während der Laufzeit ein Fehler auf, dass die Variable „F_Neben.E_Feld.Text“ nicht erreichbar wäre.

beim Compilieren:
Project Haupt raised exception class EAccess Violation at
Adress … Step or run continue

bei erneutem Run
Access Violation at Adress … in Module …
Read of Adress …
(nach erneutem/diesem Run lässt sich Programm starten)

im Watch:
E_Feld inaccessible Value

Gibt es hier einen Tip für mich ?

Danke

E. B.

procedure TF\_Form\_HauptCreate;
var 
 Ergebnis:String;
begin
 Ergebnis := F\_Neben.E\_Feld.Text;
end;

versuch es mal damit… Im übrigen… eigentlich steht auf so einem Programmierstil die Todesstrafe, aber solange es nur für „home-use“ ist…

Hi!

Ich denke mal, Du solltest in der OnCreate-Methode nicht
schon auf Eigenschaften von Objekten zugreifen, die selber
erst beim OnCreate-Ereignis definiert werden.
Vermutlich wird dein Form „Neben“ sowieso erst nach
dem Form „Haupt“ initialisiert.
D.h. Neben.OnCreate wird erst NACH Haupt.OnCreate ausgeführt.
Da Du aber schon im Haupt.OnCreate auf Eigenschaften von Neben
zugreifen willst, welches noch garnicht existiert, kommt
sicher diese Fehlermeldung.
Ich habe dieses Scenario mal nachgestellt.
Ich bekomme zwar andere Fehlermeldungen, aber funktionieren
tuts bei mir auch nicht.

Du musst erstmal dem Form Neben Zeit geben sich zu initialisieren,
bevor Du auf seine Felder zugreifst.
Jedenfalls Haupt.OnCreate würde ich auf keinen Fall empfehlen.
Haupt.OnShow ist sicher auch nicht sooo gut.
Leg Dir doch ins Haupt eine TTimer-Komponente, setze INTERVAL
auf 100ms und führe deine Aktion im OnTimer aus.
Du musst dann aber auch im OnTimer den Timer gleich disablen (timer1.enable := false)

das Timer-Ereignis wird, denke ich zumindest, als letztes
Ereignis auftreten … nachdem alles initialisiert ist.

Dies war jetzt nur ein Vorschlag. Vielleicht gibts auch noch
elegantere Lösungen…

Gruß Dennis

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

folgendes Problem:
Programm mit 2 Formularen / Units

Unit Haupt;

uses
Neben;

type
TF_Form_Haupt

var
F_Haupt:TF_Haupt;

implementation

procedure TF_Form_HauptCreate;
var
Ergebnis:String;
begin
** Ergebnis :=TF_Neben.E_Feld.Text;

Ergebnis:= F_Neben.E_Feld.Text;

end;

und

Unit Neben;

type
TF_Form_Neben
E_Feld:TEdit;

var
F_Neben:TF_Neben;

implementation

procedure TF_Form_NebenCreate();
begin
E_Feld.Text:=‚a‘;
end;

an der mit ** markierten Stelle tritt zur beim Compilieren und
während der Laufzeit ein Fehler auf, dass die Variable
„F_Neben.E_Feld.Text“ nicht erreichbar wäre.

beim Compilieren:
Project Haupt raised exception class EAccess Violation at
Adress … Step or run continue

bei erneutem Run
Access Violation at Adress … in Module …
Read of Adress …
(nach erneutem/diesem Run lässt sich Programm starten)

im Watch:
E_Feld inaccessible Value

Gibt es hier einen Tip für mich ?

Danke

E. B.

Hi Eric,
wenn ich das richtig lese, nimmt du nicht das erstellte Objekt sondern nur die Typdeklaration. Ich habs oben mal Fett gemacht, wie’s richtig heissen müsste. Die Fehlermeldung kommt daher, da du ja nicht den referenzierten Zeiger f_neben sondern nur die Klasse tf_neben referenziert. Da greift der Zeiger ins leere, da das Objekt nicht exisitiert.
grüsse
Mathias