Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2011, 09:08   #21
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

Цитата:
я хочу приводить объект к своему собственному типу , причем уже на этапе компиляции, и конечно, автоматически , ни о каких АВ полагаю и речи быть не может, а заниматься уточнением предков для классов менее удобно , вот и все предпосылки
Да можно конечно объявить свой тип равным(или наследником) TstringGrid/TDrawGrid (по выбору) и менять данное объявление по необходимости. Но только до тех пор пока будут использоваться свойства и методы общего класса. Так зачем это надо если можно сразу использовать базовый класс.Использование базового класса ГАРАНТИРУЕТ безболезненную смену используемого в реальности обхекта. Использование изменяемого наследника провоцирует на применение специфических свойств и методов и ПРОБЛЕМАМ при смене исходного объекта.(от чего ты так старательно пытаешься избавиться)

Цитата:
(в будущем план, что caller - поле формы, и можно работать с ним через некие методы),
property myGrid: TcustomGrid read GetMyGrid; ,будет работать с любым наследником этого класса.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 08.04.2011 в 09:19.
evg_m вне форума Ответить с цитированием
Старый 08.04.2011, 13:06   #22
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> я привожу один и тот же тип к нему же самому

всё, чего вы добились, это замена годного кода

Код:
(Sender as TStringGrid).mousetocell(x,y,c,r);
на негодный )

Код:
type
  tgridclass = class of TStringGrid;

....

tgridclass(sender).mousetocell(x,y,c,r);
Почему негодный? Потому что tgridclass(sender) — это прямое приведение типов без проверки чего-либо.

Как это исправить? Элементарно.

Код:
type
  mySenderBaseClassImSureInfa100 = TStringGrid;

.....

(sender as mySenderBaseClassImSureInfa100).mousetocell(x,y,c,r);
По крайней мере, это обезопасит вас в тот моменнт, когда в качестве sender передадут потомка от TButton Не в том плане, что у кнопки вдруг магическим образом появится метод mousetocell(), нет. Просто на экране будет показана красивая табличка с исключением, все живы-здоровы.

А знаете, что будет, если вызвать ваш код, при sender унаследованном от TButton:

Код:
tgridclass(sender).mousetocell(x,y,c,r);
И я не знаю. И никто не знает, т.к. ваш код полезет в смещение mousetocell() у sender-а, и какой метод или кусок данных будет у TButton по этому смещению одной иде известно.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 08.04.2011, 13:45   #23
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,886
По умолчанию

Спасибо ещё раз всем )

я в курсе обо всём, что вы все говорите, понимаю как и что, и про приведение (и отличия прямого и as-приведения) и про потомков. просто я подыскиваю разные варианты, те приведенные решения - не окончательные. в последнем примере приведение не сделал as , а надо было, проглядел, по предпоследнему варианту сориентировался.

Вы мне советуете сделать напрямую ручками, собственно, я почти так и сделал, просто менять класс понадобится в паре мест, а не везде где необходимо приведение

но на исходный вопрос темы ответа ещё нет - как переменной присвоить прокастованный типом_этой_же_самой_переменной какой-то объект (примем что это sender : tobject и компилятор его знает как Tobject, следовательно нужна кастовка к типу) или иными словами: как на стадии компиляции узнать тип уже объявленной переменной и использовать этот тип (т.е автоматом а не указывать его ещё раз для приведения типа). Вот Tobject.classtype по смыслу подошёл бы, но он только для рантайма

Вот такие издевательства над объктами ) повторю, что на данный момент рассматриваю именно подобный принцип. На практике по данному принципу возможно получится создать что-то гибкое, где в коде не надо указывать фиксированные вещи, а многое происходит само по себе (с целью перенастройки проекта на иные задачи/подзадачи малой кровью)

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

Последний раз редактировалось phomm; 08.04.2011 в 14:14.
phomm вне форума Ответить с цитированием
Старый 08.04.2011, 14:09   #24
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,528
По умолчанию

как переменной присвоить прокастованный типом_этой_же_самой_переменной какой-то объект (примем что это sender : tobject

function MyGridfunc(src: TObject): TMyGrid;
begin
result:= src as TMyGrid;
end;

var
r: TMyGrid;
src: Tobject;

r:=MyGridFunc(src);

такое ?!
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 08.04.2011, 14:11   #25
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Я бы глянул в сторону RTTI, но стоит ли городить огород ради одной строчки? (даже одного слова в ней)
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при присвоении объекту производного класса объекта базового класса с исп. явного приведения типов Lanx Помощь студентам 0 06.04.2011 20:24
Шаблоны - нужно создать объект класса abc в котором вместо aa использовался бы объект класса fff? Farrel Общие вопросы C/C++ 2 13.11.2010 17:37
Создание класса с полем типа TStringList. Ошибка при его заполнении Son Общие вопросы Delphi 8 13.04.2010 21:38
Параметр конструктора класса = объект этого класса nazavrik Общие вопросы C/C++ 6 14.02.2010 13:48
Если в классе объявить объект другого класса,будет ли видно переменные первого класса из объекта второго? TwiX Общие вопросы Delphi 3 15.11.2009 00:54