Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Drag'n Drop aus beliebigen anderen Formular (https://www.delphipraxis.net/79268-dragn-drop-aus-beliebigen-anderen-formular.html)

Maja Jessica 19. Okt 2006 12:16


Drag'n Drop aus beliebigen anderen Formular
 
Hallo

ich versuche mich gerade an Drag'n Drop, welches, durch die die Suche in diesem Forum, soweit auch schon im Groben funktioniert.
Jetzt möchte ich aber aus einem anderen beliebigen Formular "ziehen" und im Hauptformular "ablegen".

Ich habe Form1 und Form2, jeweils mit einer ListBox. Aus Form2.ListBox1 kann ich ein Item auf Form1.ListBox1 verschieben.
Jetzt möchte ich aber nicht nur von Form2.ListBox1 nach Form1.ListBox1 ziehen sondern aus einer x-beliebigen Form.ListBox nach Form1.ListBox. Dabei klemmt es bei mir mit der Schreibweise, wie ich der DragDropRoutine der Form1 verkünde, woher, also von welcher Form/ListBox, das Item kommt.

Hier mein Ansatz, mit der 'statischen' Einbindung von Form1/Form2-ListBox.

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

procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
  ListBox1.Items.Add(Form2.ListBox1.Items[Form2.ListBox1.itemindex]);
  Form2.ListBox1.Items.Delete(Form2.ListBox1.itemindex);
end;
Hm, aus der 'Source' kann ich erkennen von welchen Objekt das Drag ausging ...
Woher weis ich aber von welchen Formular? Sender? :gruebel:

Hat jemand eine Idee?

Danke und Gruß, MJ

Hawkeye219 19. Okt 2006 12:38

Re: Drag'n Drop aus beliebigen anderen Formular
 
Hallo Maja Jessica,

in der Unit Forms gibt es - zumindest bei Delphi 6 - die Funktion Delphi-Referenz durchsuchenGetParentForm. Sie liefert zu einem Control das Formular, auf dem sich das übergebene Control befindet.

Beim DragDrop-Ereignis gibt Sender den Auslöser der Nachricht an (in deinem Fall die empfangende Listbox). In Source steht der Ursprung der Daten (in deinem Fall die Listbox mit den Quelldaten).


Gruß Hawkeye

Maja Jessica 19. Okt 2006 13:21

Re: Drag'n Drop aus beliebigen anderen Formular
 
Aha.

GetParentForm gibt es auch schon unter Delphi4 :)
Funktioniert auch, testweise mit
Delphi-Quellcode:
ShowMessage(GetParentForm(ListBox1).Caption);
Nur bringt es mich nicht wirklich weiter, weil, wenn ich es in Form1 anwende, logischweise immer Form1 als Parent der ListBox1 liefert.

Ob ich den Umweg über "welche Form ist gerade aktiv" gehen muss? :roteyes:

*grübel*

Danke für die Hilfe

MJ

Hawkeye219 19. Okt 2006 14:40

Re: Drag'n Drop aus beliebigen anderen Formular
 
Eigentlich solltest du mit Sender und Source Zugang zu allen Informationen haben:

Delphi-Quellcode:
procedure TForm1.ListBox1DragDrop (Sender, Source: TObject; X, Y: Integer);
var
  SourceBox, TargetBox : TListBox;
begin
  if ((Sender is TListBox) and (Source is TListBox)) then
    begin
      SourceBox := TListBox(Source); // da kommen die Daten her
      TargetBox := TListBox(Sender); // da sollen sie hin
      ShowMessage('Source: ' + SourceBox.Name + ', Form: '
                             + GetParentForm(SourceBox).Caption
                             + #13#10 +
                  'Target: ' + TargetBox.Name + ', Form: '
                             + GetParentForm(TargetBox).Caption);
    end;
end;
Gruß Hawkeye

Maja Jessica 19. Okt 2006 15:26

Re: Drag'n Drop aus beliebigen anderen Formular
 
Hi

Ja Prima, klappt wunderhübsch :hello:

Delphi-Quellcode:
procedure TForm1.ListBox1DragDrop(Sender, Source: TObject; X, Y: Integer);
var
  SourceBox, TargetBox : TListBox;
begin
  if ((Sender is TListBox) and (Source is TListBox)) then
  begin
    SourceBox := TListBox(Source); // da kommen die Daten her
    TargetBox := TListBox(Sender); // da sollen sie hin
    TargetBox.Items.Add(SourceBox.Items[SourceBox.ItemIndex]);
    SourceBox.Items.Delete(SourceBox.ItemIndex);
  end;
end;
So der grobe Ansatz (frei kopiert und angepasst), natürlich fehlen noch diverse Prüfungen etc.
Und ich hatte mich in den Gedanken verrannt ich müsse die Quellform und die ListBox auf der Quellform beide über ihre Namen ansprechen. :wall:
Auf den einfacheren Weg, SourceBox := TListBox(Source), der alle benötigten Informationen mitliefert, bin ich natürlich nicht gekommen. :pale:

Herzlichen Dank nochmal!

MJ


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