Bạn đang làm việc với một điều khiển file-list, và có lẽ vì thế một danh sách các tên tập tin. Nếu bạn không cần biết các loại lớp thực tế đã đăng ký, chỉ cho dù một phần mở rộng tệp đã được đăng ký hay không (chẳng hạn như để kiểm tra xem cuộc gọi sau có đến số TPicture.LoadFromFile()
có khả năng thành công) hay không, bạn có thể sử dụng công khai GraphicFileMask()
để có danh sách các đuôi tệp đã đăng ký và sau đó so sánh tên tệp của bạn với danh sách đó.Ví dụ:
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;
Hoặc, bạn chỉ có thể tải các tập tin và xem những gì sẽ xảy ra:
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;
Cập nhật: nếu bạn muốn trích xuất các phần mở rộng và mô tả, bạn có thể sử dụng TStringList.DelimitedText
để phân tích kết quả của GraphicFilter()
chức năng:
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;
cập nhật 2: nếu bạn chỉ quan tâm đến một danh sách các phần mở rộng tập tin đăng ký đồ họa, sau đó, giả sử List
là đã tạo TStrings
hậu duệ, sử dụng này:
ExtractStrings([';'], ['*', '.'], PChar(GraphicFileMask(TGraphic)), List);
Ngoài ra còn có liên quan [QC báo cáo # 11837] (http: // qc.embarcadero.com/wc/qcmain.aspx?d=11837) đáng để bỏ phiếu –