Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Absturz bei OnKeyDown (https://www.delphipraxis.net/69138-absturz-bei-onkeydown.html)

MasterDG 10. Mai 2006 19:01


Absturz bei OnKeyDown
 
Hallo!

Ich habe ein Problem was mich zum verzweifeln bringt... :evil:

Ich habe in meinem Programm einen Button mit dem ich Dateien verschiebe.
Ich wollte diesen Button mit dem OnKeyDown-Ereigniss der Form bei einer bestimmten gedrückten Taste klicken. Die Datei die verschoben werden soll bekomme ich aus einem ShellListView.

Wenn ich nun zwei oder mehrmal auf die Taste drücke wird beim ersten Mal die Datei verschoben, beim zweiten mal jedoch wird nichts gemacht und das Programm ist ohne Fehlermeldung einfach abgestürzt obwohl doch eigendlich die nächtse Datei verschoben werden sollte. Wenn ich den Button direkt drücke klappt alles ohne Probleme!
Im Taskmanager steht keine Rückmeldung wenn das Prog abgestürzt ist. In Delphi bekomme ich keinen Fehler angezeigt.

Kann mir einer helfen. Ich bin momentan ratlos...

Gruß
MasterDG

Muetze1 11. Mai 2006 06:18

Re: Absturz bei OnKeyDown
 
Wir sind genauso ratlos, da wir deinen Code nicht kennen. Meine Glaskugel ist zur Zeit auch zur intensiv-Reinigung, so dass ich da auch nicht mehr weiss. Wie wäre es denn für den Anfang mal mit dem Code auf dem OnClick und dem OnKeyDown Ereignis des Buttons?

MasterDG 11. Mai 2006 16:02

Re: Absturz bei OnKeyDown
 
Hallo!

Hier der Code den ich zur Zeit benutze:

Delphi-Quellcode:
function TForm1.RenameFileEx(const AOldName, ANewName: string;
   ARenameCheck: boolean = false): boolean;
var
  sh: TSHFileOpStruct;
begin
  sh.Wnd := Application.Handle;
  sh.wFunc := fo_Move;

  // String muss mit #0#0 Terminiert werden, um das Listenende zu setzen
  sh.pFrom := PChar(AOldName + #0);
  sh.pTo := PChar(ANewName + #0);
  sh.fFlags := fof_Silent or fof_MultiDestFiles;
  if ARenameCheck then
    sh.fFlags := sh.fFlags or fof_RenameOnCollision;
  Result:=ShFileOperation(sh)=0;
end;

procedure TForm1.ButtonClick(Sender: TObject);
begin
 if not fileexists('C:/OrdnerA/Beispieldatei.bmp') then
 begin
  ReNameFileEx('C:/OrdnerA/Beispieldatei.bmp','C:/OrdnerB/Beispieldatei.bmp');
 end else
  showmessage('Datei existiert schon!');
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
 if key = 'a' then Button.Click;
end;
Es soll also nur eine Datei von Ornder A nach OrdnerB kopiert werden.
Wenn ich nun die Taste a mehrmals hintereinander drücke(natürlich ändert sich die zu kopierende Datei, habe das jetzt nur der Übersicht halber mit festen strings geschrieben), dann stürzt das Programm ohne Fehlermeldung ab.

Weiß jemand weiter denn wenn ich den Button mehrmals drücke funktioniert alles!

Gruß
MasterDG

s-off 11. Mai 2006 16:20

Re: Absturz bei OnKeyDown
 
Hallo,

Delphi-Quellcode:
if not fileexists('C:/OrdnerA/Beispieldatei.bmp') then
begin
  ReNameFileEx('C:/OrdnerA/Beispieldatei.bmp','C:/OrdnerB/Beispieldatei.bmp');
end else
  showmessage('Datei existiert schon!');
end;
dieses Konstrukt sieht für mich sehr widersprüchlich aus :?:

Oder bin ich jetzt blind :freak:

Muetze1 11. Mai 2006 18:17

Re: Absturz bei OnKeyDown
 
Ich weiss nun nicht aus der Mütze wie die Click Methode vom Button implementiert ist, aber wenn diese nur eine Botschaft einreiht, dann kann ich mir vorstellen, dass dann die Verarbeitung hinterher hinkt. Mit anderen Worten: Du verarbeitest noch eine Datei während durch die Tastenwiederholung schon wieder ein neuer Aufruf angestoßen wurde.

Mavarik 11. Mai 2006 18:22

Re: Absturz bei OnKeyDown
 
Hmm ins Blau -> Würde sagen ist ein Thread problem der API Function..

Warum nicht einfach

Assignfile(F,Datei1)
rename(F,Datei2);

Frank :coder:

PS.: Oder wolltest Du das verschieben in einen Thread auslagern?

MasterDG 12. Mai 2006 16:53

Re: Absturz bei OnKeyDown
 
Hallo!

Danke für die Antworten. Ich hab mich bei Fileexists verschrieben es soll natürlich die Zieldatei getestet werden ob diese existiert.

An das Problem mit der Verarbeitungsgeschwindigtkeit habe ich auch schon gedacht. Aber ich kann den Button so oft und so schnell hintereinander wie ich will drücken, es wird alles ausgeführt...


Gruß
MasterDG


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:09 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