Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Access Violation nach zweiten Aufruf von OpenDialog (https://www.delphipraxis.net/186567-access-violation-nach-zweiten-aufruf-von-opendialog.html)

pmros 12. Sep 2015 17:47

Delphi-Version: 7

Access Violation nach zweiten Aufruf von OpenDialog
 
Ich habe da ein mir unerklärliches Phänomen.

Ich habe einen Button auf einer Form. Der Button öffnet einen OpenDialog, mit dem ich eine Datei auswählen, die ich dann an ein externes Programm übergebe. Das funktioniert beim ersten Mal. Wenn ich dann aber ein zweites mal auf den Button klicke, bekomme ich eine Access Violation. Das Gleiche auch, wenn ich keine Datei im OpenDialog auswähle, sondern auf Abbrechen drücke.

Hier mein Quelltext.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var filename:string;
var ChFilename:string;
begin
openDialog1.Filter :=
    'Xilog Plus Datei|*.pgm|Xilog Plus ASCII Datei|*.xxl';
if OpenDialog1.Execute then
begin
  filename:= OpenDialog1.FileName
end;
filename:=OpenDialog1.FileName;
Chfilename:='"'+filename +'" -s -i';
showmessage(filename);
OpenDialog1.Free;
ShellExecute(Application.Handle, nil, PChar('.\Winxiso.exe'), PChar(Chfilename), nil, SW_SHOW);
SetLength(filename, Length(filename) -3);

If FileExists(filename+'bmp') then begin
Image1.Picture.LoadFromFile(filename+'bmp');
end;
Liegt's an mir?

Luckie 12. Sep 2015 17:50

AW: Access Violation nach zweiten Aufruf von OpenDialog
 
OpenDialoge gibt man nicht frei mit free.

Aviator 12. Sep 2015 17:53

AW: Access Violation nach zweiten Aufruf von OpenDialog
 
Zitat:

Zitat von Luckie (Beitrag 1315621)
OpenDialoge gibt man nicht frei mit free.

Zumindest nicht dann, wenn man ihn auf die Form gezogen hat und nicht zur Laufzeit erstellt.

Sir Rufo 12. Sep 2015 17:55

AW: Access Violation nach zweiten Aufruf von OpenDialog
 
Zitat:

Zitat von Aviator (Beitrag 1315622)
Zitat:

Zitat von Luckie (Beitrag 1315621)
OpenDialoge gibt man nicht frei mit free.

Zumindest nicht dann, wenn man ihn auf die Form gezogen hat und nicht zur Laufzeit erstellt.

Und wenn doch, dann hinterlässt man niemals einen dangling pointer und verwendet besser
Delphi-Quellcode:
FreeAndNil
. Aber ich denke hier ist das Freigeben nicht wirklich beabsichtigt (war wohl mehr ein Reflex) :stupid:

pmros 12. Sep 2015 17:57

AW: Access Violation nach zweiten Aufruf von OpenDialog
 
Mein
Delphi-Quellcode:
OpenDialog1.free;
habe ich auch erst nach den Abstürzen reingesetzt, weil ich gehofft habe, dass es daran liegt.

Leider nicht.

DeddyH 12. Sep 2015 18:08

AW: Access Violation nach zweiten Aufruf von OpenDialog
 
Wie sieht es so aus?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  MAX_SHELLEXECUTE_ERROR = 32;
var
  filename, ChFilename:string;
begin
  OpenDialog1.Filter := 'Xilog Plus Datei|*.pgm|Xilog Plus ASCII Datei|*.xxl';
  if OpenDialog1.Execute then
    begin
      filename:= OpenDialog1.FileName;
      Chfilename:='"'+filename +'" -s -i';
      if ShellExecute(Application.Handle, nil, PChar('.\Winxiso.exe'),
        PChar(Chfilename), nil, SW_SHOW) > MAX_SHELLEXECUTE_ERROR then
        begin
          filename := ChangeFileExt(filename, '.bmp');
          if FileExists(filename) then
            Image1.Picture.LoadFromFile(filename);
        end;
    end;
end;
Sollte es immer noch knallen, müsstest Du einmal durchsteppen und uns die entsprechende Zeile nennen.

pmros 14. Sep 2015 09:22

AW: Access Violation nach zweiten Aufruf von OpenDialog
 
So funktioniert es, danke für die Hilfe!


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