Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.03;
Скачать: CL | DM;

Вниз

Вернуть ссылку на компоненту по её описанию в STRING-е   Найти похожие ветки 

 
lord vader   (2004-09-18 11:51) [0]

Как можно найти и получить ссылку на компоненту если на входе в такую функцию подать например "TForm2.Listbox1"?(приложение многоформенное)


 
Алхимик ©   (2004-09-18 12:15) [1]

FindComponent ?


 
lord vader   (2004-09-18 12:37) [2]

Так не пойдет, уже пробовал. Мне из головной формы(mainform) нужно получить полную ссылку(форма.компонента), а таким способом насколько я знаю можно найти только компонент на текущей форме. Или я не прав?
На самом деле это очень срочно, заранее благодарен за ответ.


 
Defunct ©   (2004-09-18 18:48) [3]

lord vader   (18.09.04 11:51)  

Нафиг это нужно?
Приложение, же ваше. Какой смысл там искать какие-то компоненты? Абсурд какой-то.


 
lord vader   (2004-09-18 19:46) [4]

А вот нафиг! Нужно! В приложение поступает поток данных, среди которых название компонент у которых нужно менять какие-то свойста... У меня это TTable в основном.


 
Defunct ©   (2004-09-18 19:54) [5]

lord vader   (18.09.04 19:46) [4]

Так не легче, блин, сделать массив указателей на компонеты! ;)
в нем и искать. Да и лучше искать по коду (номеру) а не по имени. А лучше вообще сразу указатель использовать, пусть те данные, которым требуется обновиться, напрямую пишутся в TTable.

PS: бредовейшая затея - искать по имени компонента, это еще и медленно... Данные должны быть независимыми от визульных элементов.  Может лучше расскажете задачу, да что-нить дельное посоветуем?


 
Alx2 ©   (2004-09-18 19:54) [6]

>lord vader   (18.09.04 19:46) [4]
Внешний пользователь вашего приложения знает о реализации его функциональности во всех деталях? Не проще ли представить интерфейс, не открывая его реализацию?


 
lord vader   (2004-09-18 20:06) [7]

Я делаю так, может это и тупо и кто-то подскажет более красивый и экономичный вариант:
всё также через FindComponent, сначала через Application нахожу форму которой принадлежит компонент, а потом через форму получаю ссылку через опять же FindComponent, благо ничто не лежит в контейнерах... Есть у кого-то другие более продвинутые идеи?


 
Alx2 ©   (2004-09-18 20:10) [8]

>lord vader   (18.09.04 20:06) [7]
А про задачу свою можете рассказать в полной мере, темный джедай :) ?

Просто пока нет информации для раздумий.


 
lord vader   (2004-09-18 20:13) [9]

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


 
Defunct ©   (2004-09-18 20:13) [10]

> всё также через FindComponent, сначала через Application нахожу форму которой принадлежит компонент, а потом через форму получаю ссылку через опять же FindComponent, благо ничто не лежит в контейнерах... Есть у кого-то другие более продвинутые идеи?

Идеи будут сразу, как только мы услышим цель вышепроделанного.
Понимаете, я себе вообще не могу представить ситуации в которой нельзя обойтись без поиска компонентов по имени. Для меня такая ситуация равносильна использованию Label Goto и т.п. васиковских методов.


 
lord vader   (2004-09-18 20:18) [11]

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


 
Alx2 ©   (2004-09-18 20:21) [12]

>lord vader   (18.09.04 20:18) [11]
>данные находятся в TTable, в котором содержаться данные какому
>компоненту какой выполнить метод

Этот подход чем был вызван?


 
lord vader   (2004-09-18 20:25) [13]

мне так удобнее через TTable организовывать поток, добавлять, удалять отработавшие записи, с файлом париться дольше...


 
Alx2 ©   (2004-09-18 20:31) [14]

>lord vader   (18.09.04 20:25) [13]
Сорри, исходной задачи я так не увидел (задачи, которая вынудила передавать такие "рукописи" в приложение).
Я просто впервые встречаюсь с таки решением и не могу представить себе что его могло вызвать.


 
Defunct ©   (2004-09-18 20:34) [15]

lord vader   (18.09.04 20:18) [11]

Итак, есть 2 приложения. В одном располагается таблица доступных методов. Второе приложение содержит реализацию этих методов. Пока верно интерпретирую?

Делаем так: общая база данных с таблицей доступных методов, к ней подключены оба приложения, в таблице хранятся идентификаторы методов и имена (имена используются только для отображения юзеру). Приложение 2, в котором находится реализация, при инициализации динамически создает N объектов и инициализирует их методами из таблицы методов БД.
Пользователь выбирает в приложении 1 метод X по имени, идентификатор Y метода X передается приложению 2. В приложении 2 в массиве либо в списке объектов ищется объект с полученным от приложения 1 идентификатором Y. Нашли - запускаем его метод, не нашли - ничего не делаем.

Еще вариант:
В вашем приложении создаем список компонент участвующих в работе. Этот список наделяем возможностью запуска метода по имени/коду.

Еще вариант:
Централизованный источник отправляет, код метода. Ваше приложение каждому коду сопоставляет отдельный метод (т.е. таблица код/указатель на метод).


 
lord vader   (2004-09-18 20:57) [16]

БЛАГОДАРЮ товарища, Defunct!!!
Я подумаю над вашим вариантом решения задачи.


 
jack128 ©   (2004-09-18 21:04) [17]

function GetComponent(CompName: string): TComponent;
var
 FormName, ComponentName: string;
 i: Integer;
begin
 Result := nil;
 FormName := copy(CompName, 1, pos(".", CompName) - 1);
 if FormName = "" then Exit;
 ComponentName := copy(CompName, Length(FormName) + 2, Length(CompName));
 if ComponentName = "" then exit;
 for i := 0 to Screen.FormCount - 1 do
   if Screen.Forms[i].Name = FormName then
   begin
     Result := Screen.Forms[i].FindComponent(ComponentName);
     Exit;
   end;
end;


 
lord vader   (2004-09-18 21:20) [18]

Ого! Спасибо jack128, у меня что-то было подобное... только не до конца реализованное. Очень признателен за это! И вообще всему народу кто здесь обитает.



Страницы: 1 вся ветка

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.038 c
1-1095409645
TUser
2004-09-17 12:27
2004.10.03
Delphi < --- > CB


6-1090498953
diMAN
2004-07-22 16:22
2004.10.03
Многочисленные Arp-запросы


1-1095415832
vvv
2004-09-17 14:10
2004.10.03
MainMenu


1-1095425060
HollowMan
2004-09-17 16:44
2004.10.03
Как сделать шестнадцатиричное присвоение переменных byte:=$string


11-1081013613
mehos
2004-04-03 21:33
2004.10.03
Ширина выводимой меню, при OwnerDraw=true