![]() |
Entsprechendes Listbox item nach drag löschen
Hallo DP !
Ich habe 5 Listboxen und möchte die items hin- und her (ver)schieben.
Delphi-Quellcode:
Wie kann ich nach dem "Drop" das kopierte Element aus der Sender-Listbox löschen, wenn es theoretisch von 4 Listboxen stammen könnte?
private
{ Private-Deklarationen } dragitem, drag_source:string; drag_integer:integer; //SENDER procedure TForm1.ListBox3MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if button = mbLeft then with Sender as TListBox do begin if ItemAtPos (Point (x,y),true) >= 0 then begin dragitem:=ListBox3.Items[ListBox3.ItemIndex];//Namen des Elements drag_integer := ListBox3.ItemIndex; //position des Elements drag_source := 'ListBox3'; //herkunft des Elements BeginDrag (false); end; end; end; //EMPFÄNGER procedure TForm1.ListBox4DragDrop(Sender, Source: TObject; X, Y: Integer); begin if Source is TListBox then with ListBox4 do begin Text := dragitem; //Name des Elements listbox4.AddItem(Text,source); .Items.Delete(drag_integer); // <--- nach dem Drag Vorgang das item von Listbox-X an der Stelle drag_integer löschen end; end; |
AW: Entsprechendes Listbox item nach drag löschen
Statt den privaten Feldern solltest du lieber dringendst Sender und Source beide nutzen. Du bekommst nämlich nicht nur die Listbox, von der das Ereignis kommt (Sender), sprich auf die gezogen wurde, sondern auch die Quelle (Source). Die kannst du direkt auswerten.
|
AW: Entsprechendes Listbox item nach drag löschen
Liste der Anhänge anzeigen (Anzahl: 1)
Da ich es schon lange nicht gemacht habe, mal so zum Spaß:
Delphi-Quellcode:
Eigentlich müßten die Objekte in den ListBoxen vorher noch freigegeben werden. Das habe ich hier gelassen.
{08/15 Klasse um sie als Objekt an ListBox-Item anzuheften. Kann auch was anderes sein, Hauptsache Objekt.}
type TTest = class private FText: String; public constructor Create(S: String); property Text: String read FText; end; constructor TTest.Create(S: String); begin inherited Create; FText := S; end; //------------------------------------------------------------------------ procedure TForm1.FormCreate(Sender: TObject); var i: Integer; Test: TTest; begin for i := 1 to 4 do begin Test := TTest.Create('Objekt von ListBox1' + IntToStr(i)); with ListBox1 do Items.AddObject(Name + IntToStr(i), Test); Test := TTest.Create('Objekt von ListBox2' + IntToStr(i)); with ListBox2 do Items.AddObject(Name + IntToStr(i), Test); Test := TTest.Create('Objekt von ListBox3' + IntToStr(i)); with ListBox3 do Items.AddObject(Name + IntToStr(i), Test); Test := TTest.Create('Objekt von ListBox4' + IntToStr(i)); with ListBox4 do Items.AddObject(Name + IntToStr(i), Test); end; with ListBox1 do DragMode := dmAutomatic; with ListBox2 do DragMode := dmAutomatic; with ListBox3 do DragMode := dmAutomatic; with ListBox4 do DragMode := dmAutomatic; end; procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer); var LB1, LB2: TListBox; begin if not ((Sender is TListBox) and (Source is TListBox)) then Exit; LB1 := TListBox(Source); LB2 := TListBox(Sender); if LB1.ItemIndex < 0 then Exit; LB2.AddItem(LB1.Items[LB1.ItemIndex], LB1.Items.Objects[LB1.ItemIndex]); LB1.Items.Delete(LB1.ItemIndex); end; procedure TForm1.ListBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := Source is TListBox; end; procedure TForm1.ListBox1DblClick(Sender: TObject); var Test: TTest; LB: TListBox; begin if not (Sender is TListBox) then Exit; LB := TListBox(Sender); if LB.ItemIndex < 0 then Exit; Test := TTest(LB.Items.Objects[LB.ItemIndex]); ShowMessage('Text Item: ' + LB.Items[LB.ItemIndex] + ^j + 'Text Objekt: ' + Test.Text ); end; //Achso, alle vier ListBoxen nutzen überall die gleichen Prozeduren. |
AW: Entsprechendes Listbox item nach drag löschen
Machst du das immer so mit dem WITH und wenn ja warum?
|
AW: Entsprechendes Listbox item nach drag löschen
Ich machs nicht immer, aber hier bietet sich sowas an. Statt
Delphi-Quellcode:
und das viel mal, und dann überall anpassen, einfach mit WITH. Müssen, muss man aber nicht.
ListBox1.Items.AddObject(ListBox1.Name + IntToStr(i), Test);
|
AW: Entsprechendes Listbox item nach drag löschen
Ich wurde nur hier stutzig, deswegen die Nachfrage.
Delphi-Quellcode:
with ListBox1 do DragMode := dmAutomatic;
|
AW: Entsprechendes Listbox item nach drag löschen
Zitat:
Für den Spaß klappt das aber erstaunlich gut! Damit ist sogar mein selbst erstelltes "Duplicate"-Problem elilminiert. Wirklich ganz große Klasse, vielen Dank ! |
AW: Entsprechendes Listbox item nach drag löschen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:39 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