Meine Variante:
Delphi-Quellcode:
//type
// Grad nicht sicher, ob es nen enstprechenden Typ schon gibt:
// TGraphicClass = class of TGraphic;
function CreateImageFromFile(const Filename: string): TGraphic;
var
Adapter: TGraphicClass;
const
ADAPTERS: array[0..2] of TGraphicClass = (TPNGObject, TJPEGImage, TBitmap);
begin
Result := nil;
for Adapter in ADAPTERS do
begin
if Assigned(Result) then break;
Result := Adapter.Create;
try
Result.LoadFromFile(Filename);
except
FreeAndNil(Result);
end;
end;
if not Assigned(Result) then
raise EInvalidGraphic.CreateFmt('Unknown format: "%s"', [Filename]);
end;
var
Graphic: TGraphic;
begin
if (OpenDialog1.Execute) then
begin
try
Graphic := CreateImageFromFile(OpenDialog1.FileName);
try
Image1.Picture.Graphic.Assign(Graphic);
finally
Graphic.Free;
end;
except
on E: EInvalidGraphic do
MessageBox(0, PChar(E.Message), 'Konnte Datei nicht laden', MB_OK or MB_ICONERROR);
else
raise E;
end;
end;
end;
Der Code ist ungetestet und soll nur zur Veranschaulichung dienen. Ich bin zudem grad nicht sicher, ob das mit der Konstantendeklaration so klappt -- ich kann mir nie merken, mit welchen Typen der Compiler das mitmacht und mit welchen nicht. Eventuell muss man die Konstante in eine Variable ändern und dann manuell befüllen.
Vorteil meiner Lösung: Lässt sich leicht erweitern.
@Satty67: TPicture unterscheidet aber afair nur nach Dateiendungen und das reicht dem OP nicht.