Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Mr_Bula
0 / 0 / 0
Регистрация: 29.04.2013
Сообщений: 98
#1

Сохранение таблицы в двоичный файл - Delphi

30.10.2014, 06:18. Просмотров 975. Ответов 21
Метки нет (Все метки)

Здравствуйте, подскажите пожалуйста, как реализовать следующую задачу. На форме есть таблица, в ней 4 столбца и несколько строк, пользователь вводит в таблицу данные(фамилия, имя, группа, оценка). После нажатия на кнопку, программа должна создать двоичный файл и записать туда введенные данные. А после считать от туда строки с указанной группой и оценкой. Представления не имею что из себя представляет двоичный файл
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2014, 06:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сохранение таблицы в двоичный файл (Delphi):

Сохранение таблицы в текстовый файл - Delphi
Здравствуйте. Необходимо записать данные из stringgrid в текстовый файл, но в дальнейшем необходимо будет их считывать также в stringgrid,...

Вывод результата программы в текстовый файл и в двоичный файл с именем, задаваемым пользователем - Delphi
Подскажите пожалуйста, что нужно исправить. Нужно организовать вывод результата программы в текстовый файл и в двоичный файл с именем,...

Пытаюсь перевести файл в двоичный код - Delphi
Пожалуйста кто может помогите... Ситуация такая нужно открыть файл в двоичном коде 10101110... и вывести в мемо... вот делаю так... ...

Сохранение таблицы с параметрами - Delphi
Доброго времени суток. Имеется таблица Stringgrid которая сохраняется в файл Excel. Проблема в том что соххраняется впросто таблица ввиде...

Сохранение и загрузка таблицы (StringGrid) - Delphi
Мне задали задание сохранить, сохранить как и открыть stringgrid. С диалогами умею делать ток memo. Помогите плиз сделать программу.

Сохранение таблицы html в word - Delphi
Добрый вечер! Такой вопрос. Программа, несколько дочерних окон отображают различную информацию через WebBrowser. Одна страница с...

21
Puporev
Модератор
53020 / 40831 / 14075
Регистрация: 18.05.2008
Сообщений: 94,978
30.10.2014, 07:13 #2
Цитата Сообщение от Mr_Bula Посмотреть сообщение
что из себя представляет двоичный файл
Типизированный файл, в данном случае файл записей.
Delphi
1
2
3
4
5
6
7
type stud=record
         familia:string[20];
         imya:string[20];
         gruppa:string[20];
         ocenka:byte;
         end;
f:file of stud;
0
Mr_Bula
0 / 0 / 0
Регистрация: 29.04.2013
Сообщений: 98
30.10.2014, 08:09  [ТС] #3
Извините что пишу здесь, но не подскажите кое что, вот написал код, программа вроде бы должна делать всё выше перечисленное, но ругается на строку: (students[i].Mark = Mrk.Value) then, пишет что то вроде -
[Error] Unit1.pas(127): Record, object or class type required
Ничего понять не могу, делал по учебнику, и не работает всё равно.


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
 type
  TStudents = record
   LastName, FirstName, Group : ShortString;
   Mark : integer;
  end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 Students_Save.Cells[0, 0] := 'Г”Г*ìèëèÿ';
 Students_Save.Cells[1, 0] := 'Èìÿ';
 Students_Save.Cells[2, 0] := 'ÃðóïïГ*';
 Students_Save.Cells[3, 0] := 'ÎöåГ*ГЄГ*';
 
 Students_All.Cells[0, 0] := 'Г”Г*ìèëèÿ';
 Students_All.Cells[1, 0] := 'Èìÿ';
 Students_All.Cells[2, 0] := 'ÃðóïïГ*';
 Students_All.Cells[3, 0] := 'ÎöåГ*ГЄГ*';
 
 Students_Find.Cells[0, 0] := 'Г”Г*ìèëèÿ';
 Students_Find.Cells[1, 0] := 'Èìÿ';
 Students_Find.Cells[2, 0] := 'ÃðóïïГ*';
 Students_Find.Cells[3, 0] := 'ÎöåГ*ГЄГ*';
end;
 
procedure TForm1.SaveCountChange(Sender: TObject);
begin
 Students_Save.RowCount := SaveCount.Value + 1;
end;
 
procedure TForm1.InButtonClick(Sender: TObject);
var student : TStudents;
    f : File;
    i : integer;
begin
 AssignFile(f, 'DateStudent.dat');
 Rewrite(f, 1);
 for i := 1 to Students_Save.RowCount - 1 do
  Begin
   student.LastName := Students_Save.Cells[0, i];
   student.FirstName := Students_Save.Cells[1, i];
   student.Group := Students_Save.Cells[2, i];
   student.Mark := StrToInt(Students_Save.Cells[3, i]);
 
   BlockWrite(f, student.LastName, SizeOf(student.LastName));
   BlockWrite(f, student.FirstName, SizeOf(student.FirstName));
   BlockWrite(f, student.Group, SizeOf(student.Group));
   BlockWrite(f, student.Mark, SizeOf(student.Mark));
  End;
 CloseFile(f);
end;
 
procedure TForm1.OutButtonClick(Sender: TObject);
var students : array[1..20] of TStudents;
    f : File;
    i, count, min_index : integer;
    mrk : integer;
begin
 AssignFile(f, 'DateStudent.dat');
 Reset(f, 1);
 count := 0;
 while not Eof(f) do
  Begin
   inc(count);
   BlockRead(f, students[count].LastName,
                 SizeOf(students[count].LastName));
   BlockRead(f, students[count].FirstName,
                 SizeOf(students[count].FirstName));
   BlockRead(f, students[count].Group,
                 SizeOf(students[count].Group));
   BlockRead(f, students[count].Mark,
                 SizeOf(students[count].Mark));
  End;
 CloseFile(f);
 Students_All.RowCount := count + 1;
 for i := 1 to count do
  Begin
   Students_All.Cells[0, i] := students[i].LastName;
   Students_All.Cells[1, i] := students[i].FirstName;
   Students_All.Cells[2, i] := students[i].Group;
   Students_All.Cells[3, i] := IntToStr(students[i].Mark);
  End;
 min_index := 0;
 for i := 1 to count do
  if (students[i].Group = Group.Text) and
      (students[i].Mark = Mrk.Value) then
       Begin
        Students_Find.Cells[0, i] := students[i].LastName;
        Students_Find.Cells[1, i] := students[i].FirstName;
        Students_Find.Cells[2, i] := students[i].Group;
        Students_Find.Cells[3, i] := IntToStr(students[i].Mark);
       End;
end;
 
end.
0
Puporev
Модератор
53020 / 40831 / 14075
Регистрация: 18.05.2008
Сообщений: 94,978
30.10.2014, 08:13 #4
Цитата Сообщение от Mr_Bula Посмотреть сообщение
Ничего понять не могу, делал по учебнику, и не работает всё равно.
А не нужно списывать то в чем ничего не понимаете.
Я точно в этом разбираться не собираюсь.
0
Mr_Bula
0 / 0 / 0
Регистрация: 29.04.2013
Сообщений: 98
30.10.2014, 08:34  [ТС] #5
спасибо блин, помог, если не хочешь или не можешь помочь то на кой ляд вообще отвечать
0
Puporev
Модератор
53020 / 40831 / 14075
Регистрация: 18.05.2008
Сообщений: 94,978
30.10.2014, 08:44 #6
Ты спросил
Цитата Сообщение от Mr_Bula Посмотреть сообщение
Представления не имею что из себя представляет двоичный файл
Я ответил что это как вариант типизированный файл.
Ты нашел пример с файлом без типа, если это больше нравится, разбирайся.
0
D1973
Модератор
2725 / 1942 / 759
Регистрация: 21.01.2014
Сообщений: 7,673
Записей в блоге: 3
Завершенные тесты: 1
30.10.2014, 08:59 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот так как-то...
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
type
 TTables = record
   Family : string[30];
   Name   : string[30];
   Group  : string[10];
   Ball   : integer;
 end;
 
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid; //goEditing := true
    Button1: TButton;
    Panel1: TPanel;  //При старте Visible := false
    StringGrid2: TStringGrid;
    Button2: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Edit2: TEdit;
    UpDown1: TUpDown;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private { Private declarations }
  public { Public declarations }
  end;
 
var
  Form1 : TForm1;
  f     : file of TTables;
  tab   : TTables;
  fName : string;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
 AssignFile(f, fName);
 Rewrite(f);
 with StringGrid1 do
  for i := FixedRows to RowCount - 1 do
   begin
    tab.Family := Cells[0, i];
    tab.Name := Cells[1, i];
    tab.Group := Cells[2, i];
    tab.Ball := StrToIntDef(Cells[3, i], 0);
    Write(f, tab);
   end;
 CloseFile(f);
 Form1.Height := 496;
 Panel1.Visible := true;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var i, j , k : integer;
begin
 i := 1;
 with StringGrid2 do
  begin
   for j := 0 to ColCount - 1 do
    for k := 1 to RowCount - 1 do
     Cells[j, k] := '';
   RowCount := 2;
  end;
 reset(f);
 while not eof(f) do
  begin
    read(f,tab);
    if (Length(Edit1.Text) = 0) or (UpDown1.Position = 0)
     then begin
           ShowMessage('Не указаны параметры отбора');
           break;
          end;
    if(tab.Group <> Edit1.Text) or (tab.Ball <> UpDown1.Position) then continue
    else begin
          with StringGrid2 do
           begin
            Cells[0, i] := tab.Family;
            Cells[1, i] := tab.Name;
            Cells[2, i] := tab.Group;
            Cells[3, i] := IntToStr(tab.Ball);
            RowCount := RowCount + 1;
           end;
         end;
    inc(i);
  end;
 CloseFile(f);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
 with StringGrid1 do
  begin
   Cells[0, 0] := 'Фамилия';
   Cells[1, 0] := 'Имя';
   Cells[2, 0] := 'Группа';
   Cells[3, 0] := 'Оценка';
  end;
 with StringGrid2 do
  begin
   Cells[0, 0] := 'Фамилия';
   Cells[1, 0] := 'Имя';
   Cells[2, 0] := 'Группа';
   Cells[3, 0] := 'Оценка';
  end;
 fName := ExtractFilePath(Application.ExeName) + 'table.dat';
 Form1.Height := 240;
end;
А вообще-то для таких задач рациональнее использовать базы данных, т.к. файл БД - тоже бинарный файл и формально под условие задачи подходит
0
Миниатюры
Сохранение таблицы в двоичный файл  
D1973
Модератор
2725 / 1942 / 759
Регистрация: 21.01.2014
Сообщений: 7,673
Записей в блоге: 3
Завершенные тесты: 1
30.10.2014, 09:08 #8
Цитата Сообщение от Mr_Bula Посмотреть сообщение
ругается на строку: (students[i].Mark = Mrk.Value) then
В твоем примере Mrk - переменная типа integer, а не какой-то объект, чтобы у него было свойство Value. Скорее всего в твоем учебнике под Mrk подразумевается какой-то контрол на форме, читай внимательней.
0
Puporev
Модератор
53020 / 40831 / 14075
Регистрация: 18.05.2008
Сообщений: 94,978
30.10.2014, 09:29 #9
Вот для примера.
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
implementation
 
{$R *.dfm}
//Г§Г*Г¤Г*äèì Г*åêîòîðûå ГЇГ*Г°Г*ìåòðû ГІГ*áëèö
procedure TForm1.FormCreate(Sender: TObject);
begin
with StringGrid1 do
 begin
  fixedcols:=0;
  fixedrows:=1;
  colcount:=4;
  defaultcolwidth:=80;
  options:=options+[goEditing];
  cells[0,0]:='Г”Г*ìèëèÿ';
  cells[1,0]:='Èìÿ';
  cells[2,0]:='ÃðóïïГ*';
  cells[3,0]:='ÎöåГ*ГЄГ*';
 end;
with StringGrid2 do
 begin
  fixedcols:=0;
  fixedrows:=1;
  colcount:=4;
  rowcount:=2;
  defaultcolwidth:=80;
  cells[0,0]:='Г”Г*ìèëèÿ';
  cells[1,0]:='Èìÿ';
  cells[2,0]:='ÃðóïïГ*';
  cells[3,0]:='ÎöåГ*ГЄГ*';
 end;
end;
//ГІГЁГЇ Г§Г*ГЇГЁГ±ГҐГ©
type stud=record
          familia:string[20];
          imya:string[20];
          gruppa:string[20];
          ocenka:byte;
          end;
var f:file; //ïåðåìåГ*Г*Г*Гї ГґГ*éëГ* ГЎГҐГ§ ГІГЁГЇГ*
//Г§Г*Г¤Г*äèì ñòðîêè Гў ГІГ*áëèöå 1
procedure TForm1.Edit1Change(Sender: TObject);
begin
StringGrid1.RowCount:=strtoint(Edit1.Text)+1;
end;
//Г§Г*ГЇГЁГёГҐГ¬ Г§Г*ГЇГЁГ±ГЁ ГЁГ§ ГІГ*áëèöû 1 Гў ГґГ*éë
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    z:stud;
begin
assignfile(f,'DateStudent.dat');
rewrite(f,1);
for i:=1 to StringGrid1.RowCount-1 do
 begin
  z.familia:=StringGrid1.Cells[0,i];
  z.imya:=StringGrid1.Cells[1,i];
  z.gruppa:=StringGrid1.Cells[2,i];
  z.ocenka:=strtoint(StringGrid1.Cells[3,i]);
  blockwrite(f,z,sizeof(z));
 end;
closefile(f);
end;
//Г§Г*Г¤Г*ëèì ãðóïïó, îöåГ*ГЄГі ГЁ áóäåì ГЁГ±ГЄГ*ГІГј Гў ГґГ*éëå
procedure TForm1.Button2Click(Sender: TObject);
var gr:string[20];
    oc,k:byte;
    z:stud;
begin
gr:=Edit2.Text;
oc:=strtoint(Edit3.Text);
assignfile(f,'DateStudent.dat');
reset(f,1);
k:=0;
while not eof(f) do
 begin
  BlockRead(f,z,sizeof(z));
  if (z.gruppa=gr)and(z.ocenka=oc) then
   begin
    k:=k+1;
    StringGrid2.Cells[0,k]:=z.familia;
    StringGrid2.Cells[1,k]:=z.imya;
    StringGrid2.Cells[2,k]:=z.gruppa;
    StringGrid2.Cells[3,k]:=inttostr(z.ocenka);
    StringGrid2.RowCount:=StringGrid2.RowCount+1;
   end;
 end;
closefile(f);
if k=0 then ShowMessage('ÑòóäåГ*ГІГ* Г± ГІГ*êîé ãðóïïîé ГЁ îöåГ*êîé Г*ГҐГІ');
StringGrid2.RowCount:=StringGrid2.RowCount-1;
end;
0
Вложения
Тип файла: rar Запись в файл без типа.rar (197.3 Кб, 6 просмотров)
Mr_Bula
0 / 0 / 0
Регистрация: 29.04.2013
Сообщений: 98
30.10.2014, 10:58  [ТС] #10
D1973, подскажите, а где в вашем коде участок отвечающий за то чтобы строки в StringGrid2 выводились по порядку, а то у меня они записываются во вторую таблицу с такими же индексами с какими были в первой, то есть если условию соответствует 3 строка от программа записывает её в 3 строку второй таблицы.
0
D1973
Модератор
2725 / 1942 / 759
Регистрация: 21.01.2014
Сообщений: 7,673
Записей в блоге: 3
Завершенные тесты: 1
30.10.2014, 11:05 #11
Строка 60 кода. Переменная i := 1;
Этот самый i - номер строки в которую будут записаны данные.
В цикле считываем из файла структуру, если она удовлетворяет условию, записываем ее в i-тую строку (Cells[0, i] := tab.Family; пишем в первый столбец строки с номером i, не забывая, что номера строк и столбцов с StringGrid начинаются с 0), а перед следующим считыванием увеличиваем i на 1. (строка 88: inc(i))
0
Puporev
Модератор
53020 / 40831 / 14075
Регистрация: 18.05.2008
Сообщений: 94,978
30.10.2014, 11:07 #12
Цитата Сообщение от D1973 Посмотреть сообщение
не забывая, что номера строк и столбцов с StringGrid начинаются с 0),
Если есть фиксированная строка-заголовок то значения вводим с 1.
0
D1973
Модератор
2725 / 1942 / 759
Регистрация: 21.01.2014
Сообщений: 7,673
Записей в блоге: 3
Завершенные тесты: 1
30.10.2014, 11:11 #13
Цитата Сообщение от Puporev Посмотреть сообщение
Если есть фиксированная строка-заголовок то значения вводим с 1.
Их может быть и 2 и 3... Тогда уж вводим значения с StringGrid.FixedRow.
Тогда, действительно, правильней в моем примере изменить строку 60 на:
Delphi
1
i := StringGrid2.FixedRow;
0
Mr_Bula
0 / 0 / 0
Регистрация: 29.04.2013
Сообщений: 98
30.10.2014, 11:34  [ТС] #14
Просто я к чему пишу, исправил себе программу по вашему коду и он вот так странно выводит строки. Индексы все указал правильно, но он все равно не хочет выводить строки одну за другой.
0
D1973
Модератор
2725 / 1942 / 759
Регистрация: 21.01.2014
Сообщений: 7,673
Записей в блоге: 3
Завершенные тесты: 1
30.10.2014, 12:01 #15
Код покажи
0
30.10.2014, 12:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2014, 12:01
Привет! Вот еще темы с ответами:

Сохранение данных из таблицы StrinGrid в уже созданный Excel - Delphi
Здравствуйте дорогие программисты. Помогите пожалуйста, столкнулся вот с такой проблемой. Есть код для сохранения из таблицы StringGrid в...

Сохранение содержимого StringGrid-а в виде таблицы в текстовом документе - Delphi
Есть заполненая таблица Stringgrid размером Nx2 (n&gt;3) как сохранить в текстовом документе все эти элементы в виде той же самой условной...

Сохранение в файл - Delphi
Можно ли добавлять строку в текстовый документ без мемо? И именно ДОБАВЛЯТЬ, в текстовом файле есть уже информация и просто ниже добавить...

Сохранение в файл - Delphi
Всем здравствуйте. Такая проблема в этом коде не работает сохранение: procedure TMainForm.FileSaveClick(Sender: TObject); var ...


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

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

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