Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];

Вниз

Наглядная настройка параметров.   Найти похожие ветки 

 
О-Сознание   (2013-04-25 13:48) [0]

Есть множество классов, но по разному инициализированными свойствами:


type
 TEnity = class
   constructor Create; virtual;
 private
   FA: Integer;
   FB: Integer;
   FC: Integer;
 published
   property A: Integer read FA;
   property B: Integer read FB;
   property C: Integer read FC;
 end;

 TEnity_1 = class (TEnity)
   constructor Create; override;
 end;

 TEnity_2 = class (TEnity)
   constructor Create; override;
 end;

{ TEnity }

constructor TEnity.Create;
begin
 inherited;
 FA:= 1;
 FB:= 2;
 FC:= 3;
end;

{ TEnity_1 }

constructor TEnity_1.Create;
begin
 inherited;
 FA:=  1;
 FB:=  20000;
 FC:= -10;
end;

{ TEnity_2 }

constructor TEnity_2.Create;
begin
 inherited;
 FA:= -10;
 FB:=  50;
 FC:=  444;
end;


Помимо свойств у каждого есть свои методы и функции ->
В следствии чего теряется быстрота и наглядность изменения известных свойств.

Было бы хорошо инициализировать классы в Config.pas так:


procedure SetParam(TEnity_1,    1, 20000, -10);
procedure SetParam(TEnity_2, -10, 50,        444);

. . .


Как такое оптимальнее сделать?


 
Eraser ©   (2013-04-25 14:04) [1]

через статические свойства можно.


 
Компромисс1 ©   (2013-04-25 14:33) [2]

Это точно не константы для каждого класса? А то я write не вижу.


 
Плохиш ©   (2013-04-25 14:53) [3]

Добавить в TEnity метод SetParam.


 
O'ShinW ©   (2013-04-25 14:58) [4]

TEnity = class
public
  constructor Create(A,B,C: Integer); virtual;


> инициализировать классы в Config.pas так:

C1 := TEnity_1.Create( 1, 20000, -10);
C2 := TEnity_2.Create( -10, 50,        444);


 
Юрий Зотов ©   (2013-04-25 15:00) [5]

TEnity наследуется от TObject. Тогда какой смысл в published?


 
Аббат Пиккола   (2013-04-25 15:05) [6]

Согласен с Юрий Зотов ©   (25.04.13 15:00) [5]

Published используется, если нужно отображать свойство компонента в инспекторе объектов. В данном случае правильно public.


 
Компромисс1 ©   (2013-04-25 15:06) [7]


> Помимо свойств у каждого есть свои методы и функции ->


Кстати, судя по этому фрагменту, напрашивается общий предок, у которого будет A,B,C.


 
Игорь Шевченко ©   (2013-04-25 15:15) [8]


> Published используется, если нужно отображать свойство компонента
> в инспекторе объектов


Не совсем для этого :)


 
Аббат Пиккола   (2013-04-25 15:20) [9]

Published members have the same visibility as public members. The difference is that runtime type information (RTTI) is generated for published members. RTTI allows an application to query the fields and properties of an object dynamically and to locate its methods. RTTI is used to access the values of properties when saving and loading form files, to display properties in the Object Inspector, and to associate specific methods (called event handlers) with specific properties (called events).


 
Аббат Пиккола   (2013-04-25 15:26) [10]

Плюс еще вот это:

Most classes with published members derive from TPersistent


 
Игорь Шевченко ©   (2013-04-25 16:52) [11]

Аббат Пиккола   (25.04.13 15:20) [9]

И какой вывод из этого следует ?


 
О-Сознание   (2013-04-25 18:14) [12]


>  Компромисс1 ©   (25.04.13 14:33) [2]
>
> Это точно не константы для каждого класса? А то я write
> не вижу.


Ах да, там write.


> Юрий Зотов ©   (25.04.13 15:00) [5]
>
> TEnity наследуется от TObject. Тогда какой смысл в published?
>


Однотипность. :)


> O"ShinW ©   (25.04.13 14:58) [4]


Хочется сделать так:


  E:= TEntity.Create;



Т.е. так, чтобы свойства не устанавливать явно каждый раз.


 
clickmaker ©   (2013-04-25 18:26) [13]

> Хочется сделать так:
>
>  E:= TEntity.Create;

Я бы завел фабрику классов и енум "тип сущности"


 
Юрий Зотов ©   (2013-04-25 18:28) [14]


> О-Сознание

Возможно, есть смысл загнать все значения куда-нибудь в единый источник (XML, таблица БД, INI и т.п.). Ключом будет служить имя класса, например:

[TEnity]
A = 1
B = 2
C = 3
[TEnity_1]
A = 1
B = 20000
C = -10
[TEnity_2]
A = -10
B = 50
C = 444

После этого будет достаточно лишь одного конструктора - в базовом классе. Все остальные уже не понадобятся, сколько бы потомков ни было. И при появлении нового потомка надо будет всего лишь добавить секцию (тэг, запись...). IMHO, это удобно.


 
знайка   (2013-04-25 21:20) [15]

а для чего все это надо? :)


 
clickmaker ©   (2013-04-25 22:01) [16]

> знайка   (25.04.13 21:20)

наконец-то первый нормальный программерский вопрос :)


 
О-Сознание   (2013-04-25 22:19) [17]


> знайка   (25.04.13 21:20) [15]
>
> а для чего все это надо? :)


Для наглядной настройки параметров, название темы само говорит.
Сущностей будет около 30 штук, править, лазая в конструктор не очень удобно. :)


 
Плохиш ©   (2013-04-25 22:22) [18]

Как всегда. Сначала высосать проблему из пальца, а потом героически её решать.


 
clickmaker ©   (2013-04-25 22:42) [19]

> Для наглядной настройки параметров, название темы само говорит

Название темы скорей говорит о каком-то гуе для настройки параметров программы. Типа диалоговое окно


 
О-Сознание   (2013-04-25 23:29) [20]


> clickmaker ©   (25.04.13 22:42) [19]
>
> > Для наглядной настройки параметров, название темы само
> говорит
>
> Название темы скорей говорит о каком-то гуе для настройки
> параметров программы. Типа диалоговое окно
>


> Config.pas


 
О-Сознание   (2013-04-26 10:51) [21]

В общем будет как-то так:


function CreateEntity(Kind: LongInt): TEnity;
begin
 case of
    Result:= TEnity_1.Create(1, 20000, -10);
    Result:= TEnity_2.Create(1, 2, 3);

end;



 
icelex ©   (2013-04-26 11:25) [22]

ну так кто ж мешает использовать фабрики?


 
О-Сознание   (2013-04-26 14:06) [23]

Вопрос исчерпан.


 
han_malign   (2013-04-26 15:00) [24]


> case of

type
   TEntityChoice = ( Entity1, Entity2, Entity3 );
const defEntity: array[TEntityChoice] of record a, b, c: integer end = (
  (a:1  , b:2    , c:3  ),
  (a:1  , b:20000, c:-10),
  (a:-10, b:50   , c:444)
);


 
О-Сознание   (2013-04-26 15:30) [25]


> han_malign   (26.04.13 15:00) [24]
>
>
> > case of
>
> type
>    TEntityChoice = ( Entity1, Entity2, Entity3 );


Вот такое пытался сделать, а оно вон как делается.
Спасибо, не знал. :)


 
Компромисс1 ©   (2013-04-26 15:34) [26]

Map<Class<? extends Entity>, Map<String, Integer>> class2params

:)


 
О-Сознание   (2013-04-26 19:58) [27]


> han_malign   (26.04.13 15:00) [24]
>
>
> > case of
>
> type
>    TEntityChoice = ( Entity1, Entity2, Entity3 );


Для некоторых классов не могу так сделать,
пишет: "Identifier redeclared". (Нашли двойника)
Т.е. (Условно) TEnity - подходит, TEnity_1 - нет.

Причину не могу найти.


 
Компромисс1 ©   (2013-04-27 21:23) [28]

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


 
О-Сознание   (2013-04-27 22:16) [29]


> Компромисс1 ©   (27.04.13 21:23) [28]
>
> Переименуйте. Нельзя, чтобы совпадало с именем класса.


А почему  TEnity подходит?


 
Компромисс1 ©   (2013-04-27 22:44) [30]

Я подозреваю, что нельзя, чтобы имя класса совпадало с именем члена перечиляемого типа.
Если после переименования ошибка исчезнет, значит в этом было дело.


 
Аббат Пиккола   (2013-04-28 01:29) [31]

Сколько я не взираю на все это, никак в толк не возьму, к чему все это.
Будет 30 классов сущностей, как я понял, каждая сущность будет иметь одни и те же 3 свойства, но с разными значениями. Похоже, что каждой сущности будет создано по одному экземпляру (объекту). Может быть сделать ОДНУ сущность и 30 экземпляров с разными свойствами?
Простите, если что не так, но мне вспомнился Малыш и Карлсон.
А нельзя, чтобы было 30 тортов и одна свечка?
:)


 
Аббат Пиккола   (2013-04-28 12:05) [32]

2 О-Сознание

Как по-Вашему, если есть класс TEntity, имеющий свойства A,B,C. И нужно иметь 30 объектов, каждый со своим значением свойств A,B,C, то что нам требуется в конечном итоге иметь:

1. 30 потомков класса TEntity (TEntity1, TEntity2, TEntity3 и т.д.)
2. 30 экземпляров класса TEntity (Entity1, Entity2, Entity3 и т.д.)
3. Без разницы.

?


 
Аббат Пиккола   (2013-04-28 12:24) [33]

TEntity - сущность.

Господь сказал "Плодитесь и размножайтесь, но не плодите сущностей без надобности (курсив - прим.ред.:)"  (Быт.1:28)

Entia non sunt multiplicanda sine necessitate

Я же пока не вижу никаких различий в потомках класса TEntity, кроме значений их свойств, присваиваемых в момент создания. Для этого достаточно иметь конструктор, принимающий 3 параметра. Или конструктор, принимающий 1 параметр (индекс) и массив значений (const), из которого будут браться эти значения, если они фиксированы.


 
Компромисс1 ©   (2013-04-28 13:13) [34]

Аббат Пиккола   (28.04.13 12:24) [33]

В OP написано про разные методы и свойства


 
О-Сознание   (2013-04-28 14:35) [35]


> Аббат Пиккола   (28.04.13 12:05) [32]
>
> 2 О-Сознание
>
> Как по-Вашему, если есть класс TEntity, имеющий свойства
> A,B,C. И нужно иметь 30 объектов, каждый со своим значением
> свойств A,B,C, то что нам требуется в конечном итоге иметь:
>


30 потомков.
У каждого своя реализация поверх обычной сущности, но базовые свойства те же. Вот их надо как-то удобно настраивать.


 
Плохиш ©   (2013-04-28 15:44) [36]

Хм, за трое суток каких только отверстий не предложили для вырезания гланд.


 
Eraser ©   (2013-04-28 21:56) [37]


> Плохиш ©   (28.04.13 15:44) [36]

автору просто надо к окулисту.


 
О-Сознание   (2013-04-28 22:41) [38]


> Плохиш ©   (28.04.13 15:44) [36]
> Eraser ©   (28.04.13 21:56) [37]


Это вам надо к окулисту, дорогие мои.
Вопрос давно решён.


> О-Сознание   (26.04.13 14:06) [23]
> Вопрос исчерпан.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2013.10.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.006 c
15-1366559274
UseSynergy
2013-04-21 19:47
2013.10.06
Ищу программистов для стартапа


15-1363095630
О-Сознание
2013-03-12 17:40
2013.10.06
Трабла с директивой


15-1366649723
Rouse_
2013-04-22 20:55
2013.10.06
Нужен третейский судья :)


2-1358236774
samborskijj
2013-01-15 11:59
2013.10.06
Неверный запрос (слишком мало параметров)


15-1366917087
О-Сознание
2013-04-25 23:11
2013.10.06
VCL построена на "сигналах-слотах"?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский