|
Тема |
Явно няма интерес към темата [re: LSS] |
|
Автор |
simple_code (Правдоподобен) |
|
Публикувано | 16.09.05 22:47 |
|
|
Здравейте отново.
Темата я постнах аз, но сега реших и да се регистрирам.
Ще продължа да пиша, защото съм сигурен, че темата съвсем не е тривиална и някога, някак, на някого вместо да му се вгорчи живота, ще влезне тук и може би ще намери това което му трябва.
Сега: имам малък напредък в издирването на валидни референции на формите принадлежащи на проект по време на разработка.
Първо ще поясня как седят нещата при мен, за да не ме разбират хората погрешно.
1. Имаме компонента наследник на TComponent (тя е именно и във фокуса на проблема)
2. Имаме дефиниран нейн редактор, който е наследник на TComponentEditor
3. Редактора е с override-нати методи: ExecuteVerb(), GetVerbCount(), GetVerb().
Сега ясно е, че когато получим инстанция на компонентния редактор, тя пристига направо с интерфейсно копие Designer от тип IDesigner, както и с копие на компонентата.
Толкова с обясненията.
С много мъки успях да изнамеря валидни копия на обектите от типа TForm, TFrame, TDataModule и така натък, чиито модули обаче са включени в uses клаузата на Designer.Root обекта. :(
Естествено, начинът по който стана, направо е за смях и чак ме е яд, че трябва да пилея ненужни ресурси. Ето за какво говоря:
Използвам процедурата Designer.GetComponentNames(TypeData: PTypeData; Proc: TGetStrProc) за да докопам всички обекти от специфицирания от TypeData клас (вмоя код викам тази функция за TComponent). Proc е callback функция която третира името на намерената компонента:
type TGetStrProc = procedure(const S: string) of object
е в тялото на callback функцията правя нещо от тоя род:
var
cmpnt: TComponent;
cmpntOwner: TComponent;
begin
cmpnt := Designer.GetComponent(s);
if cmpnt <> nil then
begin
cmpntOwner := GetTopOwner(cmpnt);
if FFormsList.IndexOf(cmpntOwner.Name) = -1 then
FFormsList.AddObject(cmpntOwner.Name, cmpntOwner);
end;
т.е. попълвам списъка FFormsList с намерените от GetTopOwner() референции
GetTopOwner() не прави нищо друго освен да изнамери cmpntOwner.Owner.Owner.Owner..... докато е различен от nil
та... това което не ми харесва е че за всички компоненти трябва първо да изнамирам TopOwner-а им, после да проверявам дали "случайно" той вече не фигурира в списък и евентуално след това да го добавя... Според мен това е абсолютна глупост, ама за сега само това успях да направя. Да не говорим, че това не решава проблема напълно. Както казах и преди функцията Designer.GetComponentNames() минава през компонентите на модулите които са включени в uses клаузата на Designer.Root. Ами като нищо мога да имам форми и то достатъчен брой, които да не се използват от притежателя на компонентата ми...
Е... Чакам мненията ви...
[Fatal Error] UniverseLoader.god(666): Devision by cucumber. Please reinstall the Universe.Редактирано от simple_code на 17.09.05 00:45.
|
| |
|
|
|