Autor Beitrag
ALF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 18.10.09 17:41 
Hi
Das MouseEvent MouseDown benutzte ich für die DragDrop aktion BeginDrag(False)
Das MouseEvent MouseUp benutze ich für andere Aufgaben
Problem:

Wenn ich in dem MouseDown event mit der linken MouseTaste drücke, die MousTaste aber nicht loslasse,
wird das MouseUp event trotzdem ausgeführt.
Deaktiviere ich die aktion BeginDrag(False) funct MouseUp richtig.
Sehe also eine Abhängikeit darin!

Frage: Was muss ich ändern oder berücksichtigen das beides unabhäng funktioniert???
Hinweis: die GaugeKomponenten zeigen mit den Ereignissen MouseUp/MouseDown auch auf diese proceduren
ist kein guter Still kann man aber machen 8)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
procedure TForm1.ScrollBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin

   if (Button = mbLeft) then
   begin
         dragindex := (Sender as TGaugeCaption).ComponentIndex;
        (Sender as TGaugeCaption).BeginDrag(False);  //<- wenn auskommentiert funct mousUp

   end;

end;


procedure TForm1.ScrollBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
   gaugeindex: Integer;
   names: String;
begin

   GetCursorPos(pos);
   names := Copy(FindDragTarget(pos, False).Name, 010);
   index := ScrollBoxNames.IndexOf(names);
   if Button = mbLeft then
   begin
        gaugeindex := (Sender as TGaugeCaption).ComponentIndex;
        SetBkColor(index, gaugeindex);  // <-procedur um BackColor der Gauge zu setzen
  end;
end;


gruss Alf


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am So 18.10.2009 um 23:32

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!


Zuletzt bearbeitet von ALF am So 25.10.09 00:12, insgesamt 1-mal bearbeitet
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Mi 21.10.09 15:09 
Hi, alle Miteinander
Ich weiss, es ist nicht erwünscht einen thread noch oben zuschieben. :oops:
Habe aber nun einiges versucht, mit anderen Routienen die Botschaften abzufangen, um zu verhindern das MousUp ausgeführt wird solange die Mousetaste gedrückt ist, wie gesagt kein Erfolg!
Habe nun keine Ideen mehr..... :x

Vielleicht habt ihr noch ideen oder infos darüber :idea:

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 21.10.09 21:33 
ich kenn mich mit dem BeginDrag nicht so genau aus, was du aber machen kannst nach dem Motto
user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:

ist kein guter Still kann man aber machen 8)

ist, dass du bei BeginDrag eine Variable auf True setzt (z.B: "Dragging:=True") und beim MouseUp ist die erste Abfrage
ausblenden Delphi-Quelltext
1:
2:
3:
4:
if Dragging=False then
  begin
    [...]
  end;

Nach dem Draggen die Variable einfach wieder auf False setzen. Das funktioniert auf jeden Fall ;)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mi 21.10.09 21:34 
Anmerkung: Durch das "pushen" deines Topics hätte ich es normalerweise übersehen, denn ich gucke mir immer die "Unbeantworteten Beiträge" an, wenn ich wenig Zeit habe :D

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 22.10.09 17:27 
hi, Thx für ne Möglichkeit, bringt aber leider nix, jedenfalls bei mir, habe ja schon vieles versucht incl abfragen von TMouse und zusätzlichen Variablen, wurde nur noch chaotischer :nut:
ausblenden Delphi-Quelltext
1:
2:
3:
....
(Sender as TGaugeCaption).BeginDrag(False);
....


führt ja noch keine dragaktion aus, sondern erst wenn die mouse bewegt wird mit linken mousebutton!
Wie gesagt:
obwhol ich nichts bewege, lediglich die linke mousetaste gedrückt halte wird schon mouseup durchgeführt!
Ne zusätzlich Abfrage einer Variablen bedeuted ja nix anderes als, hast du die Mausetaste losgelassen oder bewegt oder oder oder. So könnte man ja auch sagen benutze doch einfach die rechte MouseTaste dafür usw.
Dafür sollten ja eigentlich die events da sein, nur gibt es da für mich keine Erklärung warum die Procedure MousUp ausgeführt wird!!

Wahrscheinlich bin ich blind und seh den Fehler nicht :eyes:

Andere werden doch auch DragDrop, Abfragen der Mousetasten usw..... drin haben und die Standarts Events benutzen!?

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!


Zuletzt bearbeitet von ALF am Do 22.10.09 17:58, insgesamt 1-mal bearbeitet
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 22.10.09 17:47 
Was auch immer du da genau machst (TGaugeCaption :?: ) ich habs jetzt mal in Delphi mit nem Button nachgebastelt...gleicher Fehler...

Was mir sofort auffällt, mit OnEndDrag gehts ;)

Jetzt hab ich mir einfach mal den Source von BeginDrag anzeigen lassen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TControl.BeginDrag(Immediate: Boolean; Threshold: Integer);
var
  P: TPoint;
begin
  if (Self is TCustomForm) and (FDragKind <> dkDock) then
    raise EInvalidOperation.CreateRes(@SCannotDragForm);
  CalcDockSizes;
  if (DragControl = nilor (DragControl = Pointer($FFFFFFFF)) then
  begin
    DragControl := nil;
    if csLButtonDown in ControlState then
    begin
      GetCursorPos(P);
      P := ScreenToClient(P);
      Perform(WM_LBUTTONUP, 0, Longint(PointToSmallPoint(P)));
    end;
    { Use default value when Threshold < 0 }
    if Threshold < 0 then
      Threshold := Mouse.DragThreshold;
    // prevent calling EndDrag within BeginDrag
    if DragControl <> Pointer($FFFFFFFFthen
      DragInitControl(Self, Immediate, Threshold);
  end;
end;

Interessanterweise ist es Definition der Procedure BeginDrag, dass sie auf das Objekt ein WM_LBUTTONUP macht...warum auch immer.

So gesehen hast du 5 Möglichkeiten (die mir da so einfallen):

1) Du kommentierst einfach die Zeile da oben aus (man sollte aber nicht in den Units rumpfuschen wenn man nicht ganz genau weiß, warum das wie ist.

2) Du machst einfach ne neue Klasse (abgeleitet von deiner TGaugeCaption) und überschreibst die procedure (das ist allerdings vergleichsweise aufwändig)

3) oder du verwendest OnEndDrag (wenn möglich)

4) Du könntest natürlich auch vor BeginDrag das Event OnMouseUp einfach aus der TGaugeCaption rausnhemen und danach wieder reinsetzen

5) oder aber wie ich vorgeschlagen habe:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
procedure TForm1.ScrollBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin

   if (Button = mbLeft) then
   begin
         dragindex := (Sender as TGaugeCaption).ComponentIndex;
         StatusBeginDrag:=True;
        (Sender as TGaugeCaption).BeginDrag(False);  //<- wenn auskommentiert funct mousUp
        StatusBeginDrag:=False;

   end;

end;


procedure TForm1.ScrollBox1MouseUp(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);
var
   gaugeindex: Integer;
   names: String;
begin
   if  StatusBeginDrag=False then
     begin
       GetCursorPos(pos);
       names := Copy(FindDragTarget(pos, False).Name, 010);
       index := ScrollBoxNames.IndexOf(names);
       if Button = mbLeft then
       begin
            gaugeindex := (Sender as TGaugeCaption).ComponentIndex;
            SetBkColor(index, gaugeindex);  // <-procedur um BackColor der Gauge zu setzen
       end;
     end;
end;


Anmerkung:
Ich vermute mal, das BeginDrag dragged einfach nur das Objekt (und nicht das mit der Maus gedrückte Objekt). Der eine Vorgang ist also praktisch MouseDown/MouseUp (anklicken). Draggen ist aber ein davon getrennter Vorgang, bevor er jetzt also den Drag-Vorgang beginnt, beendet er erstmal den Anklick-Vorgang.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 22.10.09 18:13 
sorry habe meinen Antwort zulange editiert, und jetzt erst gesehen was du geschrieben hast,

wie gesagt hab es umgesetzt und mouseup funct gleich gar nicht mehr!!
du hast aber recht begindrag löst mouseup aus und kehrt nicht in das event mousedown zurück!!
siehe statusbegindrag=False!!!!!!!

bleibt auf true. :nixweiss:

bleibt also nix anderes übrig mouseup garnicht zu benutzen

Gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Do 22.10.09 18:52 
StatusbeginDrag:=False wird nicht ausgeführt? hmm...naja, du kannst natürlich im OnMouseUp schreiben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
if StatusBeginDrag=False then
  [...]
else
  StatusBeginDrag:=False;


Das ist aber nicht so toll...also doch OnEndDrag

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: Do 22.10.09 19:09 
nice :lol:
war natürlich nix, weil mousedown ja immer der Auslöser ist!
und onendrag kommt nur wenn dragging und das ist beim normalen klick ebend nicht!

Finde es aber trotzdem interessant das noch niemand so ein Problem hatte!!! :?:

also in Kombination
MouseDown -> BeginDrag
und
MouseUp

Egal, habe aber wieder was gelernt :les:

Wie gesagt muss das ebend anders coden ohne event MouseUp!!

grosses THX für die Mühe

Gruss Alf

Ich lass den thread offen, vielleicht schauen noch andere rein !!

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!
ALF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1085
Erhaltene Danke: 53

WinXP, Win7, Win10
Delphi 7 Enterprise, XE
BeitragVerfasst: So 25.10.09 00:48 
Hi, Ihr Leute,
Habe mich jetzt mit diesem Problem 2Tage lang beschäftigt :les:
Debugt ohne Ende, und komme zum Schluss auf ein mhhh... evtl Fehler bei den Coder von Delphi :?:

Fakt ist, das eigentliche dragging ist unabhängig mit welcher Maustaste man es durchführt!!!!
Die Procedure BeginDrag weist an den makierten Stellen eine mhhh.. keine Logik auf!!
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TControl.BeginDrag(Immediate: Boolean; Threshold: Integer);
var
  P: TPoint;
begin
  if (Self is TCustomForm) and (FDragKind <> dkDock) then
    raise EInvalidOperation.CreateRes(@SCannotDragForm);
  CalcDockSizes;
  if (DragControl = nilor (DragControl = Pointer($FFFFFFFF)) then
  begin
    DragControl := nil;
    if  csLButtonDown in ControlState then  //<--- nur linke Maustaste
    begin
      GetCursorPos(P);
      P := ScreenToClient(P);
      Perform(WM_LBUTTONUP0, Longint(PointToSmallPoint(P))); //<-- nur linke Maustaste
    end;
    { Use default value when Threshold < 0 }
    if Threshold < 0 then
      Threshold := Mouse.DragThreshold;
    // prevent calling EndDrag within BeginDrag
    if DragControl <> Pointer($FFFFFFFFthen
      DragInitControl(Self, Immediate, Threshold);
  end;
end;

Benutzte ich eine andere Moustaste für das dragging kommt es hier, bezogen auf das DragObjekt , zu keinem Mouesupevent :!: , da es nur auf die linke Maustaste ausgelegt ist!

Wenn, wie ich es gemacht habe die
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
if csLButtonDown in ControlState then  //<--- nur linke Maustaste
    begin
      GetCursorPos(P);
      P := ScreenToClient(P);
      Perform(WM_LBUTTONUP, 0, Longint(PointToSmallPoint(P))); //<-- nur linke Maustaste
    end;


ausdokumentiere, passiert im Prinzip auch nichts, ausser das es für die linke Taste kein Mouseupevent mehr gibt!(gibt es ja bei den anderen Tasten auch nicht) :wink:

Würde ich nun als Linkshänder die Mouse in Windows umstellen und die rechte Maustaste als Standart festlegen, würde im Prinzip nichts sonderliches passieren, aber wie gezeigt ... mhh.

Leider habe ich beim debugen festgestellt, das es einige Stellen gibt, wo von vornherein nur die linke MouseTaste definiert wurde, das bringt zwar das Programm nicht zum Absturz, aber, um z.B. das jeweilige HNDL wieder frei zugeben, müssen ebend zusätzlich Routinen durchlaufen werden. So auch in diesem Beispiel :?

Warum und weshalb man dieses so fixiert hatt mhhh.... :?!?: einen Sinn sehe ich darin nicht!!

Konkret heisst dies: wer mit BeginDrag arbeitet, kann das Mouseupevent des DragOpjekt nicht für spezielle Aufgaben verwenden, was natürlich nicht im Sinne des Programmieren ist!
Das gleiche ist auch bei AutoDrag. Es ruft die selbe Procedure BeginDrag auf.
Der unterschied, es wird sofort das DragDropevent ausgeführt!(Für Games Coder gut geeignet)

Leider habe ich auch nirgend ein Hinweis gelesen oder gefunden warum dies so definiert ist, zumal ja auch andere Mousbutton verwendet werden können!
Nun könnte man sagen, Frage doch bei Delphi nach.
ja ja würde ich gerne machen, leider ist mein Engl. toooooo Bad :oops:

Fazit: 2Tage was gesehen und gelernt, mir aber hilft es in diesem Sinne gar nicht :(

Ich hoffe das meine Erkenntnis richtig ist!!

gruss Alf

_________________
Wenn jeder alles kann oder wüsste und keiner hätt' ne Frage mehr, omg, währe dieses Forum leer!