Autor Beitrag
stefanstp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Di 15.10.02 11:48 
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
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 15.10.02 11:55 
Du hast den ItemIndex des selektierten Eintrages von Listbox1. Dieser Index erlaubt den Zugriff auf den entsprechenden String:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: 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
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 15.10.02 12:10 
Aus´m Kopf und damit ohne Gewähr:
ausblenden Quelltext
1:
2:
3:
with Listbox1 do
  if(ItemIndex <> -1) then
    Listbox2.Items.Add(Items[ItemIndex]);
stefanstp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



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

STEFAN
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 15.10.02 15:31 
Oder soll es per Drag and Drop gehen?
ausblenden 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;
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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:
ausblenden volle Höhe 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:
ausblenden 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;