Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Einen Listbox-Eintrag in einen anderen verschieben?


stefanstp - Di 15.10.02 11:48
Titel: Einen Listbox-Eintrag in einen anderen verschieben?
Ich habe zwei Listboxen. Die Listbox1 hat um die 10 Einträge. Die Listbox2 hat noch keine. Jetzt möchte ich, das der selektierte Eintrag von Listbox 1 in Listbox 2 verschoben wird. Wie geht das?

Wer kann helfen?

Besten Dank im Voraus!

STEFAN


Delete - Di 15.10.02 11:55

Du hast den ItemIndex des selektierten Eintrages von Listbox1. Dieser Index erlaubt den Zugriff auf den entsprechenden String:

Quelltext
1:
ShowMessage(Listbox1.Items[Listbox1.ItemIndex]);                    

Diesen String fügst du deiner zweiten Listbox hinzu -wie das geht, sollte ja wohl kein Problem sein? (Stichwort: "Add")- und dann entfernst du den String aus der ersten Listbox einfach (Stichwort:"Listbox1.Items.Delete").


stefanstp - Di 15.10.02 12:03
Titel: Habe es mit Add schon probiert....
aber da bekomme ich immer die Meldung. Listbox2 erreicht Maximum 254 glaube ich....

Hm?

Wäre echt super :D , wenn Du mir mal ein Beispielcode geben könntest....Hinzufügen und löschen habe ich ja schon locker hinbekomme n(siehe Aufgaben bei AllOffice). Aber wenn ich den selektierten Eintrag von Listbox1 in Listbox2 hinzufügen will, kommt die besagte Meldung. Hm????

STEFAN


Delete - Di 15.10.02 12:10

Aus´m Kopf und damit ohne Gewähr:

Quelltext
1:
2:
3:
with Listbox1 do
  if(ItemIndex <> -1) then
    Listbox2.Items.Add(Items[ItemIndex]);


stefanstp - Di 15.10.02 12:53
Titel: Besten dank...
...werde es mal gleich heute Abend ausprobieren!

STEFAN


Delete - Di 15.10.02 15:31

Oder soll es per Drag and Drop gehen?

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 TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
     if Button = mbLeft then Listbox1.BeginDrag(false);
end;

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

procedure TForm1.ListBox2DragDrop(Sender, Source: TObject; X, Y: Integer);
var
   i : Integer;
begin
     if Source is TListbox And (Listbox1.SelCount > 0) then begin
        for i := 0 to Listbox1.Items.Count-1 do begin
            if Listbox1.Selected[i] = true then
               Listbox2.Items.Add(Listbox1.Items.Strings[i]);
        end;
     end;
     //bei Auswahl [Strg] gedrückt halten und ziehen
end;


Delete - Di 15.10.02 18:44

Eine gute Idee, Luckie. Drag&Drop ... 8) ... immer schick. Das einzige Problem ist, dass dein Code für die Mehrfachauswahl in Listboxen geschrieben ist. (Denn, wenn "MultiSelect" FALSE ist, ist "SelCount" -laut Hilfe- immer -1.) Deswegen schlage ich als Erweiterung spontan (:wink:) mal folgende private Universalfunktionen vor:

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:
procedure TForm1.LbOnMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if(Sender is TListBox) then
    if(Button = mbLeft) then (Sender as TListBox).BeginDrag(false);
end;

procedure TForm1.DragAccept(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := (Source is TListBox);
end;

procedure TForm1.DragDropFunc(Sender, Source: TObject; X, Y: integer);
var
  i : integer;
begin
  if(Sender is TListBox) then
    with (Source as TListBox) do
      case MultiSelect of
        false:
          if(ItemIndex <> -1) then
            if((Sender as TListBox).Items.IndexOf(Items[ItemIndex]) = -1) then
              (Sender as TListBox).Items.Add(Items[ItemIndex]);
        true:
          if(SelCount > 0) then
            for i := 0 to Items.Count - 1 do
              if(Selected[i]) and ((Sender as TListBox).Items.IndexOf(Items[i]) = -1) then
                (Sender as TListBox).Items.Add(Items[i]);
      end;
end;

Damit lassen sich die Items jetzt problemlos zwischen beiden Listboxen austauschen. Vorausgesetzt sie stehen nicht schon in der Ziel-Listbox. Entweder wählt man diese Funktionen über den Objektinspektor aus, oder man macht es im "OnCreate" des Forms:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ListBox1.OnMouseDown := LbOnMouseDown;
  ListBox1.OnDragOver  := DragAccept;
  ListBox1.OnDragDrop  := DragDropFunc;

  ListBox2.OnMouseDown := LbOnMouseDown;
  ListBox2.OnDragOver  := DragAccept;
  ListBox2.OnDragDrop  := DragDropFunc;
end;