S
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