toenne - Fr 18.03.11 23:40
Titel: Problem mit SpinEdit
Ich laboriere gerade an einem etwas merkwürdigen Problem.
Ich habe eine Hauptform wo zwei Integer-Variablen definiert werden, XSpinE und YSpinE.
Über einen Button wird eine zweite Form aufgerufen die zwei SpinEdits enthält, SpinEditX und SpinEditY.
Aufruf der zweiten Form:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm_Main.SpeedButton1Click(Sender: TObject); begin XSpinE := 5; YSpinE := 4; Form_Mapping.ShowModal; end; |
(XSpinE und YSpinE werden normalerweise in der Mainform aus einer Ini-Datei gelesen bzw. dort beim Programmende zurückgeschrieben, ich habe sie nur testweise oben kurz vor dem 'Form_Mapping.ShowModal' direkt mit Zahlenwerten belegt)
Im FormActivate der zweiten Form sollen die SpinEdits nun voreingestellt werden:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm_Mapping.FormActivate(Sender: TObject); begin SpinEditX.Value := XSpinE; SpinEditY.Value := YSpinE; end; |
Merkwürdigerweise erscheint im SpinEditY aber immer 1, der Wert in SpinEditX ist korrekt.
Noch merkwürdiger aber: Vertausche ich XSpinE und YSpinE...
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm_Mapping.FormActivate(Sender: TObject); begin SpinEditX.Value := YSpinE; SpinEditY.Value := XSpinE; end; |
...dann erhält SpinEditX immer 1 und der Wert in SpinEditY ist korrekt!
Ja spinne ich jetzt? Wieso wird YSpinE nicht korrekt übergeben? :shock:
Gruss
Toenne
Edit:
Als Nachtrag noch der Hinweis dass das Schreiben in die Ini einwandfrei funktioniert. Im FormClose der zweiten Form wird YSpinE mit SpinEditY.Value belegt (YSpinE := SpinEditY.Value;), beim schliessen der Hauptform wird die Ini geschrieben. Habe ich SpinEditY von 1 auf irgendeinen anderen Wert geändert so erscheint der auch so in der Ini.
toenne - Sa 19.03.11 00:16
Ewig lang grübelt man und kaum dass man im Forum postet findet man den (dämlichen...) Fehler: Im Objektinspektor war für beide SpinEdits bereits das OnChange-Event definiert. Dort aber wird am Ende YSpinE zurückgeschrieben:
Delphi-Quelltext
1: 2:
| XSpinE := SpinEditX.Value; YSpinE := SpinEditY.Value; |
Also wird als erstes SpinEditX vorbelegt. Das wird aber bereits als Change-Event bewertet und in die OnChange-Routine verzweigt. Zu diesem Zeitpunkt hat SpinEditY aber noch den Defaultwert 1...der prompt YSpinE zugewiesen wird. Also hat YSpinE in der nächsten Zeile SpinEditY.Value := YSpinE den Wert 1 der auch brav ins SpinEdit geschrieben wird :roll: .
Also flugs FormActivate geändert...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm_Mapping.FormActivate(Sender: TObject); begin SpinEditX.Value := XSpinE; SpinEditY.Value := YSpinE; SpinEditX.OnChange := raster; SpinEditY.OnChange := raster; end; |
...und auch das FormClose...
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm_Mapping.BitBtnOKClick(Sender: TObject); begin SpinEditX.OnChange := NIL; SpinEditY.OnChange := NIL; close; end; |
...und zu guter Letzt noch das OnChange-Event im Objektinspektor gelöscht -> funktioniert.
Da falle ich jedesmal wieder darauf rein dass eine Belegung von Komponenten (z.B. auch ScrollBar.Position := irgendwas) das OnChange-Event aufruft...nervig...
Gruss
Toenne