TStringGrid: FixedRow anklicken?
-
Hallo,
gibt es eine Möglichkeit, abzufangen, wenn der Benutzer in einem TStringGrid in eine Fixed-Cell klickt?
Irgendwie wird da weder ein OnClick, noch SelectCell etc. ausgewählt. Ich möchte ähnlich wie in so manchem DBGrid die Inhalte unter Fixed-Cell x auf einen Klick sortieren.
Die Suchfunktion und Hilfe haben mich leider auch nicht viel weiter gebracht.
Danke,
Mipe
-
OnMouseDown und MouseToCell?
-
hi,
hier mal ein beispiel, wie ich das bei mir realisiert habe. wichtig ist, das du auf mousedown und mouseup reagieren musst, dann ist der rest ganz einfach.
//--------------------------------------------------------------------------- // h-file //--------------------------------------------------------------------------- private: int clicked; //--------------------------------------------------------------------------- // cpp-file //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { clicked = -1; } //--------------------------------------------------------------------------- void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State) { TStringGrid *StringGrid = static_cast <TStringGrid*> (Sender); // bedingung prüfen und wenn gültig programm beenden assert(StringGrid != NULL); TCanvas* SGCanvas = StringGrid->Canvas; SGCanvas->Font = StringGrid->Font; RECT RText = static_cast <RECT> (Rect); // text der jeweiligen spalte const AnsiString text(StringGrid->Cells[ACol][ARow]); // fixes zellen malen if (State.Contains(gdFixed)) { SGCanvas->Brush->Color = clBtnFace; SGCanvas->Font->Color = clWindowText; SGCanvas->FillRect(Rect); // wenn spalte geklickt wurde die farbe ändern um klick zu simulieren if (ACol == clicked) Frame3D(SGCanvas, Rect, clBtnShadow, clBtnShadow, 1); else Frame3D(SGCanvas, Rect, clBtnHighlight, clBtnShadow, 1); } else { // markierte zellen malen if (State.Contains(gdSelected)) { SGCanvas->Brush->Color = clHighlight; SGCanvas->Font->Color = clHighlightText; } // alle anderen zellen else { // standardfarben verwenden SGCanvas->Brush->Color = StringGrid->Color; SGCanvas->Font->Color = StringGrid->Font->Color; } } // zeichenfläche löschen SGCanvas->FillRect(Rect); // text nicht ganz an den rand klatschen RText.left += 2; // zelle zeichnen (einzeilig und vertikal-zentriert) DrawText(SGCanvas->Handle, text.Trim().c_str(), text.Trim().Length(), &RText, DT_SINGLELINE | DT_VCENTER); } //--------------------------------------------------------------------------- void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { int Row, Col; // mauskoordinaten ind zellenwerte umwandeln StringGrid1->MouseToCell(X, Y, Col, Row); // ereignis nur verarbeiten, wenn in zeile 0 und // mit linker maustaste geklickt wurde if ((Row != 0) || !Shift.Contains(ssLeft)) return; // spalte merken clicked = Col; // stringgrid neuzeichnen StringGrid1->Invalidate(); } //--------------------------------------------------------------------------- void __fastcall TForm1::StringGrid1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { int Row, Col; // mauskoordinaten ind zellenwerte umwandeln StringGrid1->MouseToCell(X, Y, Col, Row); // wenn zeile != 0 dann abbruch if (Row != 0) return; // geklickte spalte wieder löscheb clicked = -1; // stringgrid neuzeichnen StringGrid1->Invalidate(); // hier kannst du jetzt zum beispiel nen sortieralgorithmus hinpacken // oder sonstige verarbeitung mit der fixen zelle anstellen } //---------------------------------------------------------------------------
ciao