|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Доступ к компоненту по имени
На форме лежит несколько однотипных компонент (например, TEdit). Имена компонент известны и хранятся, например, в массиве строк.
Каким образом получить доступ (например, изменить его свойство .Text) к конкретному компоненту по его имени при переборе в цикле имен из массива? |
#2
|
||||
|
||||
Воспользуйтесь приведением типов.
Код:
procedure TForm24.FormCreate(Sender: TObject); begin if TComponent(Sender).Name = 'Button1' then begin ShowMessage('Нажата кномпочка'); end; end; Код:
procedure TForm24.FormCreate(Sender: TObject); begin if Sender is TEdit then begin TEdit(Sender).Text := 'Нажата кномпочка'; end; end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 25.05.2009 в 12:49. |
#3
|
|||
|
|||
не совсем то...
К сожалению, изменять значение свойств мне надо не при создании формы или событии в объекте (когда есть sender), а процедуре (в данном случае - загрузке значения полей из внешнего файла), при которой происходит перебор списка (точнее, в данном конкретном случае, двух списков - кода поля в файле и названия объекта TEdit, куда это значения надо загрузить) и поиск значения в файле и при нахождении его - присвоения его свойству соответствующего объекта.
IMHO, тут надо что-то типа: Код:
type TAnyEdit=class (TEdit); ... var strCtrlName, strText: string; AnyEdit: TAnyEdit; ... strCtrlName:='Edit1'; strText:='Этот текст должен появится в поле'; AnyEdit.name:=strCtrlName; AnyEdit.text:=strText; Что-то, возможно, пройдет с указателями, но тут, увы, знаний не хватает ... Последний раз редактировалось WinnyThePooh, 25.05.2009 в 13:55. |
#4
|
||||
|
||||
Вот, например, функция, которая по имени компонента вида "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
|
|||
|
|||
чего-то как-то сложно...
да уж... проще оператор case написать
А что нет RTTI методов или каких-то указателей на объект, которые можно найти/установить по имени объекта? |
#6
|
|||
|
|||
У формы как потомка 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
|
|||
|
|||
Спасибо!
Вот это поудобнее будет.
|
#8
|
|||
|
|||
Здравствуйте! Подскажите, пожалуйста, а как можно установить свойство 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. |