-6

私のプログラムコードは、コンパイル時に問題を引き起こし続けます。プログラムのアイデアは、テキストファイルを配列に読み込むプロシージャを作成することです。ボタンは、それらをリッチエディットに表示します。

元のコードは次のとおりです。

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls;
type
 ArrNames = array [1..10] of string;
 ArrSales = array [1..10] of integer;
type
 TForm1 = class(TForm)
 btnShowData: TButton;
 redt1: TRichEdit;
 procedure btnShowDataClick(Sender: TObject);
  private

  public
{ Public declarations }
end;
Procedure Showdata;
 var
   Form1: TForm1;

implementation

{$R *.dfm}


 Procedure ShowData;
   var c2u : textfile;
     count : integer;
     aNames : arrNames;
     aSales : arrSales;
   Begin
    If FileExists('data.txt') <> true then
     begin
       Messagedlg('File does not exist', mtError, [mbOK], 0);
       Exit;
   end;
       Count :=0;
       AssignFile(c2u, 'data.txt');
       Reset(c2u);
       While Not EOF(c2u) do
         begin
            Inc(Count);
            readln (c2u, aNames[count]);
            readln (c2u, aSales[count]);
         end;
       Closefile(c2u);
    End;

  procedure TForm1.btnShowDataClick(Sender: TObject);
    var J : integer;
        aNames : arrNames;
        aSales : arrSales;
   begin
     redt1.lines.add(aNames[J] +#9 + 'R' +IntToStr(aSales[J]));
   end;

  end.
4

1 に答える 1

7

実際のコードができたので、いくつかの間違いをリストします。

  • ShowData呼び出されることはありません

  • ShowDataファイルからデータを読み取るだけで何も表示されないため、悪い名前です。名前を変更することをお勧めしますReadData

  • aNamesおよびaSalesはプロシージャ/メソッドのローカル変数であり、有効期間はこのプロシージャ/メソッド内のみです。別のプロシージャ/メソッドのローカル変数にアクセスすることはできません。ShowDataTForm1.btnShowDataClick

    解決策: のプライベート フィールドとして定義します。TForm1


マイナーな改善として、すべてのタイプに名前を付ける必要がありますT(例: TMyType)。これは単なる慣例ですが、非常に役立ちます。

命名規則は他にもたくさんあります


If FileExists( 'data.txt' ) <> true

「ファイルが存在しない場合、私は別のことをします」と心の中で書いてください。

if not FileExists( 'data.txt' )

はるかに読みやすくなっています (そして、何人かのユーザーの頭痛の種を止めます ;o) )


これは、すべての改善といくつかのコメントを含む完全なユニットです。

unit Unit1;

interface

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

type
  TArrNames = array [1 .. 10] of string;
  TArrSales = array [1 .. 10] of integer;

type
  TForm1 = class( TForm )
    btnShowData : TButton;
    redt1 : TRichEdit;
    procedure btnShowDataClick( Sender : TObject );
  private
    // private fields of TForm1
    aNames : TArrNames;
    aSales : TArrSales;

    procedure ReadData;  // now it is a private method of TForm1
  public
    { Public declarations }
  end;

  // procedure Showdata; -> renamed/moved to TForm1.ReadData

var
  Form1 : TForm1;

implementation

{$R *.dfm}

// procedure Showdata;
procedure TForm1.ReadData;
var
  c2u :   textfile;
  count : integer;
  // aNames : ArrNames;
  // aSales : ArrSales;
Begin
  // If FileExists( 'data.txt' ) <> true
  // better
  if not FileExists( 'data.txt' )
  then
    begin
      MessageDlg( 'File does not exist', mtError, [mbOK], 0 );
      Exit;
    end;
  count := 0;
  AssignFile( c2u, 'data.txt' );
  Reset( c2u );
  while not EOF( c2u ) do
    begin
      Inc( count );
      ReadLn( c2u, aNames[count] );
      ReadLn( c2u, aSales[count] );
    end;
  CloseFile( c2u );
End;

procedure TForm1.btnShowDataClick( Sender : TObject );
var
  J : Integer;
  // aNames : ArrNames;
  // aSales : ArrSales;
begin
  // first, read the data
  ReadData;
  // loop over each array item
  for J := 1 to 10 do
    redt1.Lines.Add( aNames[J] + #9 + 'R' + IntToStr( aSales[J] ) );
end;

end.
于 2013-03-19T22:16:33.417 に答える