![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
procedure TCustomImageList.DefineProperties(Filer: TFiler);
GuAV © (2005-03-08 15:39:00)Можно ли запретить сохранять Bitmap ?
И если да. то как ?
jack128 (2005-03-26 00:33:00) [1]GuAV © (21.03.05 21:23) [8]
PPointer(Self)^ := ClassParent;
очень опасныйспособ, череватый очень трудновылавливаемыми глюками, ИМХО
GuAV (2005-03-21 21:23:00) [2]>Юрий Зотов © (21.03.05 0:27) [7]
> Причем заметьте, что так можно вызвать виртуальный
> метод любого предка, и даже не только предка.
И даже, оказывается не толко виртуальный.
PPointer(Self)^ := ClassParent; - работает и для динамических методов.
Спасибо.
Юрий Зотов (2005-03-21 00:27:00) [3]> GuAV © (08.03.05 21:09) [4]
>>Зато точно сработает "хакерский" способ - вызвать
>>унаследованный метод "деда", не вызывая
>>унаследованного метода "отца".
> Как ?
Очень просто, если речь идет о виртуальном методе (а о нем она и идет).
Первые 4 байта любого объекта содержат ссылку на его класс (то есть, на VMT). Подменяем их содержимое нужным, вызываем метод, потом все восстанавливаем обратно. И вся наука.
Причем заметьте, что так можно вызвать виртуальный метод любого предка, и даже не только предка.
GuAV (2005-03-08 22:24:00) [4]Вопрос [0] снимается.
Оказывается методы ReadData и WriteData виртуальные и ни на что кроме DefineProperties не влияют и их можно заменить пустыми. Как я смотрел .. ? :(
всем спасибо.
Набережных С. (2005-03-08 21:37:00) [5]
> GuAV © (08.03.05 21:09) [4]
Код покажи. Хотя бы объявления, в той части которая касается вопроса, с краткими пояснениями. А то я опять ничего не понял. Собственно, за вызов DefineProperties листа отвечает его владелец. Может просто объявить это свойство с STORED FALSE?
GuAV (2005-03-08 21:09:00) [6]>Юрий Зотов © (08.03.05 17:20) [2]
> Возможно, "легальный" способ - переобъявить то же
> самое свойство с параметрами ('Bitmap', nil, nil,
> False). Но не уверен, не пробовал.
Проверил.
Нет. Переобъявить таким образов св-во не получится.
>Зато точно сработает "хакерский" способ - вызвать
>унаследованный метод "деда", не вызывая
>унаследованного метода "отца".
Как ?
>Набережных С. © (08.03.05 16:29) [1]
> Подробней?
наследник TCustomImageList сам заполняется изображениями после создания при изменении размеров и добавленых свойств.
Проблема в том что при сохранении Bitmap он загружается уже после создания и если ни одно из published свойств влияющих на изображения не изменено, то в нём остаётся Design-time версия изображений.
Уже понял что если компонент читается из dfm, то надо создавать изображения после прочтения. Как это грамотно реализовать, при условии что компонент не обязательно создаётся в дезайнтайме ?
Кроме того, хотелось бы всё же избавится от хранения Bitmap, всё равно от него никакой пользы.
Набережных С. (2005-03-08 17:28:00) [7]Вероятно, TCustomImageList не сам по себе используется, а в составе чего-то? Имхо, оттуда и надо начинать рыть.
Юрий Зотов (2005-03-08 17:20:00) [8]Возможно, "легальный" способ - переобъявить то же самое свойство с параметрами ('Bitmap', nil, nil, False). Но не уверен, не пробовал.
Зато точно сработает "хакерский" способ - вызвать унаследованный метод "деда", не вызывая унаследованного метода "отца".
Еще возможно, что решение лучше искать не в DefineProperties, а где-то еще. Надо полазить по коду VCL.
Набережных С. (2005-03-08 16:29:00) [9]Подробней?