2

バイナリファイルを読み込んで結果をメモに表示したいのですが、「互換性のない型: 'string' and 'Array'」というエラーの対処方法がわかりません。コードは次のとおりです。

unit yo;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  F: TFileStream;
  Buffer: array [0 .. 1023] of byte;
begin

  F := TFileStream.Create(ExtractFilePath(Application.ExeName)
      + 'yo.exe', fmOpenRead);

  while F.Position < F.Size do
  begin

    F.Read(Buffer, 1024);
    Memo1.Lines.Add(Buffer);

  end;

  F.Free;

end;

このエラーを回避し、エラーなしでプログラムを実行できましたか?

誰でも私を助けることができますか?

4

2 に答える 2

7

バイト配列は文字列ではないため、コンパイラのメッセージは、その内容を正確に意味します。バイトは数値です。文字列はテキストです。数値はテキストではないため、プロセスのどこかで、数値をテキストに変換する方法をプログラムに指示する必要があります。

1 つの方法は、各数値を対応する数字に変換することです。例えば:

F.Read(Buffer, 1024);
s := '';
for b in Buffer do
  s := s + IntToStr(b);
Memo1.Lines.Add(s);

各バイトを対応する数値を持つ文字に変換する場合は、変換はまったく必要ありません。嘘をついて、ファイルにテキストが含まれていることをプログラムに伝えて、メモ コントロールに直接ロードできるようにします。

Memo1.Lines.LoadFromFile(FileName);

印刷可能な文字を表すことができるファイル内のバイトをそのまま表示し、印刷できない文字を表すバイトを数値で表示する場合は、上記のループと同様に、各文字を個別に処理できます。

F.Read(Buffer, 1024);
s := '';
for b in Buffer do begin
  c := AnsiChar(b);
  if TCharacter.IsControl(c) then
    s := s + IntToStr(b)
  else
    s := s + c;
end;
Memo1.Lines.Add(s);

データ変換は任意の方法で定義できます。必要な出力を指定し、それを生成するコードを記述するだけです。必要なものを指定しておらず、正確に記述できない場合は、まだコードの準備ができていません。

于 2013-07-11T20:24:07.570 に答える