Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Drag / Drop Tutorial (https://www.delphipraxis.net/105878-drag-drop-tutorial.html)

bitsetter 2. Jan 2008 17:22

Re: Drag / Drop Tutorial
 
Zitat:

Zitat von haentschman
...aufwärm... :roll:

Delphi-Quellcode:
  DragAcceptFiles(FAnlagenkomponenten.ListBox1.Handle, true);

Hallo,

befindet sich die ListBox1 direkt auf dem Formular? Falls nicht dann fängst du die Nachricht WM_DROPFILES eben von der Listbox ab.

haentschman 2. Jan 2008 18:10

Re: Drag / Drop Tutorial
 
Danke für die schnelle Reaktion...

die ListBox befindet sich direkt auf dem Formular.

unabhängig davon sollte aber die 4. procedure ausgeführt werden...

in meinem TestFomular (Form1) funktioniert das ja alles...

oder funktioniert das nur mit Form1.... :mrgreen:

ich denke, das das mit dem Aufruf
Delphi-Quellcode:
procedure DropFiles (var Msg: TMessage); message WM_DROPFILES;
zusammenhängt....vestehe aber nicht warum :oops:

bitsetter 2. Jan 2008 18:17

Re: Drag / Drop Tutorial
 
Hast du es zum Testen schon mal so versucht?
Delphi-Quellcode:
procedure TFAnlagenkomponenten.FormCreate (Sender: TObject);
begin
  DragAcceptFiles (Handle, True);
end;

haentschman 2. Jan 2008 18:30

Re: Drag / Drop Tutorial
 
... habe ich.

in meinem Testformular habe ich mit solchen Varianten rumgespielt.

sowohl mit dem Handle des Formulars als auch der ListBox hat es funktioniert...

der gewünschte Unterschied war nur, daß das Drop einmal auf dem gesamten Formular akzeptiert wurde, das andere Mal nur auf der ListBox.

[edit]
...habe aus
Zitat:

DragAcceptFiles(FAnlagenkomponenten.ListBox1.Handl e, true);
Zitat:

DragAcceptFiles(FAnlagenkomponenten.Handle, true);
gemacht....funktioniert auf dem gesamten Formular. :gruebel:

Zitat:

Falls nicht dann fängst du die Nachricht WM_DROPFILES eben von der Listbox ab.
... wie müßte der Aufruf vom DropFiles aussehen :?: :oops:
[/edit]

bitsetter 2. Jan 2008 18:45

Re: Drag / Drop Tutorial
 
Alles klar: Drag Drop Problem das wäre imho die einfachste Möglichkeit.

haentschman 2. Jan 2008 18:57

Re: Drag / Drop Tutorial
 
...ich habe gelogen... :duck:

in FAnlagenkomponent liegt die ListBox auf einem TabSheet...
im TestFormular direkt auf dem Formular...

mit dem Abfangen direkt von der ListBox funktioniert es... Danke :thumb:


:?: heißt das man sollte sich angewöhnen die Message direkt vom Objekt abzufangen ?

bitsetter 2. Jan 2008 19:13

Re: Drag / Drop Tutorial
 
Ja wenn du Drop nicht auf dem gesamten Formular akzeptieren möchtest, sondern nur auf einem bestimmten TWinControl, dann sollte man WM_DROPFILES direkt vom Objekt abfangen.

haentschman 2. Jan 2008 19:16

Re: Drag / Drop Tutorial
 
...vielen, vielen Dank nochmal...

...wieder was gelernt :-D

:hi:

haentschman 3. Jan 2008 01:47

Re: Drag / Drop Tutorial
 
...Guten Morgen... :-D

...ich muß dann auch mal ein Erfolgserlebnis loswerden. :mrgreen:

- per Drag/Drop Files in einen Ordner kopieren und in FileListBox anzeigen. :thumb:
DocVerzeichnis: Zielordner
FileListBox.Directory: Zielordner

Delphi-Quellcode:
procedure TJvFileListBox.DropFiles(var Msg: TMessage);
var
  i, Anzahl, Size: integer;
  SourcePfad: PChar;
  Dateiname: String;
  Pfad: String;
begin
  inherited;
  Anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, SourcePfad, 255);
  SetForegroundWindow(FAnlagenkomponenten.Handle);
  if MessageDlg('Kopieren von ' + IntToStr(Anzahl) + ' Dateien nach ' + FAnlagenkomponenten.DocVerzeichnis.Text + ' ?',
        mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    begin
      for i := 0 to (Anzahl - 1) do
        begin
          Size := DragQueryFile(Msg.WParam, i , nil, 0) + 1;
          SourcePfad:= StrAlloc(Size);
          DragQueryFile(Msg.WParam,i , SourcePfad, Size);
          Pfad:= ExtractFilePath(StrPas(SourcePfad));
          Dateiname:= Copy(StrPas(SourcePfad),Length(Pfad)+1,Length(StrPas(SourcePfad))- Length(Pfad));
          CopyFile(SourcePfad,PChar(FAnlagenkomponenten.DocVerzeichnis.Text + '\'+ Dateiname),false);
          StrDispose(SourcePfad);
        end;
      FAnlagenkomponenten.JvFileListBox1.Update;
    end;
  DragFinish(Msg.WParam);
end;
...und es funktioniert :firejump:

Danke noch einmal an alle die mich unterstützt haben...
:hi:

himitsu 3. Jan 2008 03:07

Re: Drag / Drop Tutorial
 
inherited würde ich in disem Fall nicht aufrufen.
Du verarbeitest doch schon diese Nachricht, demnach muß/sollte sie nicht (eventuell) noch von Anderem nochmals verarbeitet werden..
(nicht das es doppelt verabeitet wird ... stell dir mal vor eine übergeordnete Funktion verschiebt/löscht/öffnet die übergebenen Datei und deine Funktion hat dann keinen Zugriff mehr)


Die Nachrichtenbearbeitung zu lange zu unterbrechen könnte eventuell auch nicht gut sein.
MessageDlg hällt ja die Verarbeitung an und wenn irgendwo ein TimeOut wärend der Verarbtung existiert, dann könnte da auch Unvorhersehbares passieren.
Eventuell in der Funktion nur die Dateinamen in einem Array (oder Ähnlichem) speichern
und eventuell noch deinem Programm (also sich selber) mitteilen daß was da ist.

Und dann außerhalb (nachdem die Funktion beendet wurde) den MessageDlg anzeigen und dieses Array abarbeiten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 Uhr.
Seite 2 von 3     12 3      

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