Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.09.2012, 09:36
kemerovo_man kemerovo_man вне форума
Прохожий
 
Регистрация: 06.09.2012
Сообщения: 8
Репутация: 10
По умолчанию Общие операции с массивами разных типов

Здравствуйте, уважаемые форумчане.
Опишу задачу:
есть несколько массивов разных типов, например, массив строк и массив целых чисел

Код:
var 
 integerArray: array of integer;
 stringArray: array of string;

есть общие функции для работы с ними: задать размер массива, добавить новый элемент в массив, удалить элемент массива, отобразить все элементы массива и т.д.

сейчас я это делаю очень тупо:

Код:
procedure setLengthArray(arrayName:string, len:integer);
begin
 if arrayName='integerArray' then setlength(integerArray,len);
 if arrayName='stringArray' then setlength(stringArray,len);
end;

procedure deleteFirst(arrayName:string);
begin
 if arrayName='integerArray' then delete(integerArray[0]);
 if arrayName='stringArray' then delete(stringArray[0]));
end

В общем, если массивов не два а двадцать, код растягивается неимоверно. Обратите внимание, что операции с массивом однотипные и повторяются копипастом...

т.е. Вопрос такой:
как обратиться к массиву, зная его имя... например, передать имя массива в функцию, в которой можно будет делать однотипные операции...

возможно, есть и альтернативные подходы... Надеюсь на помощь.
Ответить с цитированием
  #2  
Старый 06.09.2012, 09:39
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Используй array of variant. Тогда можноо вообще только один массив иметь, анализировать через VarType.
А лучше коллекции использовать.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 06.09.2012, 10:03
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а зачем вообще так делать (про setLengthArray и deleteFirst)?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 06.09.2012, 11:54
kemerovo_man kemerovo_man вне форума
Прохожий
 
Регистрация: 06.09.2012
Сообщения: 8
Репутация: 10
По умолчанию

2 NumLock так делать незачем, это абстрактные примеры, иллюстрирующие мое незнание...

2 M.A.D.M.A.N. поподробнее, пожалуйста, лучше с кодом...
Ответить с цитированием
  #5  
Старый 06.09.2012, 12:23
kemerovo_man kemerovo_man вне форума
Прохожий
 
Регистрация: 06.09.2012
Сообщения: 8
Репутация: 10
По умолчанию

по поводу varType он только стандартные типы определяет?

Цитата:
Функция VarType возвращает целое число, представляющее текущий тип данных для Variant переменной VariantVariable.

Этот 16 битный тип данных, разбитый на биты старшего разряда (4 бита) и младшего разряда (12 бит). Биты старшего разряда дают тип мета данных:

varArray: Если Variant содержит массив данных
varByRef: Если Variant косвенно обращается к данным

Биты младшего разряда содержат одно из следующих значений:

varEmpty
varNull
varSmallint
varInteger
varSingle
varDouble
varCurrency
varDate
varOleStr
varDispatch
varError
varBoolean
varVariant
varUnknown
varShortInt
varByte
varWord
varLongWord
varInt64
varStrArg
varString
varAny

Это не совсем то, что нужно...
В примерах я говорил о типах целое и строка для простоты, на самом деле у меня описаны классы объектов. Массивы типа: массив стульев, массив столов и т.д. массивы объектов... такой подход с variant прокатит?
Ответить с цитированием
  #6  
Старый 06.09.2012, 12:37
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

У тебя там будут экземпляры классов? В принципе array of TObject пойдет.
А вообще, для хранения классов есть листики спецовые, TObjectList называется.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #7  
Старый 06.09.2012, 13:05
kemerovo_man kemerovo_man вне форума
Прохожий
 
Регистрация: 06.09.2012
Сообщения: 8
Репутация: 10
По умолчанию

2 M.A.D.M.A.N. TObjectList кажется то, что нужно...
можно все экземпляры классов засунуть в один список, через свойство
list.Items[i].ClassType.ClassName определять их тип... буду много думать... спасибо.
Ответить с цитированием
  #8  
Старый 06.09.2012, 13:22
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

ClassName - это класс функция, она может быть вызвана как с объекта, так и с класса, не обязательно делать так: "ClassType.ClassName".
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #9  
Старый 06.09.2012, 13:26
kemerovo_man kemerovo_man вне форума
Прохожий
 
Регистрация: 06.09.2012
Сообщения: 8
Репутация: 10
По умолчанию

да, действительно можно короче писать
list[i].ClassName
спасибо
Ответить с цитированием
  #10  
Старый 13.09.2012, 06:19
kemerovo_man kemerovo_man вне форума
Прохожий
 
Регистрация: 06.09.2012
Сообщения: 8
Репутация: 10
По умолчанию

В продолжение темы возник вопрос...

Допустим, у меня есть класс TParent с какими-то общими свойствами и методами и есть куча классов потомков типа TChild1,TChild2,..,TChild20

Код:
type
 TParent = class 
 parentProperty:string;
 procedure initParent;
end;

type
 TChild1 = class(TParent) 
 child1Property:string;
 procedure initChild;
end;

type
 TChild2 = class(TParent) 
 child2Property:string;
 procedure initChild;
end;

//.....

type
 TChild20 = class(TParent) 
 child20Property:string;
 procedure initChild;
end;

допустим, есть ObjectList в который я добавил все экземпляры дочерних классов.

теперь я обращаюсь к i-му элементу ObjectList

Код:
var Obj:TParent;
//...
Obj:=ObjectList[i];
//я могу легко вызвать метод parentInit;
Obj.parentInit;
//но, чтобы вызвать метод childInit, мне уже приходиться делать тупо
if Obj.className='TChild1' then (Obj as TChild1).initChild;
if Obj.className='TChild2' then (Obj as TChild2).initChild;
//...
if Obj.className='TChild20' then (Obj as TChild20).initChild;

Вопрос: как это делать красивее?
Ответить с цитированием
  #11  
Старый 13.09.2012, 08:11
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Код:
if Obj.InheritsFrom(TChild) then TChild(Obj).initChild;
Если конечно они с общего предка и initChild предковый (абстрактный).
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #12  
Старый 13.09.2012, 11:56
kemerovo_man kemerovo_man вне форума
Прохожий
 
Регистрация: 06.09.2012
Сообщения: 8
Репутация: 10
По умолчанию

все TChild1, TChild2... TChild20 являются потомками TParent.
Метод TParent.parentInit является для них общим, с ним проблем нет.
а вот методы TChild1.childInit, TChild2.childInit, ...
являются методами инициализации потомков и описаны в них, причем у каждого потомка своя реализация этого метода, они только называются одинаково...

вот и вопрос, я вытащил непонятно что из ObjectList,
как мне вызвать метод childInit, от любого потомка... чтобы не перебирать
TChild1(Obj).initChild
TChild2(Obj).initChild
...
TChild20(Obj).initChild

как-нибудь так (любой потомок TParent).initChild;

может я много хочу
Ответить с цитированием
  #13  
Старый 13.09.2012, 12:05
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Читай про методы, объявленные как virtual и abstract. То, что тебе нужно.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #14  
Старый 13.09.2012, 13:13
kemerovo_man kemerovo_man вне форума
Прохожий
 
Регистрация: 06.09.2012
Сообщения: 8
Репутация: 10
По умолчанию

Спасибо похоже, то что нужно.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:54.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025