2013-03-19 63 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

相关问题