Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Entsprechendes Listbox item nach drag löschen (https://www.delphipraxis.net/179428-entsprechendes-listbox-item-nach-drag-loeschen.html)

Ajintaro 6. Mär 2014 13:02

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:
 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;
Wie kann ich nach dem "Drop" das kopierte Element aus der Sender-Listbox löschen, wenn es theoretisch von 4 Listboxen stammen könnte?

jaenicke 6. Mär 2014 13:06

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.

Popov 6. Mär 2014 14:21

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:
{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;
Eigentlich müßten die Objekte in den ListBoxen vorher noch freigegeben werden. Das habe ich hier gelassen.

//Achso, alle vier ListBoxen nutzen überall die gleichen Prozeduren.

baumina 6. Mär 2014 14:28

AW: Entsprechendes Listbox item nach drag löschen
 
Machst du das immer so mit dem WITH und wenn ja warum?

Popov 6. Mär 2014 15:04

AW: Entsprechendes Listbox item nach drag löschen
 
Ich machs nicht immer, aber hier bietet sich sowas an. Statt
Delphi-Quellcode:
ListBox1.Items.AddObject(ListBox1.Name + IntToStr(i), Test);
und das viel mal, und dann überall anpassen, einfach mit WITH. Müssen, muss man aber nicht.

baumina 6. Mär 2014 15:12

AW: Entsprechendes Listbox item nach drag löschen
 
Ich wurde nur hier stutzig, deswegen die Nachfrage.
Delphi-Quellcode:
with ListBox1 do DragMode := dmAutomatic;

Ajintaro 6. Mär 2014 15:34

AW: Entsprechendes Listbox item nach drag löschen
 
Zitat:

Zitat von Popov (Beitrag 1250943)
Da ich es schon lange nicht gemacht habe, mal so zum Spaß:

:shock:

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 !

Popov 6. Mär 2014 16:02

AW: Entsprechendes Listbox item nach drag löschen
 
Zitat:

Zitat von baumina (Beitrag 1250953)
Ich wurde nur hier stutzig, deswegen die Nachfrage.
Delphi-Quellcode:
with ListBox1 do DragMode := dmAutomatic;

Grund: klein wenig Copy&Paste, ist aber unnötig, stimmt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 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