AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Draggen und klicken bei einem Objekt beides ermöglichen
Thema durchsuchen
Ansicht
Themen-Optionen

Draggen und klicken bei einem Objekt beides ermöglichen

Ein Thema von BenjaminH · begonnen am 23. Aug 2010 · letzter Beitrag vom 13. Sep 2010
Antwort Antwort
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#1

Draggen und klicken bei einem Objekt beides ermöglichen

  Alt 23. Aug 2010, 22:38
Hi,
ich hab hier ein Objekt, das
  1. auf klicken reagieren soll
  2. per Drag'n'Drop woanders hin gezogen werden können soll
sobald ich aber DragMode auf dmAutomatic habe, wird OnClick nicht mehr aufgerufen.
Gibts eine möglichkeit sowohl das Draggen, als auch das klicken zu ermöglichen?
Vielen Dank,
Benjamin
Benjamin
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Draggen und klicken bei einem Objekt beides ermöglichen

  Alt 23. Aug 2010, 22:47
Schaue dir mal Object.BeginDrag an.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Draggen und klicken bei einem Objekt beides ermöglichen

  Alt 24. Aug 2010, 06:27
Und dmManual.... Du musst also das dragging selbst programmieren, wie omata schon erwähnte, mit BeginDrag... EndDrag.

Ich würde auch eine Verzögerung beim Click einbauen, sodaß das dragging erst mit einer kleinen Verzögerung einsetzt. Dann kann man klicken, bevor die dragging-Logik greift.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#4

AW: Draggen und klicken bei einem Objekt beides ermöglichen

  Alt 24. Aug 2010, 06:34
Ich würde das Draggen nicht Zeitverzögert auslösen, sondern von der Mausposition abhängig machen.

Im OnMouseDown die Klickposition speichern und wenn im OnMouseMove (wärend die Maustaste noch gedrückt ist) sich die Maus ein gewisses Stückchen bewegt hat, dann das Dragging starten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
293 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Draggen und klicken bei einem Objekt beides ermöglichen

  Alt 24. Aug 2010, 06:59
Moin auch

Wenn du im MouseDown mittels BeginDrag(False) startest, muss du erst die Maus ein Stück bewegen, bis der Dragmodus beginn.

Stefan
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#6

AW: Draggen und klicken bei einem Objekt beides ermöglichen

  Alt 24. Aug 2010, 09:40
Ja, das kommt der Sache schon sehr nahe.
Nur wird jetzt das klicken auch, wenn ich eigentlich nur draggen will ausgelöst.
Aber dagegen werde ich vorgehen indem ich entweder dann nur auf Doppelklick reagiere, oder statt OnClick OnMouseUp nehme.
Vielen Dank!
Benjamin
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Draggen und klicken bei einem Objekt beides ermöglichen

  Alt 10. Sep 2010, 17:15
Ich habs jetzt folgendermaßen probiert:
In OnMouseDown wird BeginDrag(false, DragThreshold) aufgerufen.
Statt des normalen OnClick habe ich dafür OnMouseUp reagiert, um entscheiden zu können, ob das Objekt gedraggt wurde, oder nicht.
if not TControl(Sender).Dragging then Jetzt habe ich folgendes Problem: BeginDrag ruft Perform(WM_LBUTTONUP, 0, Longint(PointToSmallPoint(P))); auf. Dadurch wird OnMouseUp aufgerufen, obwohl das nicht passiert, wodurch sich mein Objekt nicht so verhält wie ich es will.
Weiß jemand, wie ich es hinbekomme, dass bei OnMouseDown das Dragging beginnt und bei OnMouseUp der Klick ausgelöst wird - aber nur, wenn der Anwender nicht draggt

Vielen Dank,
Benjamin
Benjamin
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#8

AW: Draggen und klicken bei einem Objekt beides ermöglichen

  Alt 11. Sep 2010, 18:56
Hallo Benjamin,

vielleicht kannst du in der Behandlungsroutine für das Ereignis OnMouseMove den gewünschten Effekt erzwingen:
Delphi-Quellcode:
procedure TDemoForm.Panel1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
  C: TControl;
begin
  C := Sender as TControl;

  if (csLButtonDown in C.ControlState) then
    begin
      C.ControlState := C.ControlState - [csLButtonDown];
      C.BeginDrag (False);
    end;
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#9

AW: Draggen und klicken bei einem Objekt beides ermöglichen

  Alt 12. Sep 2010, 09:31
Dann wird leider OnMouseUp nicht mehr aufgerufen.
Irgendwie ist das alles komisch. Z.b. im Windows Explorer ist das Verhalten, das ich will völlig normal.
Benjamin
  Mit Zitat antworten Zitat
BenjaminH

Registriert seit: 14. Okt 2004
Ort: Freiburg im Breisgau
713 Beiträge
 
Turbo Delphi für Win32
 
#10

AW: Draggen und klicken bei einem Objekt beides ermöglichen

  Alt 13. Sep 2010, 15:19
So - jetzt hab ichs.
Als erstes hab ich eine Variable eingeführt: HandledMouseClick. Sie enthält, wie der Name sagt, ob der Klick schon "ausgeführt" wurde.
Im OnMouseDown wird geprüft, ob das Item meiner Liste schon markiert ist, wenn nicht, dann wirds erstmal markiert.
Delphi-Quellcode:
if not (Sender as TVisualFile).Selected then
begin
  SelectItem(Sender);
  HandledMouseClick:=True;
end;
Im OnMouseMove wird geprüft, ob die Maus sich weiter als ein bestimmter wert bewegt hat. Wenn ja, dann wird HandledMouseClick auf True gesetzt und BeginDrag ausgeführt. Unabhängig davon, welchen Wert HandledMouseClick davor hatte.
Im OnMouseUp wird wenn HandledMouseClick false ist das Item angewählt.(Also nur, wenn es nicht schon im MouseDown angewählt wurde und kein Dragging stattfand).
Danach wird HandledMouseClick wieder auf false zurückgesetzt.

Verhält sich so, wie es sich richtig anfühlt.
Benjamin
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz