Hallo auch,
ich erkläre erst kurz, was das Problem ist. Die Lösung sollte dir dann eigentlich einfallen. Falls nicht, folgt auch noch ein Lösungsvorschlag.
PROBLEM:
Das Problem bei deinem Code ist, dass du den Text des Edits in Form2 im FormCreate-Event setzt.
Wann ist denn das?
Wenn Du Delphi das Management für die Formulare überlässt, so werden alle Formulare standardmäßig erstellt, BEVOR das Programm die Bearbeitung von Nutzereingaben startet. Das kannst du dir ansehen, wenn du dir mal den Projekt-Quellcode ansiehst (Menu „Projekt / Quelltext anzeigen“). Das sollte bei dir dann etwas so aussehen:
program Projekt1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R \*.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
Nach Application.CreateForm() werden die OnCreate-Event aufgerufen (und evtl. auch OnShow-Events usw). Zu diesem Zeitpunkt hast du als User noch keine Eingabe in einem Editfeld machen können.
Erst in Application.Run wird auf eine Eingabe gewartet und evtl. ausgewertet. Jetzt erst kann z.B. auch ein OnClick-Event eines Buttons auftreten.
LÖSUNG:
Vorschlag 1:
Da Du Form2 anzeigst, nachdem du den Button in Form1 geklickt hast, könntest du das OnShow-Ereignis in Form2 nutzen, um x zu lesen.
Vorschlag 2:
Lass Form2 nicht automatisch erstellen, sondern erstelle es „manuell“ nach dem Klick auf auf den Button in Form1:
procedure TForm1.Button1Click(Sender: TObject);
var
ClickForm: TForm2;
begin
x := edit1.text;
ClickForm := TForm2.Create(self);
self.hide;
try
ClickForm.Show;
finally
ClickForm.Free;
end;
end;
Vorschlag 3:
Es ist unschön, globale Variablen zu benutzen, wenn sie vermeidbar sind. Bei dir ist „x“ so eine globale Variable, und die ist als solche absolut verzichtbar.
Vor der Anzeige von Form2 im ButtonClick-Event von Form1 kannst du doch direkt den Text von Form1.Edit1 auf Form2.Edit2 übertragen. Die Verwendung von OnCreate- oder OnShow-Events von Form2 ist dann unnötig.
Ganz professionell wird es, wenn du in der Unit2 eine Prozedur (oder besser noch eine Funktion) schreibst, welche den zu setztenden Text dür das Edit2 übernimmt, prüft, das Form2 erstellt oder einen Fehler ausgibt.
Mit ShowModal kannst du in der Prozedur warten, bis Form2 geschlossen wurde.
So könnte diese Prozedur aussehen:
function ShowClickForm(AText:String):Boolean;
var
ClickForm: TForm2;
value: Integer;
begin
// gehen wir erstmal davon aus,
// dass die Eingabe nicht ok war.
Result := False;
if AText '' then
try
value := StrToInt(AText);
ClickForm := TForm2.Create(Application);
try
// Übergabe der ermittelten ZAHL als Text
ClickForm.Edit2.Text := IntToStr(Value);
ClickForm.ShowModal;
Result := True;
finally
ClickForm.Free;
end;
except
// Hier landen wir, wenn zwar ein Text
// übergeben wurde, es sich dabei aber
// nicht um eine gültige Ganzzahl handelt.
// Hier steht kein Code. Das ist nur zum
// Abfangen eines Fehlers.
end;
end;
So, in Form1 kann man das zB. so aufrufen:
procedure TForm1.Button1Click(Sender: TObject);
begin
self.hide;
if ShowClickForm(Edit1.Text) then
begin
// mach irgendwas, wenn alles geklappt hat
end
else
begin
// mach was anderes, wenn es nicht geklappt hat
end
self.show;
end;
Hinweis: Wenn ShowModal verwendet wird, brauchst du eigentlich Form1 nicht zu verstecken, weil der User dann ausschließlich Eingaben in Form2 machen kann.
Das kann man noch ausbauen. Die Funktion könnte zB. auch noch Rückgabewerte liefern (als var Parameter).
Ich hoffe, das hilft erstmal weiter und du hast was gelernt.
VG
Jochen