Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: VCL / WinForms / Controls (https://www.delphipraxis.net/24-library-vcl-winforms-controls/)
-   -   Delphi ListBox-Einträge per Drag & Drop verschieben (https://www.delphipraxis.net/87994-listbox-eintraege-per-drag-drop-verschieben.html)

Matze 8. Mär 2007 15:20


ListBox-Einträge per Drag & Drop verschieben
 
Wie es möglich ist, alle selektierten Einträge einer ListBox mit der Maus zu verschieben, zeigt bitsetter in diesem Beitrag. Dies funktioniert mit und ohne aktiviertem MultiSelect.

Hierfür muss DragMode auf dmAutomatic stehen.

Delphi-Quellcode:
procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
var
  verschieben, ItemPos, i: integer;
begin
  Accept := false;
  if not (Source is TListBox) then
    Exit;
  if (Source as TListBox).MultiSelect then
  begin
    if (Source as TListBox).SelCount < 0 then
      Exit;
  end else begin
    if ((Source as TListBox).ItemIndex < 0) then
      Exit;
  end;

  with Source as TListBox do
  begin
    ItemPos := ItemAtPos(point(x,y), true);
    if (ItemPos < 0) or (ItemPos >= Items.Count) then
      Exit;
    if Selected[ItemPos] then
      ItemIndex := ItemPos;

    verschieben := ItemIndex - ItemPos;

    if verschieben <> 0 then
    begin
      if verschieben > 0 then
        i := 0
      else
        i := pred(Items.Count);

      while (i >= 0) and (i < Items.Count) do
      begin
        if Selected[i] then
        begin
          if (i-verschieben >= 0) and (i-verschieben < Items.Count) then
          begin
            Items.Move(i, i-verschieben);
            Selected[i]:=false;
            Selected[i-verschieben]:=true;
          end else begin
            break;
          end; // if
        end; // if

        if verschieben > 0 then
          inc(i)
        else
          dec(i);
      end; // while
    end; // if
  end; // with
  Accept := true;
end;

Edit: Chakotays Ergänzung hinzugefügt.

Lannes 23. Mär 2007 14:28

Re: ListBox-Einträge per Drag & Drop verschieben
 
Hallo,

die Zeilen [42..43]:
Delphi-Quellcode:
  Selected[i]:=false;
  Selected[i-verschieben]:=true;
verursachen bei älteren Delphi-Versionen (im Test D3)eine Zugriffsverletzung.
Eine Zuweisung an Selected[x] bei der Einstellung MultiSelect := False ist die Ursache. In z.B. D2005 besteht das Problem nicht mehr.

Das Problem kann so behoben werden:

Delphi-Quellcode:
//...
  begin
    Items.Move(i, i-verschieben);
    if Multiselect then
    begin
      Selected[i]:=false;
      Selected[i-verschieben]:=true;
    end
    else
      ItemIndex := i-verschieben;
  end
  else
  begin
//...
[edit=CalganX]Mfg, CalganX[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 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