Thema: Delphi Drag / Drop Tutorial

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#26

Re: Drag / Drop Tutorial

  Alt 3. Jan 2008, 12:07
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

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


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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat