Entwickler-Ecke

Sonstiges (Delphi) - [gelöst]"Ungültiges Fensterhandle" ...


patrick - Di 20.04.04 22:10
Titel: [gelöst]"Ungültiges Fensterhandle" ...
ich komme einfach nicht dahinter:
ich baue gerade an einem datei-vernichter.
damit das form aber nicht einfriert während ich den code ausgeführt wird hab ich das alles in nen thread kopiert.
wenn dieser thread jetzt ausgeführt und terminiert wird, bekommt ich beim schließen des fensters diese fehlermeldung:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
---------------------------
Anwendungsfehler
---------------------------
Exception EOSError in Modul FileShredder.exe bei 0000D56E.Systemfehler.  
Code: 1400.
Ungültiges Fensterhandle.
---------------------------
OK   
---------------------------


hier ist der source zu dem programm (soll sowieso nach ein paar schönheitskorrekturen open-source werden)

http://www.nettraxx.de.vu/tmp/ACoder2FileShredder.zip (22kB)

es werden keine extra komponenten benötigt.

THX


patrick - Do 22.04.04 12:19

nachtrag: ich habs jetzt mal mit ner fremdkomponente versucht. dabei tritt der fehler aber nicht auf.

ich will aber keine fremdkomponenten benutzen :cry:


Delete - Do 22.04.04 16:25


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
procedure TShredThread.Execute;
begin
  try
    with AC2FsForm1 do
    begin
      if MessageDlg('Sind sie sicher das sie die ausgewählte(n) Dateien löschen '+#13+#10+'wollen?', mtConfirmation, [mbYes,mbNo], 0) = mrNo then
        exit;
      try
        EraseAction;
      except
        MessageDlg('Fehler beim Löschen der Dateien', mtError, [mbOK], 0);
        exit;
      end;
      Status(0,'Löschvorgang abschließen...',true);
      Progress_Small.Position:=0;
      Progress_Big.Progress:=0;
      if abort then
      begin
        Status(0,'Löschvorgang abgebrochen',true);
        MessageDlg('Der Löschvorgang wurde abgebrochen', mtError, [mbOK], 0);
      end
      else
      begin
        Status(0,'Löschvorgang abgeschlossen',true);
        MessageDlg('Der Löschvorgang wurde erfolgreich abgeschlossen.', mtInformation, [mbOK], 0);
      end;
    end;
  finally
    ShredThread.Terminate;
  end;
end;

Du hast gelsen, was als Kommentar in der Thread Unit steht, wenn du über die IDE eine Unit für einen Thread erstellst? Du bist dir im Klaren, dass du an allen Ecken und Enden in der Execute Methode von TThread auf sichtbare Komponenten der VCL zu greifst?


patrick - Do 22.04.04 17:50

Zitat:

Du hast gelsen, was als Kommentar in der Thread Unit steht,

nein, welche thread-Unit?
Zitat:

wenn du über die IDE eine Unit für einen Thread erstellst? Du bist dir im Klaren, dass du an allen Ecken und Enden in der Execute Methode von TThread auf sichtbare Komponenten der VCL zu greifst?

ja, aber ich bin mir keiner schuld bewusst (was zu 100% aus unwissenheit stammt)


Delete - Do 22.04.04 18:13

So? Dann solltst du das nächste mal richtig lesen:
Zitat:

{ Important: Methods and properties of objects in VCL or CLX can only be used
in a method called using Synchronize, for example,

Synchronize(UpdateCaption);

and UpdateCaption could look like,

procedure TTest.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }

Rein theoretisch reicht es den ersten Satz zu lesen.


patrick - Do 22.04.04 18:20

THX
das wusste ich nicht
ich werd's überarbeiten


patrick - Fr 23.04.04 18:54

fehler behoben und alles ok
THX