AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Library: VCL / WinForms / Controls Delphi ListBox-Einträge per Drag & Drop verschieben
Thema durchsuchen
Ansicht
Themen-Optionen

ListBox-Einträge per Drag & Drop verschieben

Ein Thema von Matze · begonnen am 8. Mär 2007 · letzter Beitrag vom 23. Mär 2007
Antwort Antwort
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

ListBox-Einträge per Drag & Drop verschieben

  Alt 8. Mär 2007, 15:20
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.
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#2

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

  Alt 23. Mär 2007, 14:28
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]
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  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 13:10 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