Se está trabajando con un control de lista de archivos, y, presumiblemente, por tanto, una lista de nombres de archivo. Si no necesita conocer los tipos de clase reales TGraphic
que están registrados, solo si una extensión de archivo determinada está registrada o no (por ejemplo, para verificar si una llamada posterior al TPicture.LoadFromFile()
es probable que tenga éxito), puede utilizar el público GraphicFileMask()
función para obtener una lista de extensiones de archivo registradas y luego comparar sus nombres de archivo a esa lista.Por ejemplo:
uses
SysUtils, Classes, Graphics, Masks;
function IsGraphicClassRegistered(const FileName: String): Boolean;
var
Ext: String;
List: TStringList;
I: Integer;
begin
Result := False;
Ext := ExtractFileExt(FileName);
List := TStringList.Create;
try
List.Delimiter := ';';
List.StrictDelimiter := True;
List.DelimitedText := GraphicFileMask(TGraphic);
for I := 0 to List.Count-1 do
begin
if MatchesMask(FileName, List[I]) then
begin
Result := True;
Exit;
end;
end;
finally
List.Free;
end;
end;
O, simplemente puede cargar el archivo y ver lo que sucede:
uses
Graphics;
function GetRegisteredGraphicClass(const FileName: String): TGraphicClass;
var
Picture: TPicture;
begin
Result := nil;
try
Picture := TPicture.Create;
try
Picture.LoadFromFile(FileName);
Result := TGraphicClass(Picture.Graphic.ClassType);
finally
Picture.Free;
end;
except
end;
end;
Actualización: si desea extraer las extensiones y las descripciones, se puede utilizar TStringList.DelimitedText
para analizar el resultado de la función GraphicFilter()
:
uses
SysUtils, Classes, Graphics;
function RPos(const ASub, AIn: String; AStart: Integer = -1): Integer;
var
i: Integer;
LStartPos: Integer;
LTokenLen: Integer;
begin
Result := 0;
LTokenLen := Length(ASub);
// Get starting position
if AStart < 0 then begin
AStart := Length(AIn);
end;
if AStart < (Length(AIn) - LTokenLen + 1) then begin
LStartPos := AStart;
end else begin
LStartPos := (Length(AIn) - LTokenLen + 1);
end;
// Search for the string
for i := LStartPos downto 1 do begin
if Copy(AIn, i, LTokenLen) = ASub then begin
Result := i;
Break;
end;
end;
end;
procedure GetRegisteredGraphicFormats(AFormats: TStrings);
var
List: TStringList;
i, j: Integer;
desc, ext: string;
begin
List := TStringList.Create;
try
List.Delimiter := '|';
List.StrictDelimiter := True;
List.DelimitedText := GraphicFilter(TGraphic);
i := 0;
if List.Count > 2 then
Inc(i, 2); // skip the "All" filter ...
while i <= List.Count-1 do
begin
desc := List[i];
ext := List[i+1];
j := RPos('(', desc);
if j > 0 then
desc := TrimRight(Copy(desc, 1, j-1)); // remove extension mask from description
AFormats.Add(ext + '=' + desc);
Inc(i, 2);
end;
finally
List.Free;
end;
end;
actualización 2: si están interesados sólo en una lista de extensiones de archivos gráficos registrados, entonces, asumiendo List
es una ya creada TStrings
descendiente, utilice esto:
ExtractStrings([';'], ['*', '.'], PChar(GraphicFileMask(TGraphic)), List);
También se relaciona [QC informe # 11837] (http: // qc.embarcadero.com/wc/qcmain.aspx?d=11837) vale la pena votar –