Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Определение адреса конструктора [D6, Win95/98, WinME, NT4, Win2k, WinXP]


Страницы:   1 2 3

Ученик ©   (2002-07-16 16:13:00) 

Можно по адресу класса определить адрес конструктора объектов этого класса ?

var
P : Pointer;
begin
P := TBitmap;

Необходимо вычислить адрес TBitmap.Create, используя P, возможно ли ?


Ученик   (2002-07-16 19:36:00) [21]

>vuk
>...ни в каких таблицах не прописан.

жаль


vuk   (2002-07-16 19:32:00) [22]

Если Вам нужно создавать экземпляр _любого_ класса, то такая задача в общем виде не решается, поскольку у каждого класса свой конструктор и он ни в каких таблицах не прописан.


Ученик   (2002-07-16 19:27:00) [23]

>vuk
С другими как раз и вопрос )))


vuk   (2002-07-16 19:25:00) [24]

to Ученик:
Экземпляр создать можно, но не всегда можно это сделать корректно. Например для наследников TComponent это делается просто (там имеется виртуальный конструктор), а вот для других классов это может быть проблематичным.


vuk   (2002-07-16 19:18:00) [25]

to Digitman:
>тело метода-конструктора этим не занимается, его задача -
>инициализация уже существующего экземпляра
....
>Ты же хочешь вызвать некий метод-конструктор в run-time просто
>как некую процедуру инициализации экземпляра. Вопрос - какого
>экземпляра ? Об этом придется заботиться самостоятельно ...

Здесь Вы не правы. Созданием экземпляра занимается именно конструктор. И получить его адрес можно, и вызвать тоже можно (если знать как). Только вот единственное - лучше этого не делать. :o)


Ученик   (2002-07-16 19:11:00) [26]

>Юрий Зотов
Так тут нет никаких подводный камней, хочется по адресу класса создать объект этого класса.


Юрий Зотов   (2002-07-16 18:48:00) [27]

Действительно напутал, приношу свои извинения.

Н в чем же, все-таки вопрос? Понимаете, я не зря спрашиваю. Я уточняю потому, что примерно догадываюсь, что Вы хотите и знаю, как это делается. Но чтобы говорить, нужно не догадываться, а быть полностью уверенным.


Skier   (2002-07-16 18:39:00) [28]

>[NIKEL]
showmessage(inttohex(integer(@TBitmap.Create), 8));

Чем тебе не адрес ? :)


[NIKEL]   (2002-07-16 18:36:00) [29]

по моему адреса деструктора и конструктора получить невозможно...


Skier   (2002-07-16 18:31:00) [30]

Это моё. Просто я-то думал что Ученик хочет иметь
дело с наследниками TBitmap-а.
Он что-то другое задумал:)


Ученик   (2002-07-16 18:29:00) [31]

>Юрий Зотов
Вы чего-то напутали, это не мое.


Юрий Зотов   (2002-07-16 18:25:00) [32]

> Ученик

Что-то все у Вас запутано как-то. Объясните просто - что нужно сделать? Создать некомпонентский объект, зная ссылку на его класс? Или что-то другое?

А Ваш пример

type
TBitmapClass = class of TBitmap;

var
P : TBitmapClass;
begin
RegisterClasses([TBitmap]);
P := TBitmapClass(GetClass("TBitmap"));
if P <> nil then P.Create;

полностью эквивалентен самому обычному вызову TBitmap.Create. Зачем такие навороты?


Ученик   (2002-07-16 18:16:00) [33]

>Digitman
>Ты же хочешь вызвать некий метод-конструктор в run-time просто >как некую процедуру инициализации экземпляра.

Я хочу вызвать конструктор объекта, по-моему он должен делать все, по-крайней мере кроме вызова TObject.Create там больше ничего нет. С несколькими параметрами действительно беда, но на это хотелось пока закрыть глаза, хотя какие-то странные сообщения мелькают в Delphi, если библиотеки компонентов не соответствуют друг другу.


Digitman   (2002-07-16 17:56:00) [34]

>Ученик

Конечно , объект будет создаваться в этом примере ! В этом и сомнений нет )

Но ведь в этом примере работу по внедрению и вызову кода создания экземпляра неявно выполняет за тебя компилятор ...

Ты же хочешь вызвать некий метод-конструктор в run-time просто как некую процедуру инициализации экземпляра. Вопрос - какого экземпляра ? Об этом придется заботиться самостоятельно ...

Еще один вопрос - а как ты надеешься вызывать метод-конструктор, даже зная его адрес, если он имеет один или более (заранее неизвестно) параметров ?


Skier   (2002-07-16 17:55:00) [35]

>Ученик
К сожалению, у потомков TPersistent конструктор не
перекроешь (override).
Это можно делать только начиная с TComponent :(


Ученик   (2002-07-16 17:46:00) [36]

>Digitman
Я не знаю ответа, я еще только учусь, просто попробуйте выполнить код который указан выше, объекты создаются,
не вызывается конструктор определенный именно для них


Digitman   (2002-07-16 17:39:00) [37]

>Ученик

Нет, подожди ...
кем/чем и как будет создаваться экземпляр у тебя, коль ты не хочешь отказаться от услуг компилятора ?

тело метода-конструктора этим не занимается, его задача - инициализация уже существующего экземпляра


Ученик   (2002-07-16 16:56:00) [38]

>Digitman
Экземпляр то создается, и P.Create.Free вызовет TBitmap.Destroy, только вот конструктор вызвать проблема.
>Skier
TBitmap взят для примера, на его месте может быть любой другой.

Есть какая-то таблица методов, конструкторы там не постоянном месте ?


Ученик   (2002-07-16 16:53:00) [39]

>Digitman
Экземпляр то создается, и P.Create.Free вызовет TBitmap.Destroy, только вот конструктор вызвать проблема.


Skier   (2002-07-16 16:48:00) [40]

>Ученик


type
TBitmapClass = class of TBitmap;

var
P : TBitmapClass;
begin
RegisterClasses([TBitmap]);
P := TBitmapClass(GetClass("TBitmap"));
if P <> nil then P.Create;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо