![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Приведение и сравнение типов. [WinXP]
Kolan © (2006-03-25 22:04:00)Здравствуйте,
(FSettingList[GetSettingIndex(Name)] as TBooleanSetting)
Эта строчка сделает приведение к типуTBooleanSetting.
А как привести к типу обекта, чей это метод. Те как привести к типуSelf?
Kolan (2006-03-26 13:48:00) [1]Да уже сделал. Думаю этого мне надолго хватит....
первый - для возвращения типа поля,
второй - для возвращения указателя на поле Value,
а третий - указателя на поле DefalutValue.
До этого не додумался...
Благодарю за помощь поробую... :)
Cash (2006-03-26 13:17:00) [2]Kolan © (26.03.06 10:56) [8]:
function GetMyClassName: TBooleanSettingClass; virtual; abstract;
Ты в потомках этот метод переписываешь?
Так... насколько стало ясно, ты используешь иерархию классов для
хранения настроек разных типов. Т. е. твои Value и DefalutValue могут
быть либо string, либо Double или еще чего там. Так?
А тогда зачем тебе Property?
Используй три virtual метода,
первый - для возвращения типа поля,
второй - для возвращения указателяна поле Value,
а третий - указателяна поле DefalutValue.
тем самым тебе ваабще не надо будет класс узнавать!
Причем тип можно возвращать и не непосредственно, т. е., к примеру,
для Byte возвращается 0, а для integer - 1. И исходя из этого значения
уже можно приводить к нужному типу и брать разыменование указателя.
Kolan (2006-03-26 10:56:00) [3]Незнаю что я сделал...
Сделал такие ф-ции
function GetMyClassName: TBooleanSettingClass; virtual; abstract;
TStringSettingClass = class of TStringSetting;
Компилится - компилится, но не работает...
Лучьше я покопирую... чем такой изврат....
Kolan (2006-03-26 10:50:00) [4]Сможешь пояснить?
Да, я хочу создать универсальный менеджер настроек, но это как я понял невозмлжно, тк действия, проверки итд для разных типов нужны разные. Особенно если ти - запись.
Так вот я создал иерархию "Настроек" - наследниковTCustomSettingу них у всех есть два свойстваValueиDefalutValue;
А, блин, кстатиSelfу меня это был неTBooleanSetting, аTBooleanSettingList, который содержит списокTBooleanSetting.
Но такое тоже не работает
,
DefaultValue
:= (FSettingList[GetSettingIndex(Name)] as FSettingList[0].ClassType).DefaultValue;
потому чтоTClassне знает о моих свойствах.
И соответственно по классу - "списку настроек" для каждого типа.
И еще менеджер, который всем заправляет. Работет все, но если писать
везде
(FSettingList[GetSettingIndex(Name)] as TBooleanSetting)
, то придется менять приведение в каждом типе настроек.
...
Cash (2006-03-25 22:58:00) [5]... Как вообще вернуть Тип? ...
Говорим, что у нас есть TBooleanSetting.
И, что он наследник от TCustomSetting. Так?
Далее можно сказать, что у нас есть еще что ни то
потомственное от TBooleanSetting. Но ведь в то же время
этот потомок будет еще и потомком от TCustomSetting!
Тогда все дело должно свернуться к универсализации класса
TCustomSetting. Это делается так:
Type
TSettingClass = class of TCustomSetting;
После чего просто делаешь функцию или еще чего и прикручиваешь
этот TSettingClass туда.
Я так до конца и не понял, чего тебе надо от DefaultValue?
Сможешь пояснить?
Kolan (2006-03-25 22:51:00) [6]Кстати:
Avoid using ClassType in application code.
Note:
In Delphi code, use the isor asoperators instead of ClassType.
Kolan (2006-03-25 22:48:00) [7]Яное дело окошко(CodeInsight)появляется, но DefaultValue там нет.
Можно былобы написать функцию возвращающую конкретный тип, но как это сделать не пойму...
Как вообще вернуть Тип?
Cash (2006-03-25 22:40:00) [8]Интересно.... 8)
DefaultValue := (FSettingList[GetSettingIndex(Name)] as Self.ClassType) . DefaultValue;
А та фича, окошко со списком полей и методов, после этой точки
появляется млм нет?
Kolan (2006-03-25 22:31:00) [9]Это я нашел, но..
Допустим класс выглядитTBooleanSettingтак:
TBooleanSetting = class(TCustomSetting)
property DefaultValue : Boolean read GetDefaultValue write SetDefaultValue;
end;
Если пишу так то компилятор говорит, что мон неопределенный идентификатор
DefaultValue
DefaultValue
:= (FSettingList[GetSettingIndex(Name)] as Self.ClassType).DefaultValue;
...
Cash (2006-03-25 22:20:00) [10]...А привести ету штукенцию к типу носителя можно так:
- подобно вашему примеру
(FSettingList[GetSettingIndex(Name)] as Self.ClassType)
- или так, как нравится мне
Self.ClassType(FSettingList[GetSettingIndex(Name)])
Всеравно приведется.