Delphi-PRAXiS
Seite 3 von 3     123   

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)

haentschman 3. Jan 2008 03:19

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:

himitsu 3. Jan 2008 03:49

Re: Drag / Drop Tutorial
 
schon langsam müde und (vielleicht) auch bald im Bettchen :?

Zitat:

Zitat von haentschman
das mit dem inherited habe ich auch mit der Delphi Hilfe noch nicht richtig begriffen. :oops:

wenn du eine Classenfunktion überschreibst, dann ruft dieses die überschriebene "alte" Version auf.

Zitat:

Zitat von haentschman
... 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:

genau, denn jenachdem wie WindowsNachrichten abgesendet werden, kann es vorkommen, daß der "Sender" auf die Rückkehr der(deiner) Verarbeitung wartet und solange nichts machen kann.
Ja und Dank der Nachfrage (des Dialogs) kann es schon recht lange dauern ... der Benutzer muß die "Frage" ja nicht sofort beantworten.

haentschman 3. Jan 2008 10:02

Re: Drag / Drop Tutorial
 
...Update :-D

ich hoffe....habe fertig. :mrgreen:

Delphi-Quellcode:
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;
...is ok oder geht noch besser ? :hi:

xaromz 3. Jan 2008 10:11

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

haentschman 3. Jan 2008 10:15

Re: Drag / Drop Tutorial
 
... aber das Drag ist doch abgeschlossen
Delphi-Quellcode:
...
DragFinish(Msg.WParam);
    if BestatigungK then
      begin
        if MessageDlg...
vor der MessageBox :gruebel:

[edit]
:wall: DragFinish gibt ja nur den Speicher wieder frei...
...habe noch nicht fertig :(
[/edit]

himitsu 3. Jan 2008 11:07

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:
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;
[add]
ok, mit PostMessage scheint's zu gehn :oops:

xaromz 3. Jan 2008 11:25

Re: Drag / Drop Tutorial
 
Zitat:

Zitat von himitsu
wie sendet man blos 'ne Message innerhalb des selben treads, so daß diese an die Nachrichtenlist angehängt wird? :gruebel:

MSDN-Library durchsuchenPostMessage.

Gruß
xaromz

haentschman 3. Jan 2008 14:50

Re: Drag / Drop Tutorial
 
ok...wie heißt das Dorf in Böhmen ? :roll:

...ich mache mich an die Arbeit :-D

haentschman 3. Jan 2008 15:51

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:
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;
... wieder was neues gelernt :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:51 Uhr.
Seite 3 von 3     123   

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