![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определение адреса конструктора [D6, Win95/98, WinME, NT4, Win2k, WinXP]
Ученик © (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;