2013-03-19 2 views
-5

мой код программы продолжает давать проблемы при компиляции. Идея программы состоит в том, чтобы создать процедуру, которая будет читать текстовые файлы в массиве. Затем кнопка отобразит их на richedit.Недопустимый тип-тип в процедуре

Вот исходный код:

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 - способ «Delphi» для этого? –

+2

Что такое * точная ошибка сообщения, которое вы получаете? –

+6

Ник прав об использовании TStringList. Кроме того, вы не показали нам, что определяется как «ArrNames». Зная, что это поможет. –

ответ

7

Теперь иметь свой реальный код Я перечислю некоторые ваших ошибок:

  • ShowData никогда не называют
  • ShowData является плохое имя, потому что оно ничего не показывает, но на LY чтения данных из файла, так что лучше переименовать его в ReadData
  • aNames и aSales являются местные переменные процедуры ShowData/метод TForm1.btnShowDataClick и время жизни только внутри этой процедуры/метода. Вы не можете получить доступ к локальным переменным другой процедуры/метода.

    Решение: Определить их как частные области TForm1


в качестве улучшения незначительные вы должны назвать все типы, начиная с T (например TMyType). Это просто соглашение, но очень полезно.

Есть a lot more of naming conventions


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

не является неправильным, но плохо, и вы должны написать его как в вашем уме «Если файл не существует, то я буду делать что-то другое»

if not FileExists('data.txt')

is more readab ле (и остановить головные боли на нескольких пользователей; о))


Вот полный блок со всеми улучшениями и некоторые замечания в ней.

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

И измените нелогичный 'If FileExists ('data.txt') <> true, а затем' to 'if not FileExists ('data.txt') then'. Двойные негативы и ненужное сравнение с TRue болит голова. –

+0

Что произойдет, если в файле больше десяти строк? Было бы лучше переместить всю процедуру «ReadData» в обработчик событий кнопки, имея загруженный компонент редактирования непосредственно из файла без этих ограниченных массивов. –

+2

@ No'amNewman 1) Данные внутри файла должны быть преобразованы/интерпретированы для вывода. 2) Это упражнение для промежуточных звеньев, и одна из целей - обработка массивов. –

Смежные вопросы