Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Farrewa
28 / 28 / 22
Регистрация: 27.12.2013
Сообщений: 368
#1

Создать массив классов - Delphi

29.05.2015, 15:04. Просмотров 1927. Ответов 23
Метки нет (Все метки)

Вообщем как создать класс я прекрасно знаю, но вот такая у меня задача:
У меня есть массив ( динамический, но это не суть...): mass[i]
каждый элемент массива должен иметь несколько свойств/параметров и тп.
То есть что-то вроде:
Delphi
1
2
3
4
5
6
Mass[1].color := clRed;
Mass[1].name := 'element';
Mass[1].size := 31,5;
Mass[1].param := value;
Mass[1].svoystvo:= znacheniye;
.....
Нужно ведь создавать класс для массива? или.... вообщем подскажите пожалуйста.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2015, 15:04
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Создать массив классов (Delphi):

не могу создать массив классов .
unit Unit1; interface uses Windows, Messages, SysUtils, Variants,...

Создать иерархию классов
Создать иерархию классов, представляющих собой объекты животного мира.

Создать иерархию графических классов в соответствии с рисунком
Создать иерархию графических классов в соответствии с рисунком. Описания...

Создать иерархию классов представляющих простое наследование
Создать иерархию классов представляющих простое наследование. Базовый класс –...

Массив классов, ошибка EAccessViolation
Суть такова. Есть класс, описывающий учебные дисциплины. type TSubject =...

Студенческая библиотека. Создать иерархию классов чтобы использовалась инкапсуляция подражания полиморфизм
Тема:Студенческая библиотека Информационный объект пользователь библиотеки ...

23
Immo
180 / 180 / 90
Регистрация: 02.10.2012
Сообщений: 808
29.05.2015, 15:23 #2
создаешь класс в нем пишешь свои проперти,которые определяет управляемый доступ к полям класса
0
Farrewa
28 / 28 / 22
Регистрация: 27.12.2013
Сообщений: 368
29.05.2015, 15:29  [ТС] #3
то есть так?:
Delphi
1
2
3
4
5
6
7
8
9
10
type
  people = class(TObject)
    sex: Integer;  // 0 - М   1 - Ж
    name: string;  // имя
  end;
var
  Form1: TForm1;
  mass: array of people;
 
..................
0
Immo
180 / 180 / 90
Регистрация: 02.10.2012
Сообщений: 808
29.05.2015, 15:32 #4
Почитай тут с примерами
1
Verevkin
584 / 316 / 91
Регистрация: 12.03.2015
Сообщений: 2,448
29.05.2015, 16:43 #5
Цитата Сообщение от Farrewa Посмотреть сообщение
У меня есть массив ( динамический, но это не суть...): mass[i]
каждый элемент массива должен иметь несколько свойств/параметров и тп.
Динамический массив - нафиг! список рулит.
1
krapotkin
3297 / 2937 / 1015
Регистрация: 14.04.2014
Сообщений: 14,263
Записей в блоге: 13
30.05.2015, 12:38 #6
я бы тоже порекомендовал воспользоваться списками
+
1. People - это люди, а класс рассчитан на одного
2. Названия типов стоит начинать с T
поэтому

type
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
  TPerson = class(TObject)
    sex: Integer;  // 0 - М   1 - Ж
    name: string;  // имя
  end;
 
TForm1=class(TForm)
...
  procedure FormCreate(Sender:TObject);
  procedure FormDestroy(Sender:TObject);
...
  FPeople: TObjectList;
end;
 
 
var
  Form1: TForm1;
 
 
procedure TForm1.FormCreate(Sender:TObject);
begin
  FPeople:=TObject.Create(True);
end;
 
procedure TForm1.FormDestroy(Sender:TObject);
begin
  FPeople.free;
end;
1
Farrewa
28 / 28 / 22
Регистрация: 27.12.2013
Сообщений: 368
30.05.2015, 14:58  [ТС] #7
Цитата Сообщение от krapotkin Посмотреть сообщение
я бы тоже порекомендовал воспользоваться списками
+
1. People - это люди, а класс рассчитан на одного
2. Названия типов стоит начинать с T
поэтому
Хм, правда, так с виду удобнее и проще, а, извиняюсь за глупый вопрос, как задавать значения параметров в этом списке?

я по примеру не понял, как вообще связаны FPeople и TPerson

Добавлено через 2 минуты
я имею ввиду как будет выглядеть
Delphi
1
2
3
4
5
Mass[1].color := clRed;
Mass[1].name := 'element';
Mass[1].size := 31,5;
Mass[1].param := value;
Mass[1].svoystvo:= znacheniye;
но уже со списком как все будет устроено?

Добавлено через 2 минуты
Вот есть у меня
Delphi
1
2
3
4
TPerson = class(TObject)
    sex: Integer;  // 0 - М   1 - Ж
    name: string;  // имя
  end
И есть у меня список, вот как мне к примеру пятому элементу задать значение sex 1
0
Verevkin
584 / 316 / 91
Регистрация: 12.03.2015
Сообщений: 2,448
30.05.2015, 16:48 #8
Цитата Сообщение от Farrewa Посмотреть сообщение
И есть у меня список, вот как мне к примеру пятому элементу задать значение sex 1
самое простое, дилетантское:
Delphi
1
2
3
4
5
6
 
FPeople:= TObjectList.Create(True); // krapotkin, бывает. не ошибается тот, кто ни хрена не делает :)
 
// -----......------
 
TPerson(FPeople[4]).Sex:= 1; // лучше юзать именованные, типа SEX_FEMALE, вместо 1, 2 и т.д.
Но это кривой подход с большой вероятность понарубить косяков.
В принципе, могу тебе подарить пример-другой, где создаются потомки списочных классов с переопределением типов элементов.
0
Farrewa
28 / 28 / 22
Регистрация: 27.12.2013
Сообщений: 368
30.05.2015, 19:32  [ТС] #9
Цитата Сообщение от Verevkin Посмотреть сообщение
могу тебе подарить пример-другой, где создаются потомки списочных классов с переопределением типов элементов
Подари, мне интересно )
0
Verevkin
584 / 316 / 91
Регистрация: 12.03.2015
Сообщений: 2,448
30.05.2015, 21:45 #10
Цитата Сообщение от Farrewa Посмотреть сообщение
Подари, мне интересно )
ну, вот, например.
выдралй из проекта.
ищи в модуле вот этот класс и изучай.
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
  // Класс-список адаптеров
  TAdapterList = class(TObjectList)
  private
    // Поля
    FDLL_LAST_RESULT_DW: DWORD; // для отладки (последний код возврата DLL-функции)
 
    // Поля событий
    FOnLogMessage: TAdapterListDebugEvent;
    FOnAdapterLogMessage: TAdapterDebugEvent;
    FOnAdapterMessageReceive: TAdapterPacketReceiveEvent;
    FOnAdapterError: TAdapterErrorEvent;
 
    // Функции доступа к полям/свойствам
    function GetAdapter(const Index: Integer): TAdapterItem; // доступ по индексу к физ. адаптерам
 
    // Технологические функции
    // procedure UpdateAdapters; // составление списка доступных сетевых адаптеров
  protected
    procedure DoLogMessage(const Message: string);
  public
    // Конструктор и деструктор
    constructor Create; reintroduce;
    destructor Destroy; override;
 
    // Методы
    function UpdateAdapters: Integer; // составление списка доступных сетевых адаптеров
    procedure AssignAdaptersToStrings(ALines: TStrings); // составление списка строк с привязкой к объектам адаптеров
 
    procedure CloseAllAdapters(); // закрытие открытых адаптеров
 
    // Свойства
    property DLL_LAST_RESULT_DW: DWORD read FDLL_LAST_RESULT_DW;
    property Items[const Index: Integer]: TAdapterItem read GetAdapter; default;
 
    // События
    property OnLogMessage: TAdapterListDebugEvent read FOnLogMessage write FOnLogMessage;
    property OnAdapterLogMessage: TAdapterDebugEvent read FOnAdapterLogMessage write FOnAdapterLogMessage;
    property OnAdapterMessageReceive: TAdapterPacketReceiveEvent read FOnAdapterMessageReceive write FOnAdapterMessageReceive;
    property OnAdapterError: TAdapterErrorEvent read FOnAdapterError write FOnAdapterError;
  end;
1
Вложения
Тип файла: 7z e.7z (9.2 Кб, 3 просмотров)
Farrewa
28 / 28 / 22
Регистрация: 27.12.2013
Сообщений: 368
01.06.2015, 14:49  [ТС] #11
Вообще не пойму что вы понаписали!
По вашему рабочая конструкция должна иметь вид:
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
type
  TForm1 = class(TForm)
    mmo1: TMemo;
    btn1: TBitBtn;
    btn2: TBitBtn;
    btn3: TBitBtn;
    edt1: TEdit;
    btn4: TBitBtn;
    procedure btn1Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
 
 
  private
    FPeople: TObjectList;    // ИМЕННО В PRIVATE!
  public
 
  end;
 
type
  TPerson = class(TObject)
    sex: Integer;     // 0 -  Ж /// 1 - м
    name: string;
    year: Integer;
end;
 
var
  Form1: TForm1;
  People: Integer;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.btn4Click(Sender: TObject);
var i : Integer;
begin
  People := StrToInt(edt1.Text);
  FPeople.Count := People;
  //
  for i := 0 to FPeople.Count-1 do
    begin
      Randomize;
      TPerson(FPeople[i]).sex := Random(2);   /// ОШИБКА В ЧТЕНИИ/ЗАПСИ В ПАМЯТЬ
    end;
  //
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
FPeople := TObjectList.Create(true);
end;
0
Arcor
4816 / 1817 / 380
Регистрация: 20.11.2009
Сообщений: 5,792
Записей в блоге: 1
01.06.2015, 15:14 #12
Лучший ответ Сообщение было отмечено Farrewa как решение

Решение

на тебе простенький пример класса и списка из класса

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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Contnrs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 
  TSex = (sxUnknown, sxMale, sxFemale, sxNotDecided);
 
  TPerson = class
    private
      FName: String;
      FSex: TSex;
      FBirthDay: TDateTime;
    public
      constructor Create(AName: String; ABirthDay: TDateTime; ASex: TSex);
 
      property Name: String read FName write FName;
      property BirthDay: TDateTime read FBirthDay write FBirthDay;
      property Sex: TSex read FSex write FSex;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
constructor TPerson.Create(AName: String; ABirthDay: TDateTime; ASex: TSex);
begin
  FName := AName;
  FBirthDay := ABirthDay;
  FSex := ASex;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var List: TObjectList;
    i: Integer;
const StringSex: Array[TSex] of String = ('Неизветен', 'Мужской', 'Женский', 'Еще не определился xDD');
begin
  List := TObjectList.Create;
 
  List.Add(TPerson.Create('Петя', StrToDateTime('10.03.1990'), sxMale));
  List.Add(TPerson.Create('Маша', StrToDateTime('01.01.1995'), sxFemale));
  List.Add(TPerson.Create('qwertzui', StrToDateTime('25.7.1857'), sxNotDecided));
 
  for i := 0 to List.Count - 1 do
    begin
      Memo1.Lines.Add(TPerson(List[i]).Name + '; ' + DateToStr(TPerson(List[i]).BirthDay) + '; ' + StringSex[TPerson(List[i]).Sex] );
    end;
end;
 
end.
1
krapotkin
3297 / 2937 / 1015
Регистрация: 14.04.2014
Сообщений: 14,263
Записей в блоге: 13
02.06.2015, 07:20 #13
а где List.free ?
0
Arcor
02.06.2015, 09:34
  #14

Не по теме:

Цитата Сообщение от krapotkin Посмотреть сообщение
а где List.free ?
так жалко стало список, что проделанную работу удалять не хотелось

0
krapotkin
3297 / 2937 / 1015
Регистрация: 14.04.2014
Сообщений: 14,263
Записей в блоге: 13
02.06.2015, 09:49 #15
)))
0
Farrewa
28 / 28 / 22
Регистрация: 27.12.2013
Сообщений: 368
02.06.2015, 18:07  [ТС] #16
Цитата Сообщение от krapotkin Посмотреть сообщение
а где List.free ?
а разница, блин, какая?!
FPeople.free; в FormClose

Добавлено через 8 минут
Цитата Сообщение от Arcor Посмотреть сообщение
на тебе простенький пример класса и списка из класса
Мне нужна строгая нумерация элементов!!!
Список может состоять из 10 элементов, а запись будет только в 1, 5 и 10!;
List.Add не подходит, желательно заранее определить размер списка и уже с ним потом работать через for. У меня может запись будет через элемент или через 2 и тп!

Нужен список классов... иными словами
Нужен список элементов, у элементов по несколько параметров... и не к чему эти
Delphi
1
onst StringSex: Array[TSex] of String = ('Неизветен', 'Мужской', 'Женский', 'Еще не определился xDD');
Они мне воовсе не нужны, мне нужны 0 и 1 как в моем коде выше. Мне это нужно для дальнейших расчетов!!!
0
krapotkin
3297 / 2937 / 1015
Регистрация: 14.04.2014
Сообщений: 14,263
Записей в блоге: 13
02.06.2015, 20:43 #17
можно упорядочить набор слов, и все вокруг поймут, что нужно
0
Arcor
4816 / 1817 / 380
Регистрация: 20.11.2009
Сообщений: 5,792
Записей в блоге: 1
02.06.2015, 21:41 #18
Цитата Сообщение от Farrewa Посмотреть сообщение
Мне нужна строгая нумерация элементов!!!
Список может состоять из 10 элементов, а запись будет только в 1, 5 и 10!;
List.Add не подходит, желательно заранее определить размер списка и уже с ним потом работать через for. У меня может запись будет через элемент или через 2 и тп!
Нужен список классов... иными словами
Нужен список элементов, у элементов по несколько параметров... и не к чему эти
Код Delphi
1
onst StringSex: Array[TSex] of String = ('Неизветен', 'Мужской', 'Женский', 'Еще не определился xDD');
Они мне воовсе не нужны, мне нужны 0 и 1 как в моем коде выше. Мне это нужно для дальнейших расчетов!!!
пиши свое раз не нравится чужое, в чем проблемы?)))

Добавлено через 2 минуты
Цитата Сообщение от Farrewa Посмотреть сообщение
Список может состоять из 10 элементов, а запись будет только в 1, 5 и 10!;
List.Add не подходит, желательно заранее определить размер списка и уже с ним потом работать через for. У меня может запись будет через элемент или через 2 и тп!
не понятно логики.. видать ты сам не знаешь, что ты вообще хочешь и не понимаешь .. а про заранее определить длину списка - бред, память на ветер выкидывать?
0
krapotkin
3297 / 2937 / 1015
Регистрация: 14.04.2014
Сообщений: 14,263
Записей в блоге: 13
02.06.2015, 21:52 #19
в листе самая строгая упорядоченность элементов ))
0,1,2,3 ...

с листом чаще всего работают в цикле for
for i:=0 to List.Count-1 do ...

размер списка определяется не списком, а тем, кто его наполняет

вообще нет ни единого объяснения из приведенных тобой, которые бы не допускали List ...
0
Farrewa
28 / 28 / 22
Регистрация: 27.12.2013
Сообщений: 368
03.06.2015, 13:15  [ТС] #20
Цитата Сообщение от krapotkin Посмотреть сообщение
в листе самая строгая упорядоченность элементов
да, вот только листу надо сначало размер задать наверное? setlenght(list,10); - шлёт меня лесом;
---
Я просто повторюсь: мне нужно, к примеру, задать листу размер на 5 элементов и только потом с ним работать, занося в нужный элемент списка информацию. Информация эта является классом.
0
03.06.2015, 13:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2015, 13:15
Привет! Вот еще темы с решениями:

Создать проект, реализующий связь двух классов Животные и Собаки, а также придать им новый метод ГОЛОС (Делфи 7)
добрый вечер, уважаемые программисты. помогите,пожалуйста, написать программу....

По данным о 30 учениках разных классов: определить фамилию учеников девятых классов, имеющих пятерки
помогите пожалуйста решить мне задачу по Delphi, только не через консольное...

Массив: Создать новый массив, элементами которого являются все отрицательные элементы массива C
1)Дан массив C(n). Создать новый массив, элементами которого являются все...

Создать двумерный динамический массив произвольного размера NxN (размер ввести). Заполнить массив случайным об
Создать двумерный динамический массив произвольного размера NxN (размер...


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

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

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