2013-03-19 102 views
-5

我的程序代碼在編譯時一直給我帶來麻煩。程序的想法只是創建一個將文本文件讀入數組的過程。該按鈕然後將顯示它們在一個豐富的。程序中無效的類型轉換

這裏是原代碼:

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. 
+2

是否有任何理由你沒有使用TStringList - 「德爾福」的方式來做到這一點? – 2013-03-19 20:36:44

+2

你得到了什麼*確切*錯誤信息? – 2013-03-19 20:37:17

+6

尼克關於使用TStringList的權利。另外,你還沒有向我們展示什麼'ArrNames'被定義爲。知道這將有所幫助。 – 2013-03-19 20:37:19

回答

7

現在有你真正的代碼我將列出你的錯誤的一些

  • ShowData從未被稱爲
  • ShowData是壞名字,因爲它不顯示任何東西但在LY 讀取數據從一個文件,所以最好其重命名爲ReadData
  • aNamesaSales程序ShowData /方法TForm1.btnShowDataClick的局部變量和壽命只有內部此過程/方法。你不能訪問另一個過程/方法的局部變量。

    解決方案:將它們定義爲的TForm1


私有字段作爲未成年改善你應該命名開始T(例如TMyType)所有類型。這只是一個慣例,但非常有幫助。

a lot more of naming conventions


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

是沒有錯的,但壞的,你應該把它寫在你的心中「如果該文件不存在,我會做不同的事情

if not FileExists('data.txt')

更多readab le(並停止幾個用戶的頭痛; 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. 
+0

如果不是FileExists('data.txt')then',則將不合邏輯的'If FileExists('data.txt')<> true then''改爲'雙重否定和與TRUE的不必要的比較傷害了我的頭。 – 2013-03-20 01:21:49

+0

如果文件中的行數超過10行,會發生什麼情況?將整個'ReadData'過程移動到按鈕事件處理程序中會更好,讓富文本編輯組件直接從文件中加載而沒有限制數組。 – 2013-03-20 04:28:15

+2

@ No'amNewman 1)文件內的數據必須轉換/解釋輸出。 2)這是一箇中間體的練習,其中一個目標是數組處理 – 2013-03-20 07:32:31

相關問題