Sie arbeiten mit einem Datei-List-Steuerelement, und vermutlich damit eine Liste von Dateinamen. Wenn Sie die tatsächlichen TGraphic
Klassentypen, die registriert sind, nicht kennen müssen, nur ob eine bestimmte Dateierweiterung registriert ist oder nicht (z. B. um zu überprüfen, ob ein späterer Aufruf an TPicture.LoadFromFile()
wahrscheinlich erfolgreich ist), können Sie die öffentliche GraphicFileMask()
verwenden Funktion, um eine Liste der registrierten Dateierweiterungen zu erhalten und dann Ihre Dateinamen mit dieser Liste zu vergleichen.Zum Beispiel:
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;
Oder könnten Sie einfach die Datei laden und sehen, was passiert:
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;
Update: wenn Sie die Erweiterungen und Beschreibungen extrahieren möchten, können Sie TStringList.DelimitedText
verwenden können, analysieren das Ergebnis der GraphicFilter()
Funktion:
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;
Update 2:, wenn Sie nur Interesse an einer Liste der registrierten Grafikdateierweiterungen sind, dann, List
Annahme, daß ein bereits erstellt TStrings
Nachkommen, verwenden Sie diese:
ExtractStrings([';'], ['*', '.'], PChar(GraphicFileMask(TGraphic)), List);
Es wird auch im Zusammenhang [QC Bericht # 11837] (http: // qc.embarcadero.com/wc/qcmain.aspx?d=11837) Wert zu wählen –