TStringGrid per rechtsklick markieren
-
tag,
ich möchte das bei rechtklick in einer TSringGrid ein popup aufgeht (was ja passiert) aber er auch die zeile(zelle) markiert.
weiss einer hilfe?
-
Im MouseDown-Event per TStringGrid::MouseToCell die Zellen-Koordinaten ermitteln und anschliessend Row und Col des StringGrids entsprechend setzen. Letzteres sollte ggf. auch über Selection funktionieren.
-
void __fastcall TForm1::StringGrid1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
long Column, Row;
StringGrid->MouseToCell(X, Y, Column, Row);
Caption=IntToStr(Column);
}also Column sind bei mir richtige Koordinaten .. was mach ich denn falsch?
-
Keine Ahnung, dazu müsstest du uns erstmal verraten, was das Problem ist.
-
Das Column Koordinaten sind und keine Indexe der StringGrid?
Normal wenn ich die Borland Hilfe verstanden habe, sollten aus dem X, Y die ich bei MouseUp erhalte Col und Row rauskommen damit ich damit die Cell ansprechen kann .. wenn ich nur 2 zeilen/3 spalten habe glaub ich nicht das 500 nen Index einer Spalte ist.
-
void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { int col, row; StringGrid1->MouseToCell(X, Y, col, row); StringGrid1->Col = col; StringGrid1->Row = row; }
-
vielen dank ..
also es liegt an "long" .. wenn ich wie du "int" nehme klappt es .. sobald "long" dann nicht mehr ..
-
sorry das ich dich nochmal belästige
void __fastcall TForm1::StringGrid1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { int col, row; try { StringGrid1->MouseToCell(X, Y, col, row); } catch(???) { StringGrid1->Col = col; StringGrid1->Row = row; } }
was muss bei ??? rein damit der nachfolgende code ausgeführt wird?
da wenn ich in StringGrid klicke und dort keine Celle ist eine Exception ausgeführt wird...
-
Was dort rein muss verrät dir die Exception-Meldung. Alternativ einfach ... eintragen, damit werden alle Exceptions abgefangen. Siehe auch die FAQ unter "Drucker".
if (Button == mbRight) { int col, row; try { StringGrid1->MouseToCell(X, Y, col, row); if (col >= StringGrid1->FixedCols && row >= StringGrid1->FixedRows) { StringGrid1->Col = col; StringGrid1->Row = row; } } catch(EInvalidGridOperation &E) { // optional Fehlermeldung ausgeben //ShowMessage("Fehler! " + E.Message); } }
In diesem Beispiel sind die Abfragen doppelt gemoppelt. Auf das try/catch könnte verzichtet werden, da bei einem Click ausserhalb der Zellen für col und row jeweils -1 zurückgegeben wird, was ja immer kleiner als FixedCols und FixedRows ist.
-
danke .. vielen dank