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

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

29.05.2015, 15:04. Просмотров 2099. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

23
Immo
186 / 185 / 92
Регистрация: 02.10.2012
Сообщений: 826
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
186 / 185 / 92
Регистрация: 02.10.2012
Сообщений: 826
29.05.2015, 15:32 4
Почитай тут с примерами
1
Verevkin
951 / 483 / 124
Регистрация: 12.03.2015
Сообщений: 3,410
29.05.2015, 16:43 5
Цитата Сообщение от Farrewa Посмотреть сообщение
У меня есть массив ( динамический, но это не суть...): mass[i]
каждый элемент массива должен иметь несколько свойств/параметров и тп.
Динамический массив - нафиг! список рулит.
1
krapotkin
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,674
Записей в блоге: 15
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
951 / 483 / 124
Регистрация: 12.03.2015
Сообщений: 3,410
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
951 / 483 / 124
Регистрация: 12.03.2015
Сообщений: 3,410
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 Кб, 4 просмотров)
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
4899 / 1846 / 387
Регистрация: 20.11.2009
Сообщений: 5,970
Записей в блоге: 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
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,674
Записей в блоге: 15
02.06.2015, 07:20 13
а где List.free ?
0
Arcor
02.06.2015, 09:34
  #14

Не по теме:

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

0
krapotkin
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,674
Записей в блоге: 15
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
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,674
Записей в блоге: 15
02.06.2015, 20:43 17
можно упорядочить набор слов, и все вокруг поймут, что нужно
0
Arcor
4899 / 1846 / 387
Регистрация: 20.11.2009
Сообщений: 5,970
Записей в блоге: 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
3418 / 3025 / 1047
Регистрация: 14.04.2014
Сообщений: 14,674
Записей в блоге: 15
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, только не через консольное...


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

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

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