Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.05.2009, 12:08
WinnyThePooh WinnyThePooh вне форума
Прохожий
 
Регистрация: 16.02.2009
Сообщения: 31
Репутация: 10
Вопрос Доступ к компоненту по имени

На форме лежит несколько однотипных компонент (например, TEdit). Имена компонент известны и хранятся, например, в массиве строк.
Каким образом получить доступ (например, изменить его свойство .Text) к конкретному компоненту по его имени при переборе в цикле имен из массива?
Ответить с цитированием
  #2  
Старый 25.05.2009, 12:44
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Воспользуйтесь приведением типов.
Код:
procedure TForm24.FormCreate(Sender: TObject);
begin
 if TComponent(Sender).Name = 'Button1' 
 then begin
        ShowMessage('Нажата кномпочка');
        end;
end;
Или если нужно присвоить значение .Text компоненту типа TEdit на форме:
Код:
procedure TForm24.FormCreate(Sender: TObject);
begin
 if Sender is TEdit 
 then begin
        TEdit(Sender).Text := 'Нажата кномпочка';
        end;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 25.05.2009 в 12:49.
Ответить с цитированием
  #3  
Старый 25.05.2009, 12:59
WinnyThePooh WinnyThePooh вне форума
Прохожий
 
Регистрация: 16.02.2009
Сообщения: 31
Репутация: 10
Счастье не совсем то...

К сожалению, изменять значение свойств мне надо не при создании формы или событии в объекте (когда есть sender), а процедуре (в данном случае - загрузке значения полей из внешнего файла), при которой происходит перебор списка (точнее, в данном конкретном случае, двух списков - кода поля в файле и названия объекта TEdit, куда это значения надо загрузить) и поиск значения в файле и при нахождении его - присвоения его свойству соответствующего объекта.
IMHO, тут надо что-то типа:

Код:
type
  TAnyEdit=class (TEdit);
...
var
  strCtrlName, strText: string;
  AnyEdit: TAnyEdit;
...
  strCtrlName:='Edit1';
  strText:='Этот текст должен появится в поле';
  AnyEdit.name:=strCtrlName;
  AnyEdit.text:=strText;
, но так не работает, ругается, что нельзя присваивать name и т.п.
Что-то, возможно, пройдет с указателями, но тут, увы, знаний не хватает ...

Последний раз редактировалось WinnyThePooh, 25.05.2009 в 13:55.
Ответить с цитированием
  #4  
Старый 25.05.2009, 15:44
Аватар для GLFox
GLFox GLFox вне форума
Прохожий
 
Регистрация: 11.10.2005
Сообщения: 26
Репутация: 10
По умолчанию

Вот, например, функция, которая по имени компонента вида "ParentComponent.SomeChild.Etc" возвращает объект:
Код:
function GetComponent(AOwner: TComponent; sFullName: String;
  var sNameRest: String): TComponent;
var
  iDot0, iDotX: Integer;
  Cmpnt: TComponent;
begin
  Result:=nil;  if sFullName='' then Exit;
  iDot0:=Pos('.',sFullName);
  if iDot0<=0 then iDot0:=$FFFFFF;
  Result:=AOwner.FindComponent(Copy(sFullName,1,iDot0-1));
  if Assigned(Result) then begin
    iDotX:=Length(sFullName);
    while iDotX>0 do begin
      if sFullName[iDotX]='.' then Break;
      Dec(iDotX);
    end;
    if iDotX>1 then begin
      Cmpnt:=GetComponent(Result,Copy(sFullName,iDot0+1,$FFFFFF),sNameRest);
      if Assigned(Cmpnt) then Result:=Cmpnt;
    end;  
  end else sNameRest:=sFullName;
end;
Не уверен в ее абсолютной работоспособности, но может поможет чем...
Можно использовать как-то так:
Код:
(GetComponent(Form1, 'Panel1.Edit1', sSomeString) as TEdit).Text = 'This is the Edit1';
Ответить с цитированием
  #5  
Старый 25.05.2009, 20:20
WinnyThePooh WinnyThePooh вне форума
Прохожий
 
Регистрация: 16.02.2009
Сообщения: 31
Репутация: 10
Счастье чего-то как-то сложно...

да уж... проще оператор case написать
А что нет RTTI методов или каких-то указателей на объект, которые можно найти/установить по имени объекта?
Ответить с цитированием
  #6  
Старый 25.05.2009, 20:28
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

У формы как потомка TComponent есть метод FindComponent.
Код:
var
  EditName: string;
  EditFound: TComponent;
begin
  EditName := 'Edit1';
  EditFound := FindComponent(EditName);
  if EditFound <> nil then
    (EditFound as TEdit).Text := 'blah-blah';
end;
Ответить с цитированием
  #7  
Старый 25.05.2009, 20:49
WinnyThePooh WinnyThePooh вне форума
Прохожий
 
Регистрация: 16.02.2009
Сообщения: 31
Репутация: 10
Хорошо Спасибо!

Вот это поудобнее будет.
Ответить с цитированием
  #8  
Старый 18.10.2009, 22:03
TopCore TopCore вне форума
Прохожий
 
Регистрация: 18.10.2009
Сообщения: 1
Репутация: 10
По умолчанию

Здравствуйте! Подскажите, пожалуйста, а как можно установить свойство Enable девяти кнопок SpeedButton, имеющих один GroupIndex, нажав другую с другим GroupIndex. Перебрать все компоненты я могу, но как потом у найденной кнопки свойство изменить?
Следующий мой код вообще не работает.
Код:
for i := 0 to ComponentCount - 1 do
    if (Components[i] is TsSpeedButton) and ((Sender as TsSpeedButton).GroupIndex = 2) then
        (Sender as TsSpeedButton).Enabled := true;

Последний раз редактировалось TopCore, 18.10.2009 в 22:11.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:31.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter