Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - listbox drag and drop


Chatfix - Mi 03.07.02 14:26
Titel: listbox drag and drop
hi

ich hab 2 Probleme, möchte das der User die einträge in der Listbox manuell per maus hoch und runter schieben kann (man kann nur einen eintrag markieren)

und 2. möchte ich wenn man eine datei in die listbox zieht das die listbox dann diese datei lädt (also loadfromfile)

kann mir jmd helfen, hab kein plan wie ich as machen könnte


Alfons-G - Do 04.07.02 18:01

Hi,
da hab' ich ein Stück Code für Dich:

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:
36:
37:
38:
39:
40:
procedure TMainForm.LMDListBox1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  if Source is TLMDListBox then
    Accept := true;
end;

procedure TMainForm.LMDListBox1DragDrop(Sender, Source: TObject; X,
  Y: Integer);

var
  i: integer;

begin
  i := LMDListBox1.ItemAtPos (Point(x,y),true);
  if i > -1 then
    begin
    LMDListBox1.Items.Move (Zeile ,i);
  end;
end;

procedure TMainForm.LMDListBox1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

var
  LPos: integer;

begin
  LPos := LMDListBox1.ItemAtPos (Point(x,y),true) ;
  if LPos > -1 then
    begin
    try
    Zeile := LPos;
    LMDListBox1.BeginDrag (false);
    imgVorschau.Picture.LoadFromFile (strPixBase + '\' +
      LMDListBox1.Itempart (LPos, 0));
    except
    end;
  end;
end;
In diesem Programm habe ich lediglich statt der normalen Listbox die LMDListBox aus den LMD-Komponenten verwendet. Diese ist mehrspaltig, man kann mit ItemPart(Zeile,Spalte) auf die einzelnen Spalten zugreifen.
Ansonsten geht es mit einer normalen Listbox genauso.
Das Programm, ein Tool zum Erstellen von Vorschau-Seiten als HTML-Datei, lädt jeweils das aktuell markierte Bild in sein Vorschaufenster.


:idea:

Moderiert von user profile iconKlabautermann: Code- durch Delphi-Tags ersetzt


Chatfix - Fr 05.07.02 13:14

sorry ich kann damit gar nix anfangen, kann mir nciht irgendjemand mal den code dafür geben, es reicht auch wenn nur eine problem gelöst wird...

ich hatte mal den code dafür und dachte er wäre aus diesem forum, hab aber nichts mehr gefunden...


Chatfix - Sa 06.07.02 10:01

also ich hab mich nochmal hingesetzt, und hab einwas geschaft. Mit folgendem code kann man jetzt einträge in der Listbox beliebig verschieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
ListBox1.Items.Move(ListBox1.ItemIndex,ListBox1.ItemAtPos(point(x,y),true));
end;

procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
if source is TListbox then accept:=true else accept:=false;
end;


Dann noch die Eigenschaft DragMode auf DmAutomatic und fertig ist der Spass.

Moderiert von user profile iconKlabautermann: Code- durch Delphi-Tags ersetzt


xcellent - Mi 04.07.07 13:32
Titel: weiterer Lösungsansatz
Man kann auch ohne Drag & Drop einfach die Zeilen tauschen...


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:
36:
37:
38:
39:
40:
41:
42:
43:
44:
//global 
var HoldIndex : Integer;

procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  //hold index
  HoldIndex := TListBox(Sender).ItemAtPos(point(x,y),true);
end;

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  try
    if ((Holdindex > -1)and
        (HoldIndex <> TListBox(Sender).ItemAtPos(point(x,y),true))and
        (HoldIndex < TListBox(Sender).Items.Count)
       ) then
    begin

      //move up or down
      TListBox((Sender).Items.Move(
          HoldIndex,
          TListBox((Sender).ItemAtPos(point(x,y),true)
      );

      //set new index
      HoldIndex := TListBox((Sender).ItemAtPos(point(x,y),true);

      //control flickering
      TListBox((Sender).Selected[HoldIndex] := true;

    end;
  except
    //...
  end;
end;


procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
   HoldIndex := -1;
end;


Moderiert von user profile iconKlabautermann: Code- durch Delphi-Tags ersetzt


Chatfix - Mi 04.07.07 13:35

Auch wenn die Frage schon 5 Jahre alt ist ;) Danke :P


Klabautermann - Mi 04.07.07 14:13

user profile iconChatfix hat folgendes geschrieben:
Auch wenn die Frage schon 5 Jahre alt ist ;) Danke :P

So kommt sie dann wenigstens noch zu der Ehre eingebuntet zu werden ;).


xcellent - Fr 06.07.07 12:49

:wink: Der Unterschied zwischen beiden Varianten ist das visuelle Ergebnis.
Die Drag & Drop-Variante lässt sich ""blöd"" handhaben, weil man mit der Maus
förmlich zielen muss, um seine Zeile korrekt neu zu platzieren.

Die Tausch-Variante dürfte um Längen einfacher zu bedienen sein :wink:

Und vielleicht hilft es ja noch anderen! :!: