![]() |
So etwas halte ich für einen OnMouse-Up-Bug in der ListBox
Hi,
habe zwei ListBoxen, bei denen ich mittel Drag'n Drop Items hin- und herverschiebe. Klappt. Aber nun soll die Listbox auch auf Doppelklick auf einem Item eine andere Aktion (andere Form öffnen) ausführen. Dabei soll das ziehen ohne "Zusatztaste" funtionieren. Drag'n Drop Start:
Delphi-Quellcode:
Aber bei Doppelklick auf Item soll Drag-Funktion abgebrochen werden:
procedure TFormLolc.ListBox1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if TListBox(Sender).Items.count > 0 then //if (Sender is TListBox) and (ssCtrl in Shift) then // soll OHNE Zusatztaste... TListBox(Sender).BeginDrag(False,5) end;
Delphi-Quellcode:
Nun öffnet sich FormDetail, ich kann die Form nutzen.
procedure TFormLolc.ListBox1DblClick(Sender: TObject);
var nr, Tabelle, Eintrag : String; begin TListBox(Sender).EndDrag(false); FormDetail.ShowModal; end; Aber nachdem das Form geschlossen wird, ist der MouseCursor wieder im "DragModus", d.h. ich muss ersteinmal in die ListBox1 klicken um weitermachen zu können. Egal wohin ich auch die "EndDrag"-Anweisung verschiebe. Ausser wenn ich sie ins OnMouseUp verschiebe, denn dann funktioniert das Drag'n Drop garnicht mehr, denn es wird bei einem BeginDrag in OnMouseDown automatisch OnMouseUp aufgerufen. Dieses hier halte ich für einen Bug (oder zumindest für nicht gewollt):
Delphi-Quellcode:
Klicke ich mit der Maustaste in die Listbox und halte sie gedrückt,
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin ListBox1.BeginDrag(false); end; procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ShowMessage('Mouse-UP aufgerufen grrrr'); end; wird trotzdem OnMouseUp ausgeführt. :wiejetzt: Hat jemand eine IDE? (gut, könnte mit (ssCtrl in Shift) arbeiten, will ich aber nicht) MJ |
Re: So etwas halte ich für einen OnMouse-Up-Bug in der ListB
Ein workaround? Den Cursor explizit setzen.
Screen.Cursor := crDefault |
Re: So etwas halte ich für einen OnMouse-Up-Bug in der ListB
Gerne :)
Hab's versucht, klappt nicht.
Delphi-Quellcode:
Bei Rückkehr/Schliessen von FormDetail ist Drag in der aufrufenden Form immer noch aktiv.
procedure TFormLolc.ListBox1DblClick(Sender: TObject);
var nr, Tabelle, Eintrag : String; begin ShowMessage('JETZT'); TListBox(Sender).EndDrag(true); Screen.Cursor := crDefault; //... FormDetail.ShowModal; end; MJ |
DP-Maintenance
Dieses Thema wurde von "alcaeus" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.
Sowas nenne ich \\"falsche Sparte\\". Gehoert eindeutig zu den VCL-Komponenten ;) |
Re: So etwas halte ich für einen OnMouse-Up-Bug in der ListB
Bei mir geschieht das gleiche (Drag wird nicht abgebrochen).
Ich hab mir mal die Controls.pas angeguckt: EndDrag bewirkt nur etwas, wenn Dragging = True ist. Listbox1.Dragging ist aber in Listbox1DblClick noch nicht True. Aber folgendes beispiel beendet das Dragging:
Delphi-Quellcode:
Es liegt also daran, dass FormDetail.ShowModal in ListBox1DblClick aufgerufen wird. Die Lösung ist, dass du FormDetail.ShowModal erst in Listbox1.OnEndDrag aufrufst:
procedure TForm1.ListBox1DblClick(Sender: TObject);
begin // FormDetail.ShowModal; tlistbox(Sender).EndDrag(false); Color:= not Color; // um zu sehen, ob was passiert end;
Delphi-Quellcode:
class TForm1: TForm
{...} private showFormDetailInEndDrag: boolean end; procedure TForm1.FormCreate(Sender: TObject); begin showFormDetailInEndDrag:= false; end; procedure TForm1.ListBox1DblClick(Sender: TObject); begin showFormDetailInEndDrag:= true; TListbox(Sender).EndDrag(false); end; procedure TForm1.ListBox1EndDrag(Sender, Target: TObject; X, Y: Integer); begin if showFormDetailInEndDrag then begin showFormDetailInEndDrag:= false; FormDetail.ShowModal; end; end; { übrige Funktionen zum Dragging... } |
Re: So etwas halte ich für einen OnMouse-Up-Bug in der ListB
Aha, wieder etwas dazugelernt.
Es funktioniert damit so wie es soll. :dance: Da hast Du aber sauber "um die Ecke gedacht", Respekt! Danke für die Hilfe und für deine Bemühungen! MJ |
Re: So etwas halte ich für einen OnMouse-Up-Bug in der ListB
Bitte, bitte!
..und ich hab auch gleich was über Drag&Drop gelernt. :dancer: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz