![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Object Manager
Piroxyline © (2006-12-30 20:04:00)Подумал-подумал, и решил сделать енто... Не слишком отлажено, но работает.
Смысл: есть менеджер объектов, который может автоматически создавать почти неограниченное их количество. В объектах может быть почти неограниченное количество свойств, у каждого из которых должно быть имя и значение. Свойства создаются автоматически при попытке записи в них (если его не было, оно создатся, если было - перезапишется). Если нет значения - свойство автоматически удаляется, если нет свойств - удаляется объект. Объект удаляется также, если у него удалить имя. У объекта есть методы на попытку чтения и на попытку записи свойств, а также на обновление. Обновление осуществляется вызовом процедуры Update у менеджера, при этом удаляются убитые объекты из массива. К объектам и их свойствам можно обращаться как по имени, так и по списку. Работает все это практически в любой версии Delphi, где поддерживается тип Variant (у меня пахала с 4 по turbo)
В-общем, судите сами - надо это или нет. В комплекте лежит пример - консольная программка для подсчета слов из файла.
http://forum.sources.ru/index.php?act=Attach&type=post&id=1396624
Джо (2007-01-04 17:45:00) [21]> [14] vlad-mal © (04.01.07 17:40)
> Если я не узнаю, что такие "третьи Корсары", (а заодно и
> "ПКМ"), я не усну сегодня... :)
Будем бодрствовать вместе. А Кулибин пусть отдохнет :)
vlad-mal (2007-01-04 17:40:00) [22]Если я не узнаю, что такие "третьи Корсары", (а заодно и "ПКМ"), я не усну сегодня... :)
saxon (2007-01-04 17:29:00) [23]
> saxon (04.01.07 17:25) [12]
Извините, не так прочитал. посыпаю голову пеплом :)
saxon (2007-01-04 17:25:00) [24]
> vlad-mal © (04.01.07 16:50) [9]
> ... К котороому и происходит обращение при вызове .Free. Т.е.
> реально Ваш деструктор не вызывается. ...
Ой по моему тут совсем наоборот ;)
TCrash (2007-01-04 17:12:00) [25]и как попасть на http://forum.sources.ru/index.php?act=Attach&type=post&id=1400838не регистрируясь на форуме?
Хочешь создать опенсорц проект - сделай для него сайт. хотя бы на том же народе
Джо (2007-01-04 17:00:00) [26]>
> Так кто такие "третьи Корсары"? :)
А заодно и «ПКМ».
vlad-mal (2007-01-04 16:50:00) [27]
> Вроде поправил (ну не разбираюсь я в этих методах :) ).
Ужас :)
destructor Destroy; virtual;
Вы на ворнинги смотрите, после компиляции?
> [Warning] ObjectManager.pas(94): Method 'Destroy' hides
> virtual method of base type 'TObject'
>
Ваш класс
T_Object = class
наследуется от класса TObject, в котором уже есть свой деструктор Destroy:
destructor Destroy; virtual;
с "пустой" реализацией
destructor TObject.Destroy;
begin
end;
К котороому и происходит обращение при вызове .Free. Т.е. реально Ваш деструктор не вызывается. Вы должны или вызывать его явно (.Destroy), или (что желательно) переопределить существующий виртуальный вот так:
T_Object = class
...
public
destructor Destroy; override;
...
end;
T_ObjectManager = class
...
public
...
destructor Destroy; override;
end;
Этого достаточно, чтобы при вызове .Free вызывался именно Ваш деструктор.
Кстати, посмотреть, есть ли обращение к деструктору, легко можно в отладчике. :)
Еще: работать все равно не будет :) - т.к. деструкторы написаны неправильно. :(
Как только Вы сделаете то, что я Вам рекомендовал, дектруктор выдаст Access Violation. Потому что написан он неправильно :)
...
Я для примера запустил Вашу программку с параметрами:
> ObjectManager.pas Out.txt
и схлопотал OutOfMemory.
Подключил менеджер памяти FastMM4, все получилось, но узнал, что Ваши деструкторы не вызываются, и происходит утечка памяти. Остальное - см. выше.
Так что вот так.
--------------
Так кто такие "третьи Корсары"? :)
MetalFan_pda (2007-01-04 15:33:00) [28]хм...подобие xml чтоль...
Piroxyline (2007-01-04 15:21:00) [29]
> vlad-mal © (03.01.07 23:18) [3]
Вроде поправил (ну не разбираюсь я в этих методах :) ). Плюс сделал оччень тупое сохранение.
http://forum.sources.ru/index.php?act=Attach&type=post&id=1400838
Игорь Шевченко (2007-01-04 13:16:00) [30]Дети Ивана Кулибина
vlad-mal (2007-01-03 23:55:00) [31]:)
Palladin (2007-01-03 23:34:00) [32]Кто здесь?
vlad-mal (2007-01-03 23:18:00) [33]Оч. интересно.
Деструкторы
destructor T_ObjectManager.Destroy;
и
destructor T_Object.Destroy;
не - виртуальны. Следовательно, не будут вызваны при обращении к методу .Free экземпляров соотв. объектов.
-----------------
Кто такие "третьи Корсары"?
Piroxyline (2006-12-31 13:00:00) [34]
> Эх, парень, как думаешь, сколько людев прошли через это?
Много. Я тоже.
> Ты пойми один из самых великих законов программирования.
> .. Чем универсальней сущность, тем меньше найдется случаев
> для ее применения...
> Всегда... всегда... При разработке идет балансирование между
> количеством и качеством... И всегда всегда оказывается неоптимально
> использовать нечто не конкретное... Самое оптимальное использовать
> самописный или левописный ДБЛэйер...
В курсе. Только я реализовал то же самое, что сделано в интерпретаторе C++ в ПКМ и третьих Корсарах. Сейчас начал проект, в котором в конце концов пришел к использованию этого модуля - мне просто так удобней. Я ведь никого не заставляю им пользоваться.
Palladin (2006-12-31 04:18:00) [35]Эх, парень, как думаешь, сколько людев прошли через это?
Ты пойми один из самых великих законов программирования... Чем универсальней сущность, тем меньше найдется случаев для ее применения...
Всегда... всегда... При разработке идет балансирование между количеством и качеством... И всегда всегда оказывается неоптимально использовать нечто не конкретное... Самое оптимальное использовать самописный или левописный ДБЛэйер...