首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将文本dfm值设置为检查所有dfm文件/ .dfm二进制文件中的行数

如何将文本dfm值设置为检查所有dfm文件/ .dfm二进制文件中的行数
EN

Stack Overflow用户
提问于 2017-03-21 11:10:51
回答 1查看 1.2K关注 0票数 1

在下面的示例中,我正在计算.dfm文件中的行数,由于.dfm是以二进制格式保存的,计数出现了错误。

如果我打开.dfm文件并执行右键单击并将文本dfm设置为“已选中”,则计数将正确进行。下面是代码

代码语言:javascript
复制
function TForm1.FindNumberOfLinesInFile(FileName: String): Integer;
var
  contents : TStringList;
  filestream : TFileStream;
  outStream : TMemoryStream;
begin
  try
    try
      Result := 0;
      contents := TStringList.Create;
      if edtFileToSearch.Text = '.dfm' then
      begin
        contents.LoadFromFile(FileName);
        //i am binary
        if pos('OBJECT', Uppercase(contents[0])) = 0 then // Count is coming wrong with this
        begin
          contents.Clear;
          fileStream := TFileStream.Create(FileName, fmShareDenyNone);
          outStream := TMemoryStream.Create;
          try
            ObjectResourceToText(filestream,outStream);
            outStream.Position := 0;
            Contents.LoadFromStream(outStream);
          finally
            FreeAndNil(outStream);
          end;
        end
        else
        begin
          fileStream := TFileStream.Create(FileName, fmShareDenyNone);
          Contents.LoadFromStream(fileStream);
        end;
      end
      else
      begin
          fileStream := TFileStream.Create(FileName, fmShareDenyNone);
          Contents.LoadFromStream(filestream);
      end;
      Result := contents.Count;
    finally
      FreeAndNil(fileStream);
      FreeAndNil(contents);
    end;
  except
    on e: Exception do Result := -1;
  end;
end;

我有两个问题

1)如何将文本dfm值设置为签入所有dfm文件(我有大约1000个dfm文件)?

2)如何正确加载二进制文件和计数行数?

EN

回答 1

Stack Overflow用户

发布于 2017-03-21 22:52:07

David的回答回答了您的第一个问题:您可以使用Delphi提供的命令行工具将所有现有的二进制DFM转换为文本。

除了解决您当前的问题外,我们还强烈建议这样做,因为它将使您的问题变得更容易(即完全可能!)在版本控制中对DFM文件的更改进行可视化区分。

至于第二部分,如果出于某些原因,您仍然希望或需要处理代码中的二进制DFM文件,则需要使用TestStreamFormat()函数来确定流是有效的资源流,还是二进制或文本格式的流,然后才调用ObjectResourceToText()函数。

此帮助函数将指定的文件名( DFM)的内容返回到所提供的TStrings (例如TStringlist)中,它演示了这一点,并可能简化您的操作:

代码语言:javascript
复制
procedure GetDfmIntoStrings(aFilename: String; aStrings: TStrings);
var
  istrm, ostrm: TStream;
begin
  ostrm := NIL;
  istrm := TFileStream.Create(aFilename, fmOpenRead or fmShareDenyNone);
  try
    case TestStreamFormat(istrm) of

      sofBinary : begin
                    ostrm := TStringStream.Create('');
                    ObjectResourceToText(istrm, ostrm)
                  end;

      sofText   : ostrm := istrm;

    else
      raise EFilerError.Create(aFilename + ' is not a valid resource stream (DFM)');
    end;

    ostrm.Position := 0;
    aStrings.LoadFromStream(ostrm);

  finally
    if ostrm <> istrm then
      ostrm.Free;

    istrm.Free;
  end;
end;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42925414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档