Nein, tut mir leid, aber ich habe dein Projekt gerade mal mit dem
Debugger durchgesteppt und die erste
Exception wird hier geworfen:
Delphi-Quellcode:
constructor TResourceStream.CreateFromID(Instance: THandle; ResID: Integer;
ResType: PChar);
begin
inherited Create;
Initialize(Instance, PChar(ResID), ResType, True);
// <- da kommt die Exception
end;
dann wird im gleichen Atemzug
TResourceStream.Destroy
ganz brav und ohne weitere
Exception durchlaufen, dann kommt die Ausgabe der MessageBox mit der
Exception.
Der
lokalen Variablen
ResStream
wird
kein Wert zugewiesen!
Den Rest der Begründung findest du in meinem Post vorher.
Wenn du mit Resourcen arbeiten möchtest, dann kannst du dir auch einmal diesen Post von mir anschauen
http://www.delphipraxis.net/1330587-post3.html
Um meine Aussage zu überprüfen brauchst du lediglich
eine Zeile einfügen:
Delphi-Quellcode:
procedure TForm1.LoadPNG(ID : Integer);
var
ResStream : TResourceStream;
Png : TPngImage;
begin
ResStream :=
nil;
// eine Zeile, die tut auch nix, die will nur spielen!
try
try
ResStream := TResourceStream.CreateFromID(0, ID, RT_RCDATA);
Png := TPngImage.Create;
try
Png.LoadFromStream(ResStream);
Image1.Picture.Graphic := Png;
finally
Png.Free;
end;
except
on E :
Exception do
ShowMessage(E.
Message);
end;
finally
// kann ersatzlos entfallen
// if Assigned(ResStream) then
ResStream.Free;
// <- Warum ein Free zu einem Fehler !!!? <- Kommt ja jetzt nicht mehr
end;
end;
Und noch etwas zum Thema Resource-Dateien
Wenn du die *.RC Datei in dein Projekt aufnimmst, dann wird diese Datei automatisch beim Erzeugen des Projekts erstellt und eingebunden. Das umständliche und manuelle Erzeugen der *.res Datei entfällt.
So sieht das dann in der
dpr aus
Delphi-Quellcode:
program ResTest;
{$R 'Resources.res' '..\Rescource\Resources.rc'} // <- diese Zeile wird automatisch von Delphi erstellt
uses
Forms,
frmMain in 'frmMain.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.