4

私は Delphi 2010 をテストしていますが、次のような誤りがありました:
この一連の文字 "096 - Construção Ltda" を入力して、別の変数に移動するだけで、"096 - Construãão Ltda」、それを見つける方法を知っている人はいますか???

エントランスベース

001 Alcides João Pereira
002 Alvir Maçaneiro
003 Auto Elétrica Imamura Ltda
004 Auto Peças Araújo
005 Auto Peças Porto Eixo Ltda
006 Auto Peças União
007 Azambuja Industria Comercio de Materiais de Construção Ltda
008 Balaroti Comercio De Materiais De Construção
Ltda
010 Battistella Veículos Pesados Ltda
011 Berton Diesel Auto Peças
012 Bisolo Materiais de Construção Ltda

procedure TForm1.Button2Click(Sender: TObject);
var
   tfEntrada : TextFile;
   intI, intJ : Integer;
   strA, strS : String;

   procedure lerUm; //To read a registration of the file text
   begin
      inc( intI );
      ReadLn( tfEntrada, strS );

      strA := Copy( IntToStr( intI + 1000 ), 2, 3 ) + ' - ';
      Edit1.Text := strS;

   end;

begin

   intI := 0;
   AssignFile( tfEntrada, 'nomes_tst_0001.txt' );
   Reset( tfEntrada );

   lerUm;

   while not Eof ( tfEntrada ) do
   begin

     mmEntrada.Lines.Add( strA + strS ); //I move for TMemo(mmEntrada, mmSaida), in the form

     mmSaida.Lines.Add( strA + strS );

     lerUm;

  end;

  CloseFile( tfEntrada );

end;

結果ベース

001 - Alcides João Pereira
002 - Alvir Maçaneiro
003 - Auto Elétrica Imamura Ltda
004 - Auto Peças Araújo
005 - Auto Peças Porto Eixo Ltda
006 - Auto Peças União
007 - Azambuja Industria Comercio de Materiais de Construão Ltda
008 - Balaroti Comercio De Materiais De Construão Ltda
009 - Baldissera Logística e Transportes Ltda Me
010 - Battistella Veículos Pesados Ltda
011 - Berton Diesel Auto Peças 012 - Bisolo Materiais de Construãão Ltda

4

1 に答える 1

4

AssignFile を使用しないでください。これはレガシー コードであり、UnicodeStrings では機能しません。代わりに、TStringList または TFileStream を使用してファイルを読み取ります。

[未テスト]

procedure ReadFile;  
var  
  vFileReader : TstringList;  
begin  
  vFileReader := TStringList.Create;  
  try
    vFileReader.LoadFromFile('nomes_tst_0001.txt');  
    mmEntrada.Lines.Assign(vFileReader);  
  finally
    vFileReader.Free;  
  end;
end;

編集済み

別の良い解決策は、私がずっと前に書いた次の関数です。

【テスト済み】

function GetFileAsString(aFileName: string; aOffSet : Integer = 0; aChunkSize: Integer = -1): string;
var
  vStream: TFileStream;
  vBuffer: TBytes;
  vCurEncoding, vDefEncoding: TEncoding;
  vOffSet: Integer;
  vFileSize: Int64;
begin
  vCurEncoding := nil;
  vDefEncoding := TEncoding.Default;
  vStream := TFileStream.Create(aFileName, fmOpenRead + fmShareDenyNone);
  try
    if aChunkSize > 0 then begin
      vFileSize := aChunkSize;
    end
    else begin
      vFileSize := vStream.Size;
    end;
    vStream.Position := aOffSet;
    SetLength(vBuffer, vFileSize);
    vStream.ReadBuffer(Pointer(vBuffer)^, vFileSize);
    vOffSet := TEncoding.GetBufferEncoding(vBuffer, vCurEncoding);
    if (vCurEncoding <> vDefEncoding) then begin
      vBuffer := TEncoding.Convert(vCurEncoding, vDefEncoding, vBuffer, vOffSet,   vFileSize - vOffSet);
    end;
    Result := vDefEncoding.GetString(vBuffer);
  finally
    vStream.Free;
  end;
end;

この関数は、Unicode 文字列 (BOM 付き) と ansistring を処理できます。実際、あらゆる種類のテキスト ファイルを読み取ることができます。

于 2011-03-17T02:59:03.830 に答える