Page 1 of 2 1 2 LastLast
Results 1 to 15 of 16

Thread: BeginDrag gevalletje

  1. #1

    BeginDrag gevalletje

    Hoi beste programmeurs,

    Is er een oplossing voor het MouseDown geval 'BeginDrag' ?

    Ik heb nu bij Berg Nextsuite DeSelect bij MouseUp wat goed werkt. Probleem is nu natuurlijk dat 'BeginDrag' een MouseUp activeert en dat is niet te verhelpen. Zorgt er dan ook voor dat de selectie weg is.
    (Er zijn genoeg ideeën hierover via Google maar die werken niet wat wel bekend is)

    Weet iemand een oplossing? Het is echt een simpel DragDrop wat (geselecteerde) items kopieert.

    Groetjes,
    Dragon.

  2. #2
    Ik probeer chocola te maken van je vraag, maar ik snap het niet echt. Heb je een minimaal codevoorbeeldje adhwaarvan je het probleem kan uitleggen en demonstreren?
    1+1=b

  3. #3
    Zet maar een Listbox op een Form en dan:

    Code:
    procedure TfrmValueTest.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      Listbox1.BeginDrag(False);
    end;
    
    procedure TfrmValueTest.ListBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      { Komt hier direct na BeginDrag }
      Sleep(0);
    end;
    
    {Delphi}
    procedure TControl.BeginDrag(Immediate: Boolean; Threshold: Integer);
    var
      P: TPoint;
    begin
      if Mouse.IsPanning then
        Mouse.PanningWindow := nil;
      if (Self is TCustomForm) and (FDragKind <> dkDock) then
        raise EInvalidOperation.CreateRes({$IFNDEF CLR}@{$ENDIF}SCannotDragForm);
      CalcDockSizes;
      if (DragControl = nil) or (DragControl = FlagControl) then
      begin
        DragControl := nil;
        if csLButtonDown in ControlState then
        begin
          GetCursorPos(P);
          Perform(WM_LBUTTONUP, 0, PointToLParam(ScreenToClient(P)));
        end;
        { Use default value when Threshold < 0 }
        if Threshold < 0 then
          Threshold := Mouse.DragThreshold;
        // prevent calling EndDrag within BeginDrag
        if (DragControl <> FlagControl) then
          DragInitControl(Self, Immediate, Threshold);
      end;
    end;
    Laatste is natuurlijk van Delphi zelf waar je kan zien dat er een WM_LBUTTONUP wordt verzorgd.
    Voor BeginDrag ControlState := ControlState - [csLButtonDown] werkt niet.

    En die MouseUp willen we niet direct.

  4. #4
    Bedoel je dit probleem?
    https://stackoverflow.com/questions/...select-enabled

    Waarom zet je de DragMode van de TListBox niet op dmAutomatic?
    Dan heb je toch geen probleem? Of wel?

  5. #5
    Ik gebruik geen TListbox, alleen hier als voorbeeld.

    Ik denk dat het meer dit gevalletje is:

    https://www.devexpress.com/Support/C...-mouseup-event

    dmAutomatic misschien maar wil dat pas als je ook echt beweegt omdat je bij een klik niet meteen moet slepen. Vandaar de delay (false).

    Bekend probleem trouwens.

    EDIT: Denk dat die BeginDrag uit de MouseDown moet dus misschien met BeginTimer (of zoiets) en daarin BeginDrag. Zomaar brainwave.

    EDIT2: dmAutomatic gaat wel goed maar had ik al uitgelegd.
    Last edited by DragonFly; 16-Jul-19 at 13:45.

  6. #6
    En werkt de ControlState - [csLButtonDown]; dan wel?
    Die kun je eventueel in de EndDrag weer terugzetten.

    Ik gebruik overigens MouseMove (na de MouseDown) om pas een dragbegin te doen wanneer ik over een bepaalde Threshold ga (qua afstand).
    Ik weet niet zeker meer waarom ik de Threshold van DragBegin niet gebruik.
    Misschien omdat ik ook een DoDragDrop() voor het aanmaken en droppen van bestanden buiten mij applicatie doe (bij Threshold * 5).

  7. #7
    Dat ControlState - [csLButtonDown] werkt eenmalig. Logisch want dan is het over. Na MouseDown komt MouseUp maar MouseDown is nog niet gesloten. Bij deze grap zal je nooit meer kunnen Deselecteren.
    Je zou ook een Bool kunnen zetten zoals FireMouseUp := False en na BeginDrag FireMouse := True. Echter die blijft altijd True.

    Dat MouseMove is interessant heb je voorbeeldje?
    Je zou dan ook een keer hetzelfde probleem hebb gehad en nu vergeten?
    Mini voorbeeld dat lijkt mij fijn?

  8. #8
    Quote Originally Posted by DragonFly View Post
    Dat ControlState - [csLButtonDown] werkt eenmalig. Logisch want dan is het over. Na MouseDown komt MouseUp maar MouseDown is nog niet gesloten. Bij deze grap zal je nooit meer kunnen Deselecteren.
    Maar je kunt toch in EndDrag weer ControlState + [csLButtonDown] doen? Of werkt dat niet?

    Ik zal als ik weer achter een computer zit even het voorbeeld van MouseDown/MouseMove/Threshold laten zien.

  9. #9
    Na een MouseUp volgt denk ik MouseDown dus dan werkt het niet meer. ControlState + [csLButtonDown] doen. Of ervoor -
    Je krijgt dus een herhaal proces.

  10. #10
    Nee, je hebt eerst MouseDown en pas bij het loslaten van de muisknop een MouseUp.

  11. #11
    Niet bij BeginDrag start in de MouseDown. Dan krijg je MouseUp.
    Zie je stukje source morgen wel.

    Dit is gewoon de grap:

    procedure TControl.BeginDrag(Immediate: Boolean; Threshold: Integer);
    {}
    if csLButtonDown in ControlState then
    begin
    GetCursorPos(P);
    Perform(WM_LBUTTONUP, 0, PointToLParam(ScreenToClient(P)));
    end;

  12. #12
    Ja, maar daar maakt vulgens mij dan niet meer uit. De enddrag wordt altijd uitgevoerd nadat de hele drag pas is afgelopen. Dus daarin zou je die ControlState weet moeten kunnen herstellen. Daarvoor maakt het toch niet uit dat je de knoppen niet kunt gebruiken (omdat de drag-funtie nog bezig is).

    Maar ik zal zelf even kijken of me dat lukt met multiselect en drag.

  13. #13
    OnDragBegin wordt direct uitgevoerd. Ook al heb je je de muis niet bewogen. En dan direct OnDragEnd.
    Is dus een lus eindeloos. Testen met breakpoint is natuurlijk altijd lastig. l

  14. #14
    Ik krijg bij de listbox al de multiselect niet eens gesleept. Omdat je het slepen pas doet bij de enkelklik, is het probleem dat de MouseDown al gelijk zorgt voor het deselecteren van de items.

    Quote Originally Posted by DragonFly View Post
    dmAutomatic misschien maar wil dat pas als je ook echt beweegt omdat je bij een klik niet meteen moet slepen. Vandaar de delay (false).
    Dit zou pas bij het echte slepen moeten gebeuren. Niet bij een klik. Maar overigens kun je de Threshold ook zelf aanpassen die gebruikt wordt in dmAutomatic.
    Als je bijvoorbeeld dit doet in de FormCreate dan zul je al zien dat het heel veel uitmaakt.
    Delphi Code:
    1. Mouse.DragThreshold := 100;
    En dit werkt met de TListBox op dmAutomatic met multiselect perfect.


    Wat betreft het handmatige Threshold voorbeeld.

    Delphi Code:
    1. //..
    2.   public
    3.     { Public declarations }
    4.     FDragStartPos: TPoint;
    5. //..
    6.  
    7. procedure TBoek.DBGrid1MouseDown(Sender: TObject; Button: TMouseButton;
    8.   Shift: TShiftState; X, Y: integer);
    9. begin
    10.   if Button = mbLeft then
    11.   begin
    12.     FDragStartPos.x := X;
    13.     FDragStartPos.Y := Y;
    14.   end;
    15. end;
    16.  
    17. procedure TBoek.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer);
    18. const
    19.   Threshold = 25;
    20. begin
    21.  
    22.   if Sender.InheritsFrom(TDBGrid) then
    23.   begin
    24.  
    25.     // bugfix voor dubbelclick !!
    26.     if not(csLButtonDown in TDBGrid(Sender).ControlState) then
    27.     begin
    28.       FDragStartPos.x := x;
    29.       FDragStartPos.Y := Y;
    30.     end;
    31.  
    32.     if (csLButtonDown in TDBGrid(Sender).ControlState) and
    33.       ((Abs(x - FDragStartPos.x) >= Threshold) or (Abs(Y - FDragStartPos.Y) >= Threshold)) then
    34.     begin
    35.  
    36.           TDBGrid(Sender).BeginDrag(true, 0);
    37.  
    38.     end;
    39.  
    40.   end;
    41.  
    42. end;

  15. #15
    Ik ga het morgen bekijken want nu gaan de lichtjes uit.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •