TStringGrid Klick auf fixed column oder row auswerten
-
Moin moin,
ich nutze ein TStringGrid-Objekt mit den Eigenschaften FixedCols und FixedRows (beides "1" als Überschrift und Nummerierung der Spalten und Zeilen).
Ich möchte nun aber über ein Klick auf genau diese Zelle ein Event auswerten.
Wie kann ich erfassen, auf welche fest fixierte Zelle ich geklickt habe?
Ein Event wird bei mir ja nur bei den Mausklick aufgerufen, wenn ich mit dem Mauszeiger auf die Zelle klicke, die NICHT fixiert ist.
Was muss ich also tun um das Event auf die fixierte Zelle auszubreiten und wie kann ich filtern, welche fixierte Zelle dabei angeklickt wurde?
Vorweg sei gesagt, dass ich die fixierten Zellen unbedingt benötige.
Ein guter Hinweis oder sogar ein Quelltextbeisiel würde mir sehr helfen.
Ich vertraue eure Erfahrung und Kompetenz.
Danke.
-
Hallo
Allgemein läßt sich im StringGrid die Mausposition in Zelle so umrechnen :
TPoint mousepos = Mouse->CursorPos; // globale Mausposition bestimmen mousepos = StringGrid1->ScreenToClient(mousepos); // global auf controlbezogen umrechnen int x; int y; StringGrid1->MouseToCell(mousepos.x, mousepos.y, x, y); // Zellen aus controlbezogener Mausposition berechnen Caption = IntToStr(x) + "." + IntToStr(y);
Allerdings reicht es in deinem Fall nicht, diesen Code in das OnClick des StringGrids zu packen, da gerade bei den fixed-Zellen kein OnClick ausgelöst wird.
Du must dann doch mithilfe der WinAPI die zugrundeliegende Mouse-Message abfangen, bevor StringGrid es auswertet und die fixed-Zellen herausfiltert. Eine Einführungen in WinAPI-Messages kannst du hier im Forums-Tutorial lesen.bis bald
akari
-
Hm, das geht wohl am einfachsten, indem Du die MouseUp-Funktion des StringGrid verwendest und dort auswertest, wohin geglickt wurde. Du bekommst dabei X / Y Koordinaten des Klicks übergeben und kannst diese mittels TStringGrid::MauseToCell() in die entsprechende Zelle umwandeln. Dann noch prüfen ob die zurückgelierte Zeile = 0 ist, schon weisst Du, ob in die Titelzeile geklickt wurde.
Edit: Huch, gar nicht gesehen, dass akari schon geantwortet hatte. Sollte beides funktionieren.
-
Ich bin wie immer sehr dankbar und freue mich über diese schnellen Antworten und den Quelltextbeispiel.
Danke, ich werde es ausprobieren und ggf. mein Ergebniss hier darlegen.
-
Hallo
Ja ich habe die Mouse-Events vergessen. Damit brauchst du keine WinAPI-Messages mehr. Und dann kannst du auch den Code vereinfachen :
int x, y; StringGrid1->MouseToCell(X, Y, x, y); // Zellen aus controlbezogener Mausposition berechnen Caption = "Down " + IntToStr(x) + "." + IntToStr(y);
bis bald
akari