toenne - Fr 18.03.11 22: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 - Fr 18.03.11 23: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