StringGrid Einfügemarkierung
-
Guten Abend liebe Forengemeinde,
ich sitze hier mal wieder vor einem kleinen Problem.
Und zwar habe ich ein StringGrid in welches per Drag & Drop aus einer ListBox heraus neue Spalten eingefügt werden können. Der Text eines jeweiligen ListBox-Eintrages ergibt dann den Titel der StringGrid-Spalte. Soweit funktioniert das alles auch prima. Nun möchte ich aber eine Einfügemarke anzeigen, welche dem Benutzer anzeigt an welcher Stelle, bzw. zwischen welchen Spalten, die neue Spalte angelegt wird. Auch die Positionsbestimmung dieser Einfügemarke ist nicht das Problem, sonder die Einfügemarke selbst.
Dazu verwende ich ein Panel mit der Höhe des StringGrids und einer Breite von 3 Pixel. Dieses wird dann entsprechend an die erforderliche Position gesetzt und angezeigt. Nun ist es aber so, das wenn sich der Cursor genau über dem Angezeigten Panel befindet, keine Drop-Funktion möglich ist, sondern nur ausserhalb des Panels. Gibt es da einen Kniff um das dennoch zu ermöglichen, oder geht das nur durch zeichnen der Einfügemarke auf dem Canvas des StringGrids?Wäre nett wenn Ihr mir weiterhelfen könntet.
void __fastcall Form1::FormShow(TObject * Sender) { Panel->Parent = StringGrid; } bool Form1::viewColumnMargin(int iMouseX, int iMouseY) { int iColNr; TRect rtColRect; iColNr = StringGrid->MouseCoord(iMouseX, iMouseY).X; rtColRect = StringGrid->CellRect(iColNr, 0); if ((iColNr == 0) && (iMouseX < rtColRect.Right - 15)) { Panel->Visible = false; return (false); } if (iMouseX > rtColRect.Right - 15) { Panel->Left = rtColRect.Right - ScrollBox->HorzScrollBar->ScrollPos - 1; Panel->Visible = true; return (true); } else if (iMouseX < rtColRect.Left + 15) { Panel->Left = rtColRect.Left - ScrollBox->HorzScrollBar->ScrollPos - 2; Panel->Visible = true; return (true); } Panel->Visible = false; return (false); } void __fastcall Form1::StringGridDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept) { int iScrollPos; static int iCounter = 0; if (viewColumnMargin(X, Y) && (Y < StringGrid->DefaultRowHeight + 10)) { Accept = IsDragObject(Source); } else { Accept = false; } iCounter++; if (iCounter > 1) { iScrollPos = ScrollBox->ScreenToClient(Mouse->CursorPos).X; if (iScrollPos >= ScrollBox->Width - 10) { ScrollBox->Perform(WM_HSCROLL, SB_LINERIGHT, 0); } else if (iScrollPos <= 10) { ScrollBox->Perform(WM_HSCROLL, SB_LINELEFT, 0); } iCounter = 0; } }
Grüße Netzschleicher
-
Du kannst doch auch beim Panel das Drop-Ereignis zuweisen.
-
Vielen Dank für den Schubser in die richtige Richtung. Nun funktioniert es so wie es soll.
Vielen Dank