![]() |
Re: Drag / Drop Tutorial
...Guten Morgen...
...noch nicht müde oder schon wach ? :-D ...ich werde mir mal Deine Ratschläge zu gemüte führen... :roll: ... das mit dem inherited habe ich auch mit der Delphi Hilfe noch nicht richtig begriffen. :oops: ... wenn ich dich richtig verstehe meinst Du, daß ich die File Informationen erst einmal kpl. hinterlege, damit das Drop zügig abgearbeitet wird und dann in Ruhe entscheiden ob Kopieren oder nicht... :thumb: ...aber heute nicht mehr...jetzt ist Matratzenhorchen angesagt... :cheer: Danke...Gute Nacht :hi: |
Re: Drag / Drop Tutorial
schon langsam müde und (vielleicht) auch bald im Bettchen :?
Zitat:
Zitat:
Ja und Dank der Nachfrage (des Dialogs) kann es schon recht lange dauern ... der Benutzer muß die "Frage" ja nicht sofort beantworten. |
Re: Drag / Drop Tutorial
...Update :-D
ich hoffe....habe fertig. :mrgreen:
Delphi-Quellcode:
...is ok oder geht noch besser ? :hi:
procedure TJvFileListBox.DropFiles(var Msg: TMessage);
var i, Anzahl, Size: integer; SourcePfad: PChar; Dateiname: String; Pfad: String; ListeDateien: TStringList; begin ListeDateien:= TStringList.Create; try Anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, SourcePfad, 255); SetForegroundWindow(FAnlagenkomponenten.Handle); 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)); ListeDateien.Add(Dateiname); StrDispose(SourcePfad); end; DragFinish(Msg.WParam); if BestatigungK then begin if MessageDlg('Kopieren von ' + IntToStr(Anzahl) + ' Dateien nach ' + FAnlagenkomponenten.DocVerzeichnis.Text + ' ?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then begin exit; end; end; for i := 0 to ListeDateien.Count -1 do begin Dateiname:= ListeDateien.Strings[i]; CopyFile(PChar(Pfad + Dateiname),PChar(FAnlagenkomponenten.DocVerzeichnis.Text + '\'+ Dateiname),false); end; FAnlagenkomponenten.JvFileListBox1.Update; finally ListeDateien.Free; end; end; |
Re: Drag / Drop Tutorial
Hallo,
was himitsu (hoffentlich) meinte, war, dass Du die Verarbeitung inkl. Messagebox in eine andere Funktion auslagerst, die Du aurufst, indem Du Deiner Anwendung eine Message schickst. Sonst passiert es nämlich, dass der Explorer, aus dem Du draggst, solange eingefroren ist, bis Du auf die Messagebox reagierst. Und auf Einfrieren reagiert Windows sehr allergisch. Gruß xaromz |
Re: Drag / Drop Tutorial
... aber das Drag ist doch abgeschlossen
Delphi-Quellcode:
vor der MessageBox :gruebel:
...
DragFinish(Msg.WParam); if BestatigungK then begin if MessageDlg... [edit] :wall: DragFinish gibt ja nur den Speicher wieder frei... ...habe noch nicht fertig :( [/edit] |
Re: Drag / Drop Tutorial
nja, mehr in etwa so:
aber hierbei ist mir aufgefallen (mach zu selten was mit WidowsMessages), das SendNotifyMessage im selben thread garnich sofort zurückkehrt und och 'ne Mißhandlung von SendMessageCallback lief nicht wie geplant :shock: wie sendet man blos 'ne Message innerhalb des selben treads, so daß diese an die Nachrichtenlist angehängt wird? :gruebel:
Delphi-Quellcode:
[add]
const WM_NEWMESSAGE = WM_USER + 100; {oder so
weiß gad nicht in welchem Bereich die IDs sein müssen, aber dazu steht bestimmt irgendwo was} type TJvFileListBox = class(TForm) private ListeDateien: TStringList; procedure DropFiles (var Msg: TMessage); message WM_DROPFILES; procedure NewMessage(var Msg: TMessage); message WM_NEWMESSAGE; end; procedure TJvFileListBox.DropFiles(var Msg: TMessage); // nur Dateien merken und zurück var i, Anzahl, Size: integer; Dateiname: String; begin if ListeDateien = nil then ListeDateien := TStringList.Create else ListeDateien.Clear; Anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, nil, 0); for i := 0 to (Anzahl - 1) do begin Size := DragQueryFile(Msg.WParam, i, nil, 0); SetLength(Dateiname, Size); DragQueryFile(Msg.WParam, i, PChar(Dateiname), Size + 1); ListeDateien.Add(Dateiname); end; DragFinish(Msg.WParam); PostMessage(Handle, WM_NEWMESSAGE, 0, 0); end; procedure TJvFileListBox.NewMessage(var Msg: TMessage); var i: integer; begin if ListeDateien = nil then exit; SetForegroundWindow(FAnlagenkomponenten.Handle); if BestatigungK and (MessageDlg('Kopieren von ' + IntToStr(ListeDateien.Count) + ' Dateien nach ' + FAnlagenkomponenten.DocVerzeichnis.Text + ' ?', mtConfirmation, [mbYes, mbNo], 0) = mrNo) then begin exit; end; for i := 0 to ListeDateien.Count - 1 do begin CopyFile(PChar(ListeDateien.Strings[i]), PChar(FAnlagenkomponenten.DocVerzeichnis.Text + '\' + ExtractFilePath(ListeDateien.Strings[i])), false); end; FAnlagenkomponenten.JvFileListBox1.Update; FreeAndNil(ListeDateien); end; // und nicht im Destructor dieses vergessen // if ListeDateien <> nil then ListeDateien.Free; ok, mit PostMessage scheint's zu gehn :oops: |
Re: Drag / Drop Tutorial
Zitat:
![]() Gruß xaromz |
Re: Drag / Drop Tutorial
ok...wie heißt das Dorf in Böhmen ? :roll:
...ich mache mich an die Arbeit :-D |
Re: Drag / Drop Tutorial
...so gehts auch :-D
Delphi-Quellcode:
const
WM_FERTIG = WM_USER + 1; type TJvFileListBox = class(JvDriveCtrls.TJvFileListBox) private ListeDateien: TStringList; procedure DropFiles(var Msg: TMessage); Message WM_DROPFILES; procedure HabeFertig(var Msg: TMessage); Message WM_FERTIG;
Delphi-Quellcode:
... wieder was neues gelernt :wink:
procedure TJvFileListBox.DropFiles(var Msg: TMessage);
var i, Anzahl, Size: Integer; SourcePfad: PChar; begin ListeDateien:= TStringList.Create; Anzahl := DragQueryFile(Msg.WParam, $FFFFFFFF, SourcePfad, 255); 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)); ListeDateien.Add(Dateiname); StrDispose(SourcePfad); end; DragFinish(Msg.WParam); PostMessage(Handle, WM_FERTIG, 0, 0); end; procedure TJvFileListBox.HabeFertig(var Msg: TMessage); var i: Integer; begin SetForegroundWindow(FAnlagenkomponenten.Handle); if BestatigungK then begin if MessageDlg('Kopieren von ' + IntToStr(ListeDateien.Count) + ' Dateien nach ' + FAnlagenkomponenten.DocVerzeichnis.Text + ' ?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then begin exit; end; end; for i := 0 to ListeDateien.Count -1 do begin Dateiname:= ListeDateien.Strings[i]; CopyFile(PChar(Pfad + Dateiname),PChar(FAnlagenkomponenten.DocVerzeichnis.Text + '\'+ Dateiname),false); end; FAnlagenkomponenten.JvFileListBox1.Update; ListeDateien.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 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