Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/32: Рейтинг темы: голосов - 32, средняя оценка - 4.91
Volnyi
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 15
1

Тип записи Record, траблы с записью в тектовый файл

08.05.2010, 11:26. Просмотров 5908. Ответов 11
Метки нет (Все метки)

/Начинающий, поэтому создавал программку руководствуясь справочками/

Есть 4 поля, 1. ФИО студента, 234 - оценки. нужно чтобы эти поля при нажатии кнопки построчно (!) вносились в текстовый файл.
Возникло две проблемы.
1. Вносит он не построчно, если меняю на writeln - начинает ругаться вот такой ошибкой: Illegal type in Write / Writeln statement
2. при просто write - она вносит значения в текстовик, но при открытии текстовика там вот такая гадость:㄃㌲䆃@⦀ÃȃȂ㌃㐲䆃@⦀ÃȃȂ

Подсказывали что можно как то через Memo работать, но чтобы пользователь вносил информацию именно в поля Edit. Тогда не знаю как связать memo c Edit.

Собственно сам код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
unit Unit5;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Spin, ComCtrls;
 
type
    TForm5 = class(TForm)
    Panel1: TPanel;   //расположено для внесения записи
    Label1: TLabel;   // ФИО студента
    Label2: TLabel;   //русский язык
    Label3: TLabel;   //культурология
    Label4: TLabel;   //политоология
    Button2: TButton; //кнопка для внесения записи
    Edit1: TEdit;   //там кнопка для среднего балла
    Edit2: TEdit;     //выбор оценки русский язык
    Edit3: TEdit;     //выбор оценки культурология
    Edit4: TEdit;     //выбор оценки политология
    UpDown1: TUpDown; //выбор оценки русский язык
    UpDown2: TUpDown; //выбор оценки культурология
    UpDown3: TUpDown; //выбор оценки политология
    procedure FormActivate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button2Click(Sender: TObject);
     //нажатие кнопки внести
  private
    { Private declarations }
  public
    { Public declarations }
   end;
 
    TPerson = record // запись о студенте
    Name: String[18]; // ФИО студента
    Rus: Byte;    //русский язык
    Kult: Byte;   //культурология
    Polit: Byte;   //политоология
  end;
 
 
var
  Form5: TForm5;
  f: file of TPerson; // файл записей
 
implementation
 
{$R *.dfm}
 
procedure TForm5.FormActivate(Sender: TObject); //активизация формы
var
  resp: word; // ответ пользователя
begin
  AssignFile(f, '123.txt');
{$I-}
  Reset(f); // открыть файл
  Seek(f , FileSize(f)); // указатель записи в конец файла
{$I+}
  if IOResult = 0
    then button2.enabled := TRUE // теперь кнопка Добавить доступна
  else
  begin
    resp := MessageDlg('Файл не найден.' +
      'Создать новый?', mtInformation, [mbYes, mbNo], 0);
    if resp = mrYes then
    begin
{$I-}
      rewrite(f);
{$I+}
      if IOResult = 0
        then button2.enabled := TRUE
      else ShowMessage('Ошибка создания файла.');
    end;
  end;
end;
 
 
 
procedure TForm5.Button2Click(Sender: TObject);//щелчок на кнопке добавить
var
Person: TPerson;
begin
    with Person do
  begin
    Name:= Edit1.Text;
    Rus:= UpDown1.Position;
    Kult:= UpDown2.Position;
    Polit:= UpDown3.Position;
  end;
 
 write (f , Person); // записать содержимое полей записи в файл
end;
 
procedure TForm5.FormClose(Sender: TObject; var Action: TCloseAction);// завершение работы программы
begin
CloseFile(f); // закрыть файл
end;
 
 
 
end.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2010, 11:26
Ответы с готовыми решениями:

тип Record
Заполните программу об вкладчиков банка: фамилия имя отчество сумма вклада дата...

Подскажите, пожалуйста, новичку: тип record
Привет всем! Помогите, пожалуйста новичку разобраться с таким типом данных, как...

Тип данных record (запись). Помогите пожалуйста!
Задание: В соответствии с индивидуальным вариантом необходимо составить...

Использовать тип record в модуле в котором он не объявлен
Что то я задолбался или моск замылился, вообще не соображаю. Выручайте...

Обьявить тип записи, выделить память динамически для этой записи и в одно из полей записи стрин
И вывести оценку в поле шоу мэсседж

11
harmless
147 / 147 / 2
Регистрация: 05.05.2010
Сообщений: 569
08.05.2010, 11:30 2
Delphi
1
2
3
...
f: file of TPerson;
...
Объявлен типизированный файл, а не текстовый. Отображается соответственно "гадко" .
0
Puporev
Модератор
55433 / 42554 / 29407
Регистрация: 18.05.2008
Сообщений: 100,671
08.05.2010, 11:33 3
Все что вводите, собираете в одну строку. Эту строку записываете в файл, типа
Delphi
1
2
s:=Edit1.text+' '+Edit2.text+,' '+.......;
writeln(f,s);
1
Volnyi
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 15
08.05.2010, 11:38  [ТС] 4
если меняю на Textfile
начинает внезапно ругаться
Seek(f, FileSize(f)); // указатель записи в конец файла [DCC Error] Unit5.pas(57): E2008 Incompatible types

и на
write (f, Person); // записать содержимое полей записи в файл [DCC Error] Unit5.pas(91): E2054 Illegal type in Write/Writeln statement

__________________
Все что вводите, собираете в одну строку. Эту строку записываете в файл, типа
пробую.
0
Puporev
Модератор
55433 / 42554 / 29407
Регистрация: 18.05.2008
Сообщений: 100,671
08.05.2010, 11:41 5
начинает внезапно ругаться
Seek(f, FileSize(f))
и правильно ругается, так в текстовый файл не пишут.

Добавлено через 1 минуту
Pascal
1
2
3
4
5
6
var f:textfile;
     s:string;
...............................
rewrite(f);
s:=Edit1.text+' '+Edit2.text+,' '+.......;
writeln(f,s);
0
Volnyi
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 15
08.05.2010, 22:45  [ТС] 6
Delphi
1
2
3
4
5
6
7
8
procedure TForm5.Button2Click(Sender: TObject);//щелчок на кнопке добавить
var
    s: string;
begin
  Append (f); // открыть файл
  S:=Edit1.Text+' '+Edit2.Text+' '+Edit3.Text+' '+Edit4.Text;
 writeln (f,s); // записать содержимое полей записи в файл
end;
вот такая штука получилась.
заносит строки, имя и три цифры с пробелами, вот почему то когда так писал:Edit1.Text+' '+Edit2.Text+,' '+Edit3.Text+,' '+Edit4.Text; -ругался на запятые ( .

теперь сижу мучаюсь со второй частью со считыванием всех цифр из этого файла и вычисления среднего значения оных. А также вывод всех строк где только пятерки ... воот.
0
Puporev
Модератор
55433 / 42554 / 29407
Регистрация: 18.05.2008
Сообщений: 100,671
08.05.2010, 22:49 7
Цитата Сообщение от Volnyi Посмотреть сообщение
ругался на запятые ( .
А на фига ты их написал?

Delphi
1
s:=Edit1.Text+' '+Edit2.Text+' '+Edit3.Text+' '+Edit4.Text;
0
Volnyi
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 15
08.05.2010, 23:46  [ТС] 8
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
procedure TForm5.Button3Click(Sender: TObject);
var
s: string;
i, b: Integer;
Num, Sum : Integer;
g : integer;
begin
  i := 0;
  Sum:= 0;
  b:=0;
  Reset(f);
 
 while not eof(f) do begin // колво строк
   Readln(f,s);
   inc(i);
  end;
 
  while not eof(f) do begin //сумма - 
   Read(F, Num);
   Sum := Sum + Num;
   inc(b);
  end;
  G:=b/(3*i); //3*i сколько чисел
  ShowMessage(IntToStr(b));
  closefile(f);
end;
вот на сумму выдает 0, что не так (
ShowMessage(IntToStr(b)); - проверял сумму.
0
Страдалецъ
Тимуровец
444 / 287 / 50
Регистрация: 10.09.2009
Сообщений: 963
09.05.2010, 00:25 9
Файл у вас текстовый, вот и читайте сначала в строковую переменную, преобразовывайте в число, а уже потом в расчетах используйте. Или сделайте сразу типизированный файл.
0
Volnyi
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 15
09.05.2010, 02:46  [ТС] 10
Если очень долго мучиться...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
unit Unit5;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Spin, ComCtrls;
 
type
    TForm5 = class(TForm)
    Panel1: TPanel;   //расположено для внесения записи
    Label1: TLabel;   // ФИО студента
    Label2: TLabel;   //русский язык
    Label3: TLabel;   //культурология
    Label4: TLabel;   //политоология
    Button2: TButton; //кнопка для внесения записи
    Edit1: TEdit;   //там кнопка для среднего балла
    Edit2: TEdit;     //выбор оценки русский язык
    Edit3: TEdit;     //выбор оценки культурология
    Edit4: TEdit;     //выбор оценки политология
    UpDown1: TUpDown; //выбор оценки русский язык
    UpDown2: TUpDown; //выбор оценки культурология
    UpDown3: TUpDown;
    Button1: TButton;
    Button3: TButton; //выбор оценки политология
    procedure FormActivate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
 
  private
    function GetMean(S:string): real;
    { Private declarations }
  public
    { Public declarations }
   end;
 
var
  Form5: TForm5;
  f: textfile; // файл записей
implementation
 
{$R *.dfm}
 
procedure TForm5.FormActivate(Sender: TObject); //активизация формы
var
  resp: word; // ответ пользователя
  begin
  AssignFile(f, '123.txt');
{$I-}
  reset(f); // открыть файл
{$I+}
  if IOResult = 0
    then button2.enabled := TRUE // теперь кнопка Добавить доступна
  else
  begin
    resp := MessageDlg('Файл не найден.' +
      'Создать новый?', mtInformation, [mbYes, mbNo], 0);
    if resp = mrYes then
    begin
    {$I-}
      rewrite(f);
     {$I+}
      if IOResult = 0
        then
         button2.enabled := TRUE
      else ShowMessage('Ошибка создания файла.');
      CloseFile(f); // закрыть файл
    end;
  end;
end;
 
procedure TForm5.Button1Click(Sender: TObject);
 begin
 CloseFile(f); // закрыть файл
end;
 
procedure TForm5.Button2Click(Sender: TObject);//щелчок на кнопке добавить
var
    s: string;
begin
  Append (f); // открыть файл
  S:=Edit1.Text+' '+Edit2.Text+' '+Edit3.Text+' '+Edit4.Text;
 writeln (f,s); // записать содержимое полей записи в файл
end;
 
procedure TForm5.Button3Click(Sender: TObject);
 var s:string; Count:integer; Sum: Real;
 begin
 Sum:=0;
 Count:=0;
 Reset(f);
  while not Eof(f) do begin
  Readln(f, s);
   Sum:=Sum+GetMean(s);
  inc(Count);
  end;
 
  ShowMessage(FloatToStr(Sum/Count));
end;
 
function TForm5.GetMean(S:string): real;
  var i:integer;
    Count, Sum:integer;
 begin
 Count:=0;
 Sum:=0;
  for i:=1 to length(S) do
    if S[i] in ['2'..'5'] then
    begin
       inc(Count);
       Sum:=Sum+StrToInt(S[i]);
       end;
    Result:=Sum/Count;
 end;
 
end.
старший товарищ подсказал про функцию
реализовал вот так. /код выше)/
осталось последний цикл добить - считывание строк с файла и вывод фамилий отличников.
0
Андрей Борисови
709 / 397 / 33
Регистрация: 04.10.2009
Сообщений: 1,687
09.05.2010, 08:14 11
Самый простой способ:
1. Берем таблицу (StrinGreed)
2. делаем 3 поля (нужные вам)
3. Заполняем
4. Стрингрид.saveto...
0
Volnyi
0 / 0 / 0
Регистрация: 08.05.2010
Сообщений: 15
11.05.2010, 03:07  [ТС] 12
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
unit Unit5;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Spin, ComCtrls;
 
type
    TForm5 = class(TForm)  //форма
    Panel1: TPanel;   //расположено для внесения записи
    Label1: TLabel;   // ФИО студента
    Label2: TLabel;   //русский язык
    Label3: TLabel;   //культурология
    Label4: TLabel;   //политоология
    Button2: TButton; //кнопка добавить
    Edit1: TEdit;   //фамиилия студента
    Edit2: TEdit;     //выбор оценки русский язык
    Edit3: TEdit;     //выбор оценки культурология
    Edit4: TEdit;     //выбор оценки политология
    UpDown1: TUpDown; //выбор оценки русский язык
    UpDown2: TUpDown; //выбор оценки культурология
    UpDown3: TUpDown; //выбор оценки политология
    Button1: TButton;//закрыть файл
    Button3: TButton;//средний балл
    Label5: TLabel;//про ввод данных
    Memo2: TMemo;//для текущих данных
    Label6: TLabel;//что есть в файле
    Memo3: TMemo;//список которые есть
    Memo1: TMemo;//список человек балл которых больше среднего
    Button4: TButton; //инструкция
    procedure FormActivate(Sender: TObject);//активация формы
    procedure Button2Click(Sender: TObject);//нажать добавить
    procedure Button1Click(Sender: TObject);//нажать закрыть
    procedure Button3Click(Sender: TObject); //нажать средний балл
    procedure Button4Click(Sender: TObject);  //нажать что в файле
 
  private
    function GetMean(S:string): real;//функция среднего значения каждой строки в файле
    { Private declarations }
  public
    { Public declarations }
   end;
 
var
  Form5: TForm5;
  f: textfile; // файл записей
implementation
 
{$R *.dfm}
 
procedure TForm5.FormActivate(Sender: TObject); //активизация формы
var
  resp: word; // ответ пользователя
  begin
  Memo1.Lines.Clear;
  Memo2.Lines.Clear;
  Memo3.Lines.Clear;
  AssignFile(f, '123.txt');
{$I-}
  reset(f); // открыть файл
{$I+}
  if IOResult = 0
    then button2.enabled := TRUE // теперь кнопка Добавить доступна
  else
  begin
    resp := MessageDlg('Файл не найден.' +
      'Создать новый?', mtInformation, [mbYes, mbNo], 0);
    if resp = mrYes then
    begin
    {$I-}
      rewrite(f);
     {$I+}
      if IOResult = 0
        then
         button2.enabled := TRUE
      else ShowMessage('Ошибка создания файла.');
      CloseFile(f); // закрыть файл
    end;
  end;
end;
 
procedure TForm5.Button1Click(Sender: TObject); //нажать закрыть
 begin
 CloseFile(f); // закрыть файл
 Memo2.Lines.Clear;
end;
 
 
procedure TForm5.Button2Click(Sender: TObject);//щелчок на кнопке добавить
var
    s: string;
begin
  Append (f); // открыть файл
  S:=Edit1.Text+','+Edit2.Text+','+Edit3.Text+','+Edit4.Text;
 writeln (f,s); // записать содержимое полей записи в файл
 Memo2.Lines.Add (s); // записать содержимое полей в memo2
 Edit1.Text:='';
end;
 
procedure TForm5.Button3Click(Sender: TObject);//нажать средний балл
 var s:string; Count:integer; Sum, G: Real;
 begin
 Sum:=0;
 Count:=0;
 Reset(f);
  while not Eof(f) do begin
  Readln(f, s);
  Sum:=Sum+GetMean(s);
  inc(Count);
  end;
  G:=sum/count;
   CloseFile(f);
    if G>0 then
    Reset(f);
    while not Eof(f) do
    begin
    Readln(f, s);
    if GetMean(s) > G then
    Memo1.Lines.Add(s);
    end;
   ShowMessage(FloatToStr(G));
   CloseFile(f);
end;
 
procedure TForm5.Button4Click(Sender: TObject);//нажать что в файле
  var s:string;
begin
  Reset(f);
 while not EOF(f) do
  begin
    readln(f, s); // прочитать строку из файла
    Memo3.Lines.Add(s); // добавить строку в поле Memo3
  end;
  CloseFile(f); // закрыть файл
end;
Вот что получилось. собственно возникла проблема при нажатии кнопки Средний балл. Пришлось закрыть и открыть файл, потому как не смог правильно реализовать Seek.
0
11.05.2010, 03:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2010, 03:07

Компилятор не опознаёт пользовательский тип данных record E2003
Delphi XE3. Компилятор не опознает пользовательский тип данных, объявление типа...

Чтение записи(record) из TMemoryStream
С Делфи только начинаю разбираться, и сразу возникло непонимание. Нужно...

Обращение к записи (record) по ее адресу
Здравствуйте, уважаемые форумчане. Писал программу с использованием списков для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru