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 Drag Drop Sender 2x TListview Untescheidung (https://www.delphipraxis.net/55449-drag-drop-sender-2x-tlistview-untescheidung.html)

padavan 21. Okt 2005 05:53


Drag Drop Sender 2x TListview Untescheidung
 
Guten Morgen,
wie bekomm ich´s denn gebacken, zwischen zwei Drag Drop Ereignissen zu unterscheiden, wenn sie bei von TListview kommen?
Delphi-Quellcode:
  if source is tListview then begin
//tu was
  end;
denn so bekomme ich ja nur gesagt, dass es von einer Listview kommt, wie bekomm ich raus, von welcher.

denn so geht´s nicht: (ist eigentlich klar)
Delphi-Quellcode:
  if source is Listview1 then begin
//tu was
  end;
und so leider auch nicht: (aber so hätte ich erwartet dass es geht)
Delphi-Quellcode:
  if source is TListview then begin
    if listview1.dragging = true then // tu was
    if listview2.dragging = true then // tu was anderes
  end;
hmm?!

MarcoWarm 21. Okt 2005 06:03

Re: Drag Drop Sender 2x TListview Untescheidung
 
Delphi-Quellcode:
if source = Listview1 then begin
//tu was
  end;
so sollte es gehen

das wörtchen is prüft nur, ob die Variable eine Instanz einer bestimmten Klasse ist

padavan 21. Okt 2005 06:32

Re: Drag Drop Sender 2x TListview Untescheidung
 
Ok danke,
komischerweise führt er trotzdem beide aus...
Delphi-Quellcode:
Procedure TForm1.Listview1DragDrop(Sender, Source: TObject; x,y: integer);
---------------
if source = Listview1 then //tu was Operation1
if source = Listview2 then //tu was anderes Operation2
muss vielleicht noch dazu sagen, dass die erste Operation ein Drag Drop auf sich selbst ist.
Operation 1 funktioniert prima, wenn ich Operation 2 ausklammere...?!

Bei DragDrop läuft´s auf´ne Exception wenn ich beides drin hab, er will die zweite Opartion auch ausführen, obwohl ich nur von Listview1 Dragge

jim_raynor 21. Okt 2005 07:06

Re: Drag Drop Sender 2x TListview Untescheidung
 
Wie jetzt? Du draggst immer von ListView1 in entweder ListView1 oder ListView2? Na dann ist doch klar, dass Source immer ListView1 ist, da es ja die Quelle ist ;)

Kuck mal was in Sender drin ist. Meiner Meinung nach müsste da die Ziel ListView oder eventuell, dass Ziel ListItem drin sein.

marabu 21. Okt 2005 07:13

Re: Drag Drop Sender 2x TListview Untescheidung
 
Hallo padavan,

nach deiner Beschreibung steht dein Code einfach an der falschen Stelle - Operation 2 musst du in ListView2DragDrop() rein schreiben. Den Sender brauchst du in diesem Event nur zu überprüfen, wenn du den Event-Handler mehreren ListViews zugewiesen hast. Wenn es sich aber um sehr verschiedene Operationen handelt, dann würde ich jeder ListView ihren eigenen Event-Handler für OnDragDrop() spendieren.

Grüße vom marabu

padavan 21. Okt 2005 07:34

Re: Drag Drop Sender 2x TListview Untescheidung
 
Moin an alle :-D
Meine Schuld, ich muss mich genauer ausdrücken,
ich habe jetzt eine Listview1 und eine Listview2.

Ursprünglich hatte ich eine Listbox1 und eine Listview2.
Von der Listview2 habe ich in die Listbox1 reingedropt, hat prima funktioniert.

Jetzt habe ich mein ganzes Programm auseinandergerissen und die Listbox1 gegen die Listview1 ersetzt, da diese manche Vorteile bringt, z.B. gescheites DragDrop innerhalb der Listview. Was bei Listbox nicht gescheit funktioniert. (zumindest nicht bei aktiviertem Multiselect)
siehe hier

Nun habe ich ja den Zustand das ich von Listview2 immernoch in Listview1 droppen will und hinzu kommt, dass innerhalb der Listview1 drag-droppen will (nur deshalb hab ich umgestellt).
Deshalb brauche ich die Unterscheidung von gedragt wurde.

Dummerweise funktioniert kein Ansatz, da er immer beide Operation durchführen will.
:wiejetzt:

PS: Hallo marabu, nun verstehe ich nicht, wie ich der
Zitat:

ListView ihren eigenen Event-Handler für OnDragDrop() spendieren.
kann?!

Jens Schumann 21. Okt 2005 07:49

Re: Drag Drop Sender 2x TListview Untescheidung
 
Hallo,
versuche es mal so
Delphi-Quellcode:
Procedure TForm1.Listview1DragDrop(Sender, Source: TObject; x,y: integer);
---------------
if Sender=ListView1 then //Dann wird innerhalb von ListView1 gedropt
if Sender=ListView2 then //Dann feuert ListView2 das Event

padavan 21. Okt 2005 07:54

Re: Drag Drop Sender 2x TListview Untescheidung
 
:gruebel:
wo ist der Unteschied dazu? (oder bin ich blind)
Zitat:

Ok danke,
komischerweise führt er trotzdem beide aus...
Delphi-Quellcode:
Procedure TForm1.Listview1DragDrop(Sender, Source: TObject; x,y: integer);
--------------- 
if source = Listview1 then //tu was Operation1 
if source = Listview2 then //tu was anderes Operation2

Ich bin blind !!!


Geht aber leider auch nicht
:(

Lannes 21. Okt 2005 08:17

Re: Drag Drop Sender 2x TListview Untescheidung
 
Hallo,

@Jens Schumann: Sender ist in deiner Prozedur immer ListView1.
Die Delphi-Hilfe hat geschrieben:
Zitat:

Der Parameter Source des Ereignisses stellt das abgelegte Objekt dar, und Sender gibt das Steuerelement an, auf dem das Objekt abgelegt wird.
@padavan:
Die Eigenschaft DragMode beider ListViews auf dmAutomatic setzen und diese beiden Prozeduren reichen aus um die von Dir gewünschte Funktionalität zu erreichen (gerade nochmal getestet):
Delphi-Quellcode:
procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  if Source = ListView1 then
    begin
    caption := 'ListView1';
    //verschiebe innerhalb ListView1 oder was anderes
    end;
  if Source = ListView2 then
    begin
    caption := 'ListView2';
    //verschiebe oder kopiere von ListView2 zu ListView1 oder was anderes
    end;
end;

procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if (Source = ListView1) or (Source = ListView2) then
   Accept := True
   else
     Accept := False;
end;
Sollte der Fehler immer noch auftreten muss es eine andere Ursache haben.

marabu 21. Okt 2005 08:18

Re: Drag Drop Sender 2x TListview Untescheidung
 
Was willst du erreichen, padavan? Sollen durch Drag&Drop nur neue Einträge angefügt werden oder möchtest du - insbesondere wenn Source und Target dasselbe Control sind - eine andere Ordnung herstellen?

marabu

padavan 21. Okt 2005 08:34

Re: Drag Drop Sender 2x TListview Untescheidung
 
@marabu
genau -->
Aus der Listview2 kommen dann Einträge hinzu.
Innerhalb der Listview1 soll nur sortiert werden.

@Lannes
Zitat:

Delphi-Quellcode:
procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if (Source = ListView1) or (Source = ListView2) then
   Accept := True
   else
     Accept := False;
end;

das geht nicht, da dann andere DragDrop Operaton ja auch nicht mehr gingen. Kommen noch mehr dazu, aus Label usw.
(hab´s trotzdem versucht...)

Das mit Automatic hab ich auch in Zusammenhang damit versucht, bringt leider auch keine Änderung

Wahrscheinlich habe ich mal wieder einen ganz anderen Bubu drin.
Ich werd das jetzt mal außerhalb des Programms in einen Testprojekt erstmal richtig ausprobieren, um auszuschließen, das ich mir da selbst ein Bein stelle

Lannes 21. Okt 2005 08:44

Re: Drag Drop Sender 2x TListview Untescheidung
 
Hallo,
Zitat:

Zitat von padavan
...das geht nicht, da dann andere DragDrop Operaton ja auch nicht mehr gingen. Kommen noch mehr dazu, aus Label usw.

das brauchst Du ja nur erweitern:
Delphi-Quellcode:
//in DragDrop
if Source = Lavbel1 then
    begin
    caption := 'Label1';
    //mach was mit Label1
    end;
//in DragOver
if (Source = ListView1) or
   (Source = ListView2) or  
   (Source = Label1) then

marabu 21. Okt 2005 09:04

Re: Drag Drop Sender 2x TListview Untescheidung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo padavan,

schau dir mal mein Demo-Projekt an. Damit wird vielleicht auch dein ListBox-Problem erklärt.

Freundliche Grüße vom marabu

padavan 21. Okt 2005 09:17

Re: Drag Drop Sender 2x TListview Untescheidung
 
Ah zu spät, danke marabu.
Edit:(Mensch, du legst dich ja immer ins Zeug...)
Jetzt hatte ich meins schon getippt, ich poste mal, evtl. ist´s hinfällig

OK,
jetzt poste ich doch mal alles.
Hab´s am Anfang gelassen, da ich dachte das ich eine Prinzip Frage stelle,
da ich aber nun merke, dass es nicht am Prinzip liegt, poste ich mal alles bzgl. des DragDrop
Hab´s nämlich jetzt mal getrennt versucht, und da funktionieren Eure Lösungsvorschläge nämlich alle.
Es liegt also irgendwo im Detail


Delphi-Quellcode:
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if button = mbleft then Listview1.BeginDrag(false);
end;



procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
  if source is tfilelistbox then accept := true;
  if source is tlabel then accept := true;
  if source is tListview then accept := true;
//  nur versuch --> if (source = Listview1) and (Listview1.Dragging = true) then accept := true;
//  nur versuch --> if (source = Form_Listview2.ListView2) and (Form_Listview2.ListView2.Dragging = true) then accept := true;
  if source is tShellTreeView then accept := true;
end;

procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var i: integer;
begin
  if source is tfilelistbox then titelwahl;
  if source is tlabel then titelwahl_label;
  if source is tShellTreeView then begin
  if Form_listview2.FileListBox2.Count > 0 then Form_Listview2.Titelwahltreeview;
  end;
  if source = Listview1 then begin
    if listview1.DropTarget.Index < Listview1.Items.Count then begin
      for i := 1 to Listview1.SelCount do begin
        listview1.items.Insert(Listview1.DropTarget.Index);
        Listview1.Items[listview1.DropTarget.Index - 1] := listview1.Selected;
        Listview1.Items[listview1.itemindex].free;
      end;
    end
  end;
  if source = Form_listview2.ListView2 then Form_Listview2.Titelwahl2;
end;





//auf einer anderen Form....


procedure TForm_Listview2.ListView2MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if button = mbleft then Listview2.BeginDrag(false);
end;



procedure TForm_Listview2.Titelwahl2;
var Item: TListItem;
begin
  if Listview2.SelCount = 1 then begin
    if Form1.Label_Titel_Anzeige.Caption = '' then begin
      Form1.Label_Titel_Anzeige.Caption := Listview2.Selected.Caption;
      (* auf dateierweiterung prüfen *)
      Mediaendstr := extractfileext(Form1.Label_Titel_Anzeige.Caption);
      if (Mediaendstr = '.mpg') or (Mediaendstr = '.mpeg') or (Mediaendstr = '.avi') or (Mediaendstr = '.mpe') or (Mediaendstr = '.wmf') or (Mediaendstr = '.asf') then Mediaend := true else Mediaend := false;
      (*******************************)
    end else begin
//      Form1.ListBox1.Items.Add(Listview2.Selected.Caption)
      Form1.Listview1.Items.Add;
      Form1.Listview1.Items[Form1.Listview1.Items.Count -1 ].Caption := Listview2.Selected.Caption;
    end;
  end;

  if Listview2.Selcount > 1 then begin //Multiselect
    if Form1.Label_Titel_Anzeige.Caption = '' then begin
      Form1.Label_Titel_Anzeige.Caption := Listview2.Selected.Caption;
      (* auf dateierweiterung prüfen *)
      Mediaendstr := extractfileext(Form1.Label_Titel_Anzeige.Caption);
      if (Mediaendstr = '.mpg') or (Mediaendstr = '.mpeg') or (Mediaendstr = '.avi') or (Mediaendstr = '.mpe') or (Mediaendstr = '.wmf') or (Mediaendstr = '.asf') then Mediaend := true else Mediaend := false;
      (*******************************)
      screen.cursor := crhourglass;
      Item := ListView2.Selected;
      while Item <> nil do
      begin
        if (getasynckeystate(vk_escape) <> 0) then break;
//        Form1.ListBox1.Items.Add(Item.Caption);
        Form1.Listview1.Items.Add;
        Form1.Listview1.Items[Form1.Listview1.Items.Count -1 ].Caption := Item.Caption;
        Item := ListView2.GetNextItem(Item, sdAll, [isSelected]);
      end;
//      Form1.ListBox1.Items.Delete(0); // da dieser fälschlicherweise mit reingenommen wird
      Form1.ListView1.Items[0].Free;
      screen.cursor := crdefault;
    end else begin
      screen.cursor := crhourglass;
      Item := ListView2.Selected;
      while Item <> nil do
      begin
        if (getasynckeystate(vk_escape) <> 0) then break;
//        Form1.ListBox1.Items.Add(Item.Caption);
        Form1.Listview1.Items.Add;
        Form1.Listview1.Items[Form1.Listview1.Items.Count -1 ].Caption := Item.Caption;
        Item := ListView2.GetNextItem(Item, sdAll, [isSelected]);
      end;
      screen.cursor := crdefault;
    end;
  end;

  if (Fileexists(Form1.Label_Titel_Anzeige.Caption)) and (Startflag = false) then begin
    Form1.Speedbutton_start.Visible := true;
    Speedbutton_start2.Visible := true;
  end;
  Form1.Label_Titelanzahl_Anzeige.Value := Form1.Listview1.Items.Count;
  if Form1.Listview1.items.Count > 0 then Form1.RadioButton_TAGlist.Enabled := true;
  if Form_listview <> nil then Form1.RadioButton_TAGlistClick(self);
end;

Das Problem ergibt sich immer nur an dieser Stelle:
Delphi-Quellcode:
  if source = Form_listview2.ListView2 then Form_Listview2.Titelwahl2;
Diese Zeile wird immer ausgeführt, egal von wo ich dragge, Label, Listview, Treeview
Aber warum
Hab´s mit einer anderen Testlistview versucht, da funktionierts einwandfrei, nur bei der nicht. Das gibt´s doch nicht.
Er führt die Prozedur aus, und dann gibt´s natürlich crash

marabu 21. Okt 2005 09:31

Re: Drag Drop Sender 2x TListview Untescheidung
 
Hallo padavan,

ändere deinen Code mal so ab:

Delphi-Quellcode:
procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  i: integer;
begin
  if source is tfilelistbox then
    titelwahl else
  if source is tlabel then
    titelwahl_label else
  if source is tShellTreeView then
  begin
    if Form_listview2.FileListBox2.Count > 0 then
      Form_Listview2.Titelwahltreeview;
  end else
  if source = Listview1 then
  begin
    if listview1.DropTarget.Index < Listview1.Items.Count then
    begin
      for i := 1 to Listview1.SelCount do
      begin
        listview1.items.Insert(Listview1.DropTarget.Index);
        Listview1.Items[listview1.DropTarget.Index - 1] := listview1.Selected;
        Listview1.Items[listview1.itemindex].free;
      end;
    end;
  end else
  if source = Form_listview2.ListView2 then
    Form_Listview2.Titelwahl2 else
end;
Sollte das seltsame Verhalten durch einen wild pointer verursacht werden, dann könntest du das durch ein Umstellen deines Codes herausfinden:

Delphi-Quellcode:
procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  i: integer;
begin
  if source = Form_listview2.ListView2 then
    Form_Listview2.Titelwahl2 else
  if source is tfilelistbox then
    titelwahl else
  if source is tlabel then
    titelwahl_label else
  if source is tShellTreeView then
  begin
    if Form_listview2.FileListBox2.Count > 0 then
      Form_Listview2.Titelwahltreeview;
  end else
  if source = Listview1 then
  begin
    if listview1.DropTarget.Index < Listview1.Items.Count then
    begin
      for i := 1 to Listview1.SelCount do
      begin
        listview1.items.Insert(Listview1.DropTarget.Index);
        Listview1.Items[listview1.DropTarget.Index - 1] := listview1.Selected;
        Listview1.Items[listview1.itemindex].free;
      end;
    end;
  end else;
end;
marabu

padavan 21. Okt 2005 10:20

Re: Drag Drop Sender 2x TListview Untescheidung
 
Marabu, du bist ´ne Wucht.
:firejump:
Funktioniert prima, gleich beim ersten Ansatz.

(Jetzt kann ich endlich in Ruhe an meiner eigentlichen Arbeit weitermachen.
Schaltpläne zeichnen :cry: , -hat mir einfach keine Ruhe gelassen- )


Heute Abend mach ich mich gleich dran und schau mir an wie du das wieder gemacht hast.

Viele Dank nochmal an alle
:hi:


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