[gelöst] Probleme mit TStringGrid nach Scrollen des Frames



  • Hallo Zusammen,
    ich habe ein Frame auf meiner Form, damit ich bestimmte Elemente über die ScrollBar des Frames bewegen kann, während andere auf der Form an ihrer Position bleiben. Damit man die ScrollBar mit dem Mausrad bewegen kann, habe ich bei den "MouseWheelUp" und "MouseWheelDown" Eregnissen den folgenden Code hinterlegt:

    void __fastcall TMainForm::Frame11MouseWheelDown(TObject *Sender, TShiftState Shift,
    		  TPoint &MousePos, bool &Handled)
    {
    
    	   Frame11->VertScrollBar->Position+=40;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TMainForm::Frame11MouseWheelUp(TObject *Sender, TShiftState Shift,
    		  TPoint &MousePos, bool &Handled)
    {
    	   Frame11->VertScrollBar->Position-=40;
    }
    

    das klappt auch super. Jetzt habe ich auf dem Frame ein StringGrid. In dem StrinngGrid setze ich den Inhalt auf "1" wenn der Nutzer in eine Zelle klickt und wieder zurück bei einem weiteren Klick:

    void __fastcall TMainForm::StringGridAusgangszuständeClick(TObject *Sender)
    {
    	 Merker_Feld.Top = Frame11->StringGridAusgangszustände->Selection.Top;
    	 Merker_Feld.Left = Frame11->StringGridAusgangszustände->Selection.Left;
    	 //Feld markieren 1= grün
    	 if (Frame11->StringGridAusgangszustände->Cells[Merker_Feld.Left][Merker_Feld.Top] == "" ) {
    	   Frame11->	StringGridAusgangszustände->Cells[Merker_Feld.Left][Merker_Feld.Top] = "1";
    	 }
    
    	 //Marikierung aufheben 0= weiß
    	 else if (Frame11->StringGridAusgangszustände->Cells[Merker_Feld.Left][Merker_Feld.Top] == "1") {
    		Frame11->StringGridAusgangszustände->Cells[Merker_Feld.Left][Merker_Feld.Top] = ""  ;
    	 };
    
    

    Auch das funktioniert.
    Jetzt das Problem: Wenn ich die Scollbar mit dem Mausrad bewege, ändert sich der Inhalt der Tabelle. Die Einträge werden quasi mit der Markierung "mitgezogen". Also wenn in der Zelle [0][1] "1" steht und ich dann nach unten scrolle steht in der Zelle [0][2] dann auch eine "1" obwohl diese vorher leer war und das zieht sich auch bis zur jeweils letzten Zeile der Tabelle durch. Wenn ich nach oben scrolle passiert dies umgekehrt: die Zellen werden nach und nach wieder leer.

    Ich habe schon versucht die Markierung der Zelle zu speichern, bevor ich die Position der ScrollBar anpasse und dann wieder diese Zelle zu Markieren, nachdem ich die Position geändert habe. Das hat aber keine Auswirkung. Wenn ich die Scrollbar über die Pfeiltasten bewege tritt das Problem nicht auf

    Weiß jemand woran dies liegt oder noch besser wie ich dieses Problem beheben kann.



  • Ist der Mauszeiger über dem TStringGrid, wenn du das Mausrad benutzt (so daß dieses auch gescrollt wird)?
    Setze mal Handled = true in den beiden MouseWheel-Ereignismethoden.

    PS: Du kannst deinen Code verkürzen, wenn du Zeiger (oder Referenzen) benutzt:

    TStringGrid *grid = Frame11->StringGridAusgangszustände;
    
    Merker_Feld.Top = grid->Selection.Top;
    // ...
    

    Probiere auch mal

    String& cell = grid->Cells[Merker_Feld.Left][Merker_Feld.Top];
    if (cell == "")
      cell = "1";
    

    (kann aber auch sein, daß es so nicht kompiliert, da Cell[X][Y] eine Eigenschaft ist - ich habe hier keinen BCB mehr installiert, um das selbst zu testen)



  • Handled= true hat das Problem behoben!! Vielen Dank!!