![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; |