![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вернуть ссылку на компоненту по её описанию в STRING-е
lord vader © (2004-09-18 11:51:00)Как можно найти и получить ссылку на компоненту если на входе в такую функцию подать например 'TForm2.Listbox1'?(приложение многоформенное)
lord vader (2004-09-18 21:20:00) [1]Ого! Спасибо jack128, у меня что-то было подобное... только не до конца реализованное. Очень признателен за это! И вообще всему народу кто здесь обитает.
jack128 (2004-09-18 21:04:00) [2]
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 20:57:00) [3]БЛАГОДАРЮ товарища, Defunct!!!
Я подумаю над вашим вариантом решения задачи.
Defunct (2004-09-18 20:34:00) [4]lord vader (18.09.04 20:18) [11]
Итак, есть 2 приложения. В одном располагается таблица доступных методов. Второе приложение содержит реализацию этих методов. Пока верно интерпретирую?
Делаем так: общая база данных с таблицей доступных методов, к ней подключены оба приложения, в таблице хранятся идентификаторы методов и имена (имена используются только для отображения юзеру). Приложение 2, в котором находится реализация, при инициализации динамически создает N объектов и инициализирует их методами из таблицы методов БД.
Пользователь выбирает в приложении 1 метод X по имени, идентификатор Y метода X передается приложению 2. В приложении 2 в массиве либо в списке объектов ищется объект с полученным от приложения 1 идентификатором Y. Нашли - запускаем его метод, не нашли - ничего не делаем.
Еще вариант:
В вашем приложении создаем список компонент участвующих в работе. Этот список наделяем возможностью запуска метода по имени/коду.
Еще вариант:
Централизованный источник отправляет, код метода. Ваше приложение каждому коду сопоставляет отдельный метод (т.е. таблица код/указатель на метод).
Alx2 (2004-09-18 20:31:00) [5]>lord vader (18.09.04 20:25) [13]
Сорри, исходной задачи я так не увидел (задачи, которая вынудила передавать такие "рукописи" в приложение).
Я просто впервые встречаюсь с таки решением и не могу представить себе что его могло вызвать.
lord vader (2004-09-18 20:25:00) [6]мне так удобнее через TTable организовывать поток, добавлять, удалять отработавшие записи, с файлом париться дольше...
Alx2 (2004-09-18 20:21:00) [7]>lord vader (18.09.04 20:18) [11]
>данные находятся в TTable, в котором содержаться данные какому
>компоненту какой выполнить метод
Этот подход чем был вызван?
lord vader (2004-09-18 20:18:00) [8]идея простая, на главной форме лежит моя компонента... данные находятся в TTable, в котором содержаться данные какому компоненту какой выполнить метод. эта моя компонента как бы является рассыльщиком, в который в свое время приходят данные из централизованного источника. вот поэтому я и ищу и нахожу нужную компоненту, чтобы выполнить конкретный метод. По другому пока реализацию не вижу, и так будет работать, как я уже описал выше, но хочется услышать что посоветуют другие
Defunct (2004-09-18 20:13:00) [9]> всё также через FindComponent, сначала через Application нахожу форму которой принадлежит компонент, а потом через форму получаю ссылку через опять же FindComponent, благо ничто не лежит в контейнерах... Есть у кого-то другие более продвинутые идеи?
Идеи будут сразу, как только мы услышим цель вышепроделанного.
Понимаете, я себе вообще не могу представить ситуации в которой нельзя обойтись без поиска компонентов по имени. Для меня такая ситуация равносильна использованию Label Goto и т.п. васиковских методов.
lord vader (2004-09-18 20:13:00) [10]использовать массив не представляется возможным, компоненты иногда создаются динамически и заранее ничего не известно. возиться с массивом и его каждый раз синхронизировать мне не удобно, тем более процессорное время для меня не существенно вообще
Alx2 (2004-09-18 20:10:00) [11]>lord vader (18.09.04 20:06) [7]
А про задачу свою можете рассказать в полной мере, темный джедай :) ?
Просто пока нет информации для раздумий.
lord vader (2004-09-18 20:06:00) [12]Я делаю так, может это и тупо и кто-то подскажет более красивый и экономичный вариант:
всё также через FindComponent, сначала через Application нахожу форму которой принадлежит компонент, а потом через форму получаю ссылку через опять же FindComponent, благо ничто не лежит в контейнерах... Есть у кого-то другие более продвинутые идеи?
Alx2 (2004-09-18 19:54:00) [13]>lord vader (18.09.04 19:46) [4]
Внешний пользователь вашего приложения знает о реализации его функциональности во всех деталях? Не проще ли представить интерфейс, не открывая его реализацию?
Defunct (2004-09-18 19:54:00) [14]lord vader (18.09.04 19:46) [4]
Так не легче, блин, сделать массив указателей на компонеты! ;)
в нем и искать. Да и лучше искать по коду (номеру) а не по имени. А лучше вообще сразу указатель использовать, пусть те данные, которым требуется обновиться, напрямую пишутся в TTable.
PS: бредовейшая затея - искать по имени компонента, это еще и медленно... Данные должны быть независимыми от визульных элементов. Может лучше расскажете задачу, да что-нить дельное посоветуем?
lord vader (2004-09-18 19:46:00) [15]А вот нафиг! Нужно! В приложение поступает поток данных, среди которых название компонент у которых нужно менять какие-то свойста... У меня это TTable в основном.
Defunct (2004-09-18 18:48:00) [16]lord vader (18.09.04 11:51)
Нафиг это нужно?
Приложение, же ваше. Какой смысл там искать какие-то компоненты? Абсурд какой-то.
lord vader (2004-09-18 12:37:00) [17]Так не пойдет, уже пробовал. Мне из головной формы(mainform) нужно получить полную ссылку(форма.компонента), а таким способом насколько я знаю можно найти только компонент на текущей форме. Или я не прав?
На самом деле это очень срочно, заранее благодарен за ответ.
Алхимик (2004-09-18 12:15:00) [18]FindComponent ?