AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Drag / Drop Tutorial

Ein Thema von haentschman · begonnen am 1. Jan 2008 · letzter Beitrag vom 3. Jan 2008
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#21

Re: Drag / Drop Tutorial

  Alt 3. Jan 2008, 04:19
...Guten Morgen...

...noch nicht müde oder schon wach ?

...ich werde mir mal Deine Ratschläge zu gemüte führen...
... das mit dem inherited habe ich auch mit der Delphi Hilfe noch nicht richtig begriffen.

... 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...


...aber heute nicht mehr...jetzt ist Matratzenhorchen angesagt...

Danke...Gute Nacht

  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

Re: Drag / Drop Tutorial

  Alt 3. Jan 2008, 04:49
schon langsam müde und (vielleicht) auch bald im Bettchen

Zitat von haentschman:
das mit dem inherited habe ich auch mit der Delphi Hilfe noch nicht richtig begriffen.
wenn du eine Classenfunktion überschreibst, dann ruft dieses die überschriebene "alte" Version auf.

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

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#23

Re: Drag / Drop Tutorial

  Alt 3. Jan 2008, 11:02
...Update

ich hoffe....habe fertig.

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 ?
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#24

Re: Drag / Drop Tutorial

  Alt 3. Jan 2008, 11:11
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#25

Re: Drag / Drop Tutorial

  Alt 3. Jan 2008, 11:15
... aber das Drag ist doch abgeschlossen
Delphi-Quellcode:
...
DragFinish(Msg.WParam);
    if BestatigungK then
      begin
        if MessageDlg...
vor der MessageBox

[edit]
DragFinish gibt ja nur den Speicher wieder frei...
...habe noch nicht fertig
[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.034 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
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#27

Re: Drag / Drop Tutorial

  Alt 3. Jan 2008, 12:25
Zitat von himitsu:
wie sendet man blos 'ne Message innerhalb des selben treads, so daß diese an die Nachrichtenlist angehängt wird?
MSDN-Library durchsuchenPostMessage.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#28

Re: Drag / Drop Tutorial

  Alt 3. Jan 2008, 15:50
ok...wie heißt das Dorf in Böhmen ?

...ich mache mich an die Arbeit
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.387 Beiträge
 
Delphi 12 Athens
 
#29

Re: Drag / Drop Tutorial

  Alt 3. Jan 2008, 16:51
...so gehts auch
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz