Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 25.09.2016
Сообщений: 32
1

Запись record в массив из edit

20.02.2017, 17:52. Показов 3680. Ответов 45
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет, мне нужна помощь. Вообще есть задача: список людей стоящих в очереди на получение квартиры. В списке указаны порядковый номер, фамилия, имя, отчество и год занятия очереди. По указанному количеству квартир выдаваемых в год, упорядочить список и указать в каком порядке и в каком году люди получат квартиры.
Но до этого далеко.

Есть код: реализован интерфейс, сохранение и загрузка текстового файла и бла-бла-бла.

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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Menus;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    RichEdit1: TRichEdit;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Label6: TLabel;
    Edit5: TEdit;
    Button1: TButton;
    UpDown1: TUpDown;
    Edit6: TEdit;
    UpDown2: TUpDown;
    Label7: TLabel;
    Edit7: TEdit;
    Button2: TButton;
    RichEdit2: TRichEdit;
    procedure N4Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
type                              <<ВОТ ЭТИ СТРОКИ НЕПРАВИЛЬНЫ?
  zapis=record                 <<ВОТ ЭТИ СТРОКИ НЕПРАВИЛЬНЫ?
  fname: string[20];         <<ВОТ ЭТИ СТРОКИ НЕПРАВИЛЬНЫ?
  sname: string[20];         <<ВОТ ЭТИ СТРОКИ НЕПРАВИЛЬНЫ?
  tname: string[20];         <<ВОТ ЭТИ СТРОКИ НЕПРАВИЛЬНЫ?
end;
 
var
  fio: array [1..20] of zapis;   <<ВОТ ЭТИ СТРОКИ НЕПРАВИЛЬНЫ?
  Form1: TForm1;
  x:integer;
 
implementation
 
{$R *.dfm}
 
 
 
 
 
procedure TForm1.N4Click(Sender: TObject);
begin
Close
end;
 
procedure TForm1.N2Click(Sender: TObject);
begin
 
Form1.OpenDialog1.Filter := 'Текстовые файлы(*.txt)|*.txt| Форматированный текст (*.rtf)|*.rtf';
Form1.OpenDialog1.Execute();
Form1.RichEdit1.Lines.LoadFromFile(Form1.OpenDialog1.FileName);
end;
 
procedure TForm1.N3Click(Sender: TObject);
begin
Form1.SaveDialog1.Execute();
RichEdit1.Lines.SaveToFile(SaveDialog1.FileName+'.rtf');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
fio[i].fname:=Edit1.Text;                         <<ВОТ ЭТИ СТРОКИ НЕПРАВИЛЬНЫ?
RichEdit1.Lines.add(fio[i].fname);              <<ВОТ ЭТИ СТРОКИ НЕПРАВИЛЬНЫ?
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
RichEdit1.Clear;
end;
 
end.
Все данные записываются в edit. После этого должны заносится в строки RichEdit по нажатию кнопки. Но вот в чём проблема. Выдаёт ошибку ACCESS VIOLATION. Я что-то неправильно задал, или где-то неправильно обратился, в общем где-то ошибка с самим Record или с присвоением значения, или с массивом. Не понимаю. Если делать запись без Record,
использоваться строки
RichEdit1.Lines.add('¹ ' + Edit5.Text + ' ' + Edit1.Text + ' ' + Edit2.Text + ' ' + Edit3.Text + ' ' + Edit4.Text + ' ' + Edit7.Text);
Всё отлично работает. Но в таком случае вторую часть задачи(сортировку) не понимаю как сделать. Пожалуйста, наставьте на путь истинный.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2017, 17:52
Ответы с готовыми решениями:

Как создать record внутри которого есть динамический массив с record-ами?
Упрощу код, чтоб не писать полные record-ы: type TSec = record vSize : DWord; vAddr...

Дан одномерный массив из N элементов, каждый из которых представляет собой запись вида Type ZAP=Record St: string [10];
Дан одномерный массив из N элементов, каждый из которых представляет собой запись вида Type...

Массив из данных типа "запись" (record) содержит сведения о выставленных на продажу автомобилях
кто-нибудь может пожалуйста помочь вот с этой программой в делфи. массив из данных типа &quot;запись&quot;...

Запись в файл из полей Edit и проверка Edit на пустоту
TForm1 *Form1; int Ext=0; int i;...

45
0 / 0 / 0
Регистрация: 25.09.2016
Сообщений: 32
20.02.2017, 17:59  [ТС] 2
Прикрепляю скрин, сверху - как выглядит интерфейс программы. Скину - код ошибки. В самом коде программы пытаюсь хотя-бы одно поле сделать рабочим, в моём случае - fname - имя. После вводе - сразу виснит и выдаёт ту самую ошибку.
Миниатюры
Запись record в массив из edit  
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
20.02.2017, 19:42 3
Цитата Сообщение от Goshanus Посмотреть сообщение
fio[i].fname:=Edit1.Text; <<ВОТ ЭТИ СТРОКИ НЕПРАВИЛЬНЫ?
Как вы думаете какое значение имеет переменная i при выполнении этой строки кода?
0
0 / 0 / 0
Регистрация: 25.09.2016
Сообщений: 32
20.02.2017, 20:12  [ТС] 4
Цитата Сообщение от northener Посмотреть сообщение
Как вы думаете какое значение имеет переменная i при выполнении этой строки кода?
Целочисленное, от 1 до 20, в зависимости от строки, куда записываются данные.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
20.02.2017, 20:21 5
А откуда она возьмется "от 1 до 20, в зависимости от строки", если вы ей ни разу не присваиваете никакого значения?
0
0 / 0 / 0
Регистрация: 25.09.2016
Сообщений: 32
20.02.2017, 21:14  [ТС] 6
Цитата Сообщение от northener Посмотреть сообщение
А откуда она возьмется "от 1 до 20, в зависимости от строки", если вы ей ни разу не присваиваете никакого значения?
И как-же это пофиксить? Я пытался присваивать значение 0 и после вывода i=i+1;
и через цикл 0 to 19 do тоже не работает
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
20.02.2017, 21:30 7
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
...
    procedure FormCreate(Sender: TObject);
  private
    Number : Integer;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Number <= 19 then begin
    fio[Number+1].fname:=Edit1.Text;                  
    RichEdit1.Lines.add(fio[Number+1].fname);              
    Number:=Number+1;
  end;
end;
0
0 / 0 / 0
Регистрация: 25.09.2016
Сообщений: 32
20.02.2017, 22:24  [ТС] 8
Спасибо, заработала идеально! А нет идей как реализовать такую сортировку, как в условии? Например, в списке 5 человек, все встали в очередь в 2016 году. А за год раздают 3 квартиры. Надо вывести у первых трёх 2016. А у оставшихся двух 2016+1
0
0 / 0 / 0
Регистрация: 25.09.2016
Сообщений: 32
22.02.2017, 11:45  [ТС] 9
Господа, пожалуйста, хотя-бы идею подскажите, алгоритм, как реализовать такую сортировку, пожалуйста!
0
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,375
22.02.2017, 19:07 10
2016+1 это в смысле 2017?
2016+1 - строка
2017 - число
Надо иметь ввиду, что результат сортировки строк несколько отличаются от сортировки чисел.
0
0 / 0 / 0
Регистрация: 25.09.2016
Сообщений: 32
22.02.2017, 20:04  [ТС] 11
Цитата Сообщение от Пытливый Посмотреть сообщение
2016+1 это в смысле 2017?
2016+1 - строка
2017 - число
Надо иметь ввиду, что результат сортировки строк несколько отличаются от сортировки чисел.
Мне надо сортировать числа, которые записаны в строки. В конце каждой записи, в строке пишется год от их и надо сравнивать.
0
30 / 24 / 22
Регистрация: 12.11.2011
Сообщений: 181
22.02.2017, 21:30 12
Если уж делать по-нормальному, то тогда надо zapis-и надо хранить не в массиве, а с помощью TList-a. В таком случае вся сортировка будет сводится к вызову функции Sort с разными параметрами
Делать это так:
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
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, mysql56conn, FileUtil, Forms, Controls, Graphics, Dialogs,
  StdCtrls, fgl;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    procedure   PrintList();
  public
    { public declarations }
  end;
 
  type
    TMyREcord=record        //Наша запись
      S:String;
      I:Integer;
    end;
    PMyRecord=^TMyREcord;  //Ссылка на нашу запись
 
    TMyRecList= specialize TFPGList<PMyRecord>; //Список из ссылок на наши записи
 
 
var
  Form1: TForm1;
  MyRecordList:TMyRecList;
 
  function SortI(const Item1, Item2: PMyRecord): Integer;  //Сортировка по I
  function SortS(const Item1, Item2: PMyRecord): Integer;  //Сортировка по S
 
implementation
 
function SortI(const Item1, Item2: PMyRecord): Integer;
begin
  if Item1^.I=Item2^.I then Result:=0
     else if Item1^.I>Item2^.I then Result:=1
          else Result:=-1;
end;
 
function SortS(const Item1, Item2: PMyRecord): Integer;
begin
  if Item1^.S=Item2^.S then Result:=0
     else if Item1^.S>Item2^.S then Result:=1
          else Result:=-1;
end;
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var Zapis:PMyRecord;
begin
  New(Zapis);
  Zapis^.I:=0;
  Zapis^.S:='b';
  MyRecordList.Add(Zapis);    //Добавить запись в список
 
  New(Zapis);
  Zapis^.I:=1;
  Zapis^.S:='a';
  MyRecordList.Add(Zapis);
 
  MyRecordList.Sort(@SortS);
  PrintList();
  MyRecordList.Sort(@SortI);
  PrintList();
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  MyRecordList:=TMyRecList.Create;
end;
 
procedure TForm1.PrintList;
var I:Integer;
begin
  Memo1.Lines.Add('');
  for i:=0 to MyRecordList.Count-1 do
  begin
       Memo1.Lines.Add(MyRecordList.Items[i]^.S);
  end;
end;
 
end.
0
0 / 0 / 0
Регистрация: 25.09.2016
Сообщений: 32
23.02.2017, 00:36  [ТС] 13
Цитата Сообщение от Gluhow Посмотреть сообщение
Delphi
Что-то не то это, я не совсем понимаю код, да и сама сортировка у меня не совсем обычная должна быть
0
30 / 24 / 22
Регистрация: 12.11.2011
Сообщений: 181
23.02.2017, 06:48 14
Я так понимаю что сортировку надо сделать тупо по номеру в очереди. А потом выводить по формуле год:=начальный_год+(номер_в_очереди div колво_квартир_в_год). Тогда сортировка выходит самая обычная по числу.
0
0 / 0 / 0
Регистрация: 25.09.2016
Сообщений: 32
23.02.2017, 16:34  [ТС] 15
Цитата Сообщение от Gluhow Посмотреть сообщение
Я так понимаю что сортировку надо сделать тупо по номеру в очереди. А потом выводить по формуле год:=начальный_год+(номер_в_очереди div колво_квартир_в_год). Тогда сортировка выходит самая обычная по числу.
Сначала должно сравнивать количество заявок на год с количеством квартир выдаваемых в год. Если заявок больше, то выбираются первые по порядковому номеру очереди, остальные переносят в следующий год, опять сравнение. И вывод ожидаемого года получения
0
30 / 24 / 22
Регистрация: 12.11.2011
Сообщений: 181
23.02.2017, 18:59 16
Цитата Сообщение от Goshanus Посмотреть сообщение
Сначала должно сравнивать количество заявок на год с количеством квартир выдаваемых в год. Если заявок больше, то выбираются первые по порядковому номеру очереди, остальные переносят в следующий год, опять сравнение. И вывод ожидаемого года получения
Сложно думаете, но я таки не вижу противоречия с моей формулой
0
0 / 0 / 0
Регистрация: 25.09.2016
Сообщений: 32
24.02.2017, 00:16  [ТС] 17
Цитата Сообщение от Gluhow Посмотреть сообщение
Сложно думаете, но я таки не вижу противоречия с моей формулой
Почему сложно думаю? С какой формулой? Код выше - я не очень понимаю
0
30 / 24 / 22
Регистрация: 12.11.2011
Сообщений: 181
24.02.2017, 08:34 18
Прочти внимательно Запись record в массив из edit
Мухи отдельно, котлеты отдельно! Сначала сортировка (если она вообще нужна) по номеру в очереди , а потом вывод года по указанной формуле
0
0 / 0 / 0
Регистрация: 25.09.2016
Сообщений: 32
24.02.2017, 14:29  [ТС] 19
Цитата Сообщение от Gluhow Посмотреть сообщение
Прочти внимательно Запись record в массив из edit
Мухи отдельно, котлеты отдельно! Сначала сортировка (если она вообще нужна) по номеру в очереди , а потом вывод года по указанной формуле
Грубо говоря, они занесены в список уже отсортированными по порядковому номеру по возрастанию. А вот год записи может отличаться.
0
30 / 24 / 22
Регистрация: 12.11.2011
Сообщений: 181
24.02.2017, 19:37 20
В таком случае сортировка вообще не нужна. Нужно просто вывести. Например так
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
procedure TForm1.PrintZapYear(MaxCount:Word);
 
var ZapIndex:Integer;
  BegYear:Word;  //Показывать не раньше этого года
  ResYear:Word;
  NInYear:Word;  //Текущий номер выданный в этом году
begin
  BegYear:=fio[1].Year;
  NInYear:=0;
 
  for ZapIndex:=1 to High(fio) do
  begin
    ResYear:=BegYear+(NInYear div MaxCount);
    if ResYear<fio[ZapIndex].Year then
    begin
      BegYear:=fio[ZapIndex].Year;
      NInYear:=0;
      ResYear:=BegYear;
    end;
    Inc(NInYear);
    StringGrid1.Cells[2, ZapIndex]:=(IntToStr(ResYear));
  end;
 
end;
0
24.02.2017, 19:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2017, 19:37
Помогаю со студенческими работами здесь

Запись Record?
можно ли сделать так type q = record fx:byte; gl:string; ...

Запись record в dat файл
Записывать записывает, не знаю на сколько верно, а вот прочесть не может. Описание ClientBase ...

Запись в файл Record с TStringList
Подскажите, пожалуйста, как сохранить TStringList в составе record в файл? Вот эти данные нужно...

Записать в файл запись типа record
Записать в файл запись типа record, как это произвести в интернете не нашел объяснений нормальных,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru