Ich kenne mich mit DragDrop leider noch gar nicht aus. Ich habe ein eigenes TMyGrid geschrieben, das ein Gitter darstellt und bei dem einzelne Zeilen vom Nutzer selektierbar sind und hervorgehoben werden.
Ich würde jetzt gerne ermöglichen, dass der Nutzer die selektierte Zeile per DragDrop ziehen kann und somit die Reihenfolge der Zeilen innerhalb meines eigenen TMyGrid-Objekts ändern kann. Da ich weiß, welche Zeile aktuell selektiert ist und ich auch die neuen Koordinaten beim Drop erhalte, kann ich dies theoretisch leicht umsetzen.
PROBLEM: Sobald ich aber in Create "DragMode := dmAutomatic" setze, kommen bei meiner Komponente gar keine MouseUp-Events mehr an. Man kann gar keine Zeile mehr selektieren, weil jeder Click sofort zum Beginn des DragDrop führt. Das DragDrop wird korrekt ausgeführt (ShowMessage) und auch DragOver wird ausgeführt (Accept := False verhindert das DragDrop).
FRAGE: Wie kann ich DragDrop so nutzen, dass es einerseits möglich ist, andererseits aber nicht MouseUp- und DblClick-Events verhindert? Geht doch auch in anderen Komponenten? Was habe ich noch nicht verstanden?
Code:
TMyGrid = class(TCustomControl)
protected
procedure DragDrop(Source: TObject; X, Y: Integer); override;
procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
public
constructor Create(AOwner : TComponent); override;
end;
procedure TMyGrid.DragDrop(Source: TObject; X, Y: Integer);
begin
ShowMessage('dropped');
end;
procedure TMyGrid.DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := True;
end;
constructor TMyGrid.Create(AOwner: TComponent);
begin
inherited;
DragMode := dmAutomatic;
end;