DBGrid: Zeile markiert über die sich die Maus befindet
-
Ich verstehe es immer noch nicht.Ich würde das gern mit OnMouseMove realisieren aber wie lautet denn der Befehl für markieren?
-
Was meinst Du mit markieren?
- die Zelle andersfarbig darstellen, weil Du mit der Maus drüber bist, dann siehe vorige Antwort.
- Zellen merken für spätere Verarbeitung ?
-
Wie ich schon gesagt habe, MARKIEREN. Wenn ich ja auf eine Zelle draufklicke, wird dies markiert, dies will ich aber auch wenn ich nur mit der Maus drüber bin. Im Prinzip wie in einer ComboBox, wenn ich die ComboBox öffne und über die einzelnen Einträge fahre passiert dies ja auch.
-
Also doch Zelle zeichnen -> siehe Methode Canvas.
Grob erzählt:
Wenn Du mit dem Mauszeiger über die Zelle fährst (Ereignis siehe akari), zeichnest Du diese neu.
-
Ich habe jetzt fogendes Probiert und in das OnMouseMover Ereigniss eingetragen:
DBGrid->Canvas->Brush->Color->clBlue;
Doch leider passiert nichts wenn ich mit der Maus über die einzelnen Zeilen fahre.
-
Das legt nur den Hintergrund fest.
Das Zeichnen selbst fehlt noch!
// Zeichnen des Hintergrundes DBGrid->Canvas->FillRect(Rect); //Der Parameter Rect gibt die Position der Zelle auf der Zeichenfläche an. // Texfarbe festlegen ...Canvas->Font->Color = clRed; // Text zeichnen ...Canvas->TextRect(Rect,....);So und jetzt hau mich. Ich weiß auf die Schnelle auch nicht, wo du Rect her kriegst.
OnMouseMove übergibt hier nur X-Y Koordinaten, welche aber auf das aktuelle Rect schließen lassen.P.S.:
...Canvas->Brush->Color -> clRed; //ist keine Zuweisung . ..Canvas->Brush->Color = clRed; // jetzt wird die Farbe zugewiesen
-
Das hilft mir dann auch nicht weiter, noch eine Idee?
-
Das mit dem Zeichnen ist schon richtig.
Dein neues Problem lautet: "Wie werden X-Y Koordimgatem zu Deiner aktuellen Zelle und daraus dein Rect-Parameter.
OnMouseMove -> MouseToCell -> CellToRect -> Canvas
Beide Funktionen sind in der BCB-Hilfe beschrieben.
-
Fairerweise muß ich eingestehen, daß ich mir die Methoden aus DrawGrid gezogen habe.
Ich hab gerade bei DBGrid geschaut. Beide (DBGrid & Drawgrid) sind von CustomGrid abgeleitet.
Dort habe ich MouseCoord & CellRect. CellRect finde ich aber in DBGrid nicht wieder.
-
Für die Aufgabenstellung gibt m.E. es keine schöne Lösung mittels fertiger Funktionen und Eigenschaften.
Du könntest eventuell aus der Font-Grösse die Zeilenhöhe berechnen, diese mit der Mauseposition ableichen (OnMouseMove) und dann ... ähh ... jetzt wird's schwierig. Denn du weisst ja trotzdem noch nicht, welche "Zeilen" gerade im DBGrid sichtbar sind und wie sie positioniert sind.
Man kann zwar davon ausgehen, dass sich der aktuelle Datensatz im Fenster befindet, hätte mit Query::RecNo seine "Zeilennummer", aber wo genau im Fenster die grad steht, das ist nicht klar.
Ausserdem könnte die Anzeige auch noch gefiltert sein.Also im Moment habe ich keine zündende Idee. Allerdings kann ich auch nicht wirklich nachvollziehen, inwiefern eine solche Option bei der Bedienung des Programmes etwas bringen soll.
-
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 - DBGrid1->DataSource->DataSet->RecNo); } }Unter Options noch dgRowSelect auf true.
-
Klappt auch nicht,
egal auf welche Zeil ich nun mit der Maus fahre ist wird immer die unterste markiert. Außerdem soll es ja auch so sein das immer nur die zeile markiert sein soll auf der sich die Maus befindet und nicht die Zeilen auf die die Maus schon war.
-
Also bei mir klappt das ...

Es wird immer die Zeile markiert, in der sich die Maus befindet.
-
carisma83 schrieb:
egal auf welche Zeil ich nun mit der Maus fahre ist wird immer die unterste markiert.
Du musst dem Grid den Focus geben, dann wird auch die richtige markierung angezeigt. Oder du setzt dgAlwaysShowSelection auf true.
MouseCoord ist auf jeden Fall ein super Ansatz, den ich voll übersehen habe. Ursprünglich war allerdings nach den einzelnen Zellen gefragt, aber da sollte sich anhand der Spaltenbreiten auch irgendwie was machen lassen.
-
Was mache ich dann falsch? Vielleicht irgendwelche Einstellungen falsch?
Wenn es bei dir funkioniert, könnte ich vielleicht dein Projekt oder ein Beispielprojekt bekommen?
-
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 - DBGrid1->DataSource->DataSet->RecNo); DBGrid1->SelectedIndex = coord.X-1; } }Einzelne Zellen kannst du so markieren.
Muss natürlich dgRowSelection auf false.
-
carisma83:
Lade das FishFact-Beispiel unter %BCB%\examples\dbtasks, erzeuge ein OnMouseMove für das Grid und füge den Code von hellic ein.
Funktioniert Eins Ah.hellic:
Na geht doch!
-
Falls es doch nicht klappen sollte, könnte ich dir auch ein Beispielprojekt mailen.
-
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.
-
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.