DBGrid: Zeile markiert über die sich die Maus befindet



  • Ich weiß nicht, ob das jetzt noch wichtig ist. In die Richtung habe ich gestern gedacht.

    // Wenn CellRect in CustomGrid schon Protected ist, und damit in DBGrid nicht verfügbar, 
    //dann leite ich mir halt meine eigene Klasse ab, die die Methode hat 
    class TMyDBGrid :public TDBGrid
    {
    	public:
    		TRect TMyDBGrid::myCellRect(int aCol, int aRow)
    		{
    			return CellRect(aCol, aRow);
    		}
    };
    
    // OnMouseMove-Ereignis
    void __fastcall TMainMLVisard::DBGrid2MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
       // Zelle finden
       TGridCoord gc = DBGrid2->MouseCoord(X, Y);
       // Rect für Zelle herausfinden, dazu temporär eigene Klasse verwenden 
       TRect Rect = reinterpret_cast< TMyDBGrid* >(DBGrid2)->myCellRect(gc.X, gc.Y);
       // zeichnen
       DBGrid2->Canvas->Brush->Color = clBlue;
       DBGrid2->Canvas->Font->Color = clYellow;
       DBGrid2->Canvas->FillRect(Rect);
       DBGrid2->Canvas->TextRect(Rect, Rect.Left,Rect.Top,"TEST");
    }
    

    Nicht programmiert habe ich hier, die Abfrage der Texte der Zelle.
    Nicht programmiert ist hier das Rücksetzen der Zelle in Originalfarbe, wenn der Mauszeiger, die Zelle wieder verlassen hat.

    P.S.:
    Hellics Lösung ist richtig schick, wenn man den Focus gleich auf die Zelle setzen will. 👍



  • carisma83 schrieb:

    Also wenn ich den Quelltext in das FishFact Beispiel einfüge dann geht es (bis dahin schon mal vielen DANK).
    Nur bei meinem Programm geht es nicht. Ich habe immernoch das gleiche Problem, sobalt ich die Maus nur ein wenig über das Grid bewege markiert er den untersten Eintrag, als würde ich runterscrollen. Liegt das vielleicht daran das ich eine Query verwende? In dem Beispiel FishFact wurde nämlich keine verwendet.

    Nö, das ist egal ob TQuery oder TTable. Verwendest du TDBGrid ?



  • Ja, ist das falsch???



  • War nur die Frage ob du TDBGrid verwendest, oder eine andere Fremdkomponente wie z.B. TntDBGrid ...
    Hat dein DBGrid auch den Focus, so wie es schon Jansen erwähnt hat ?



  • Focus? Was ist das und wie stell ich das ein???



  • Entweder klickst du in das DBGrid oder du setzt den Eingabefocus manuell:

    DBGrid1->SetFocus();
    


  • Damit hatte es auch nicht zu tun. Ich kann aber den Fehler schon ein wenig eingrenzen. Ich habe nämlcih eben anstelle meiner Datenbank die Datenbank von dem FishFact Beispiel genommen und in mein Grid reingeladen. Und jetzt frag mich bitte keiner warum aber es geht, genau so wie ich mir das vorgestellt habe. Aber woran liegt das, wenn ich nämlich meine Datenbank wieder in das Grid lade geht es nicht. Also muss es mit der Datenbank zu tun haben, aber waran genau????



  • Ich frag Dich aber.
    Wie hast Du die einzelenen Datenbanken genau angesprochen. Es liegt garantiert nicht an der Datenbank selbst, sondern ist irgend eine Einstellung von DataSet oder DataSource etc.

    Vergleiche genau die Objekte. Wenn Du den Unterschied findest, hast Du wahrscheinlich Deine Ursache.



  • Das denke ich nicht. Denn als ich die Beispiel Datenbank von dem FishFact Programm in mein Grid übertragen habe, habe ich nichts geändert. Ich habe nur eine andere Datenbank gewählt. Von daher denke ich das es nicht an den Einstellungen liegen kann, da ich wie gesagt an den Einstellungen nichts vorgenommen habe. Ich kann mir auch nicht erklären wie und warum es an der Datenbank liegt, aber es kann nur daran liegen.



  • Versuch mal folgendes:

    class TMyDBGrid :public TDBGrid
    {
        public:
        __property Row;
    };
    
    void __fastcall TForm1::DBGrid1MouseMove(TObject *Sender,
          TShiftState Shift, int X, int Y)
    {
       TGridCoord coord = DBGrid1->MouseCoord(X,Y);
       if(coord.X>0&&coord.Y>0)
       {
          DBGrid1->DataSource->DataSet->MoveBy(coord.Y - reinterpret_cast< TMyDBGrid* >(DBGrid1)->Row);
          DBGrid1->SelectedIndex = coord.X-1;
       }
    
    }
    


  • In dem Zusammenhang ist mir aber was anderes aufgefallen.

    Die ganze Lösung funktioniert bei mir nur solange die Zeilen im Original des Grid sichtbar sind. Sobald ich einen Grid mit vertikalem Scrollbalken habe und in Zeilen gescrollt bin, die normalerweise "unsichtbar" weil zu weit unten sind, und dann mit der Maus über das Grid fahre, funktioniert das Ganze nicht mehr.



  • Wahnsinn, es geht!!!

    Vielen dank an alle!

    Hätte nie gedacht das dies noch hinhaut



  • @hellic

    Mit Deinem Code-Schnipsel funktioniert's dann auch bei meinen "unsichtbaren" Zeilen. Auch von mir ein großes Merci 👍 .

    Wieder ein paar nützliche Sachen in der Toolbox.


Anmelden zum Antworten