delphi – 如何从图形单元获取所有支持的文件格式?

delphi – 如何从图形单元获取所有支持的文件格式?,第1张

概述当任何TGraphic后代使用类过程TPicture.RegisterFileFormat()注册自己的图形文件格式时,它们都存储在Graphics.FileFormats全局变量中。 太糟糕了,FileFormats变量不在“Graphics.pas”的“interface”部分,所以我无法访问它。我需要读取这个变量来为我的文件列表控件实现一个特殊的过滤器。 我可以在没有手动修复Graphics 当任何TGraphic后代使用类过程TPicture.RegisterfileFormat()注册自己的图形文件格式时,它们都存储在Graphics.fileFormats全局变量中。

太糟糕了,fileFormats变量不在“Graphics.pas”的“interface”部分,所以我无法访问它。我需要读取这个变量来为我的文件列表控件实现一个特殊的过滤器。

我可以在没有手动修复Graphics.pas的源代码的情况下获得该列表吗?

解决方法 您正在使用文件列表控件,大概是文件名列表。如果您不需要知道已注册的实际TGraphic类类型,只需要注册一个给定的文件扩展名(例如,检查以后调用TPicture.LoadFromfile()是否可能成功),您可以使用public GraphicfileMask()函数获取已注册文件扩展名的列表,然后将您的文件名与该列表进行比较。例如:
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;

或者,您可以简单地加载文件,看看会发生什么:

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;

更新:如果要解压扩展和描述,可以使用TStringList.delimitedText解析GraphicFilter()函数的结果:

uses  SysUtils,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;

更新2:如果您只对注册的图形文件扩展名单感兴趣,则假设List是已创建的TStrings后代,请使用以下命令:

ExtractStrings([';'],['*','.'],PChar(GraphicfileMask(TGraphic)),List);
总结

以上是内存溢出为你收集整理的delphi – 如何从图形单元获取所有支持的文件格式?全部内容,希望文章能够帮你解决delphi – 如何从图形单元获取所有支持的文件格式?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1280832.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存