|
Вопрос # 149/ вопрос решён / |
|
Приветствую!
Столкнулся с таким вопросом:
Нужно каким-то образом получить доступ к свойствам компонента в Run-timе. Во время разработки имя этого компонента не известно (оно генерируется итерацией).
Конкретнее: надо переместить TImage в определённую точку (TImage'ей на форме много и у всех имена "card1", "card2", "card3"...)
Пробывал через FindComponent, но он возвращает TComponent, и у меня не получаеться его переместить.
Что делать?
 |
Вопрос задал: Евгений Козаченко (статус: 2-ой класс)
Вопрос отправлен: 30 октября 2006, 19:19
Состояние вопроса: решён, ответов: 4.
|
Ответ #1. Отвечает эксперт: Dron
Здравствуйте, Евгений Козаченко!
Всё верно - через FindComponent(). Он возвращает TComponent, а его нужно использовать как нужный компонент. Вот пример:
TImage(FindComponent('card1')).Left:=300;
Таким образом, этот самый TComponent можно преобразовать к любому нужному объекту (TButton, TEdit и т.д.) Главное - быть уверенным, что найденный компонент является тем же классом, в который будет преобразован.
Удачи!
 |
Ответ отправил: Dron (статус: Студент)
Время отправки: 30 октября 2006, 20:04
Оценка за ответ: 5
Комментарий к оценке: Спасибо.
|
Ответ #2. Отвечает эксперт: Новаковский Юрий Аврамович
Здравствуйте, Евгений Козаченко!
Эксперт Dron ответил правильно, но предлагаю Вам использовать лучший вариант преобразовния типа:
операции is и as.
(FindComponent('card1') as TImage).Left:=300;
или
with FindComponent('card1') as TImage do
begin
Left:=300;
Right:=150;
......
......
end;
Если надо проверить является ли компонент
Timage -
if Form1.Components[5] is TImage
then //является
else //не является;
Удачи Вам!
Ответ #3. Отвечает эксперт: Матвеев Игорь Владимирович
Здравствуйте, Евгений Козаченко!
Предыдущие ответы, конечно, верны и Вы можете ими воспользоваться, но мне кажется лучше создать массив указателей на создаваемые компоненты и обращаться к ним напрямую. Это будет и быстрее, и "правельнее" во всех отношениях См. Код.
Приложение: Переключить в обычный режим- ........
- var
- Form1: TForm1;
- Imgs : array[1..5] of TImage;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.Button1Click(Sender: TObject);
- var
- i : Integer;
- begin
- Randomize;
- for i := 1 to 5 do
- begin
- Imgs[i] := TImage.Create(Self);
- Imgs[i].Left := Random(Width);
- Imgs[i].Top := Random(Height);
- end;
- end;
- ...........
 |
Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 1 ноября 2006, 06:01
Оценка за ответ: 3
Комментарий к оценке: Спасибо. Но первый вариант меня вполне устроил. Ваш вариант, по моему "трудоёмкее", хотя и более правильный.
|
Ответ #4. Отвечает эксперт: Alex Van Glukhman
Здравствуйте, Евгений Козаченко!
Я полагаю что в данном случае присутствует ошибка динамического создания объекта, т.е. создаётся экземпляр класа TImage c полным набором свойств и методов, но некоторым ключевым свойствам не присвоено начальное значение в данном случае свойство Name в RunTime. Вот пример с другим объектом который я написал для следующего вопроса,
но аналогия та же.
Приложение: Переключить в обычный режим- unit MnFrm
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants,
- Classes, Graphics, Controls, Forms, Dialogs,
- StdCtrls;
-
- type
- TForm1 = class(TForm)
- Button1: TButton;
- procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y:
Integer);
- procedure Button1Click(Sender: TObject);
- private
-
- public
-
- end;
-
- var
- Form1: TForm1;
- btn: TButton;
-
- implementation
- {$R *.dfm}
-
- procedure TForm1.FormMouseDown(Sender: TObject;
- Button: TMouseButton; Shift: TShiftState;
- X, Y: Integer);
- begin
- //Если есть
экземпляр
кнопки то
уничтожили
- if Assigned(btn) then btn.Free;
- //Создаём
- btn:=TButton.Create(self);
- //Родитель
форма
- btn.Parent:=Form1;
- btn.Name:='btn';
- //Координаты
кнопки -
координаты
клика mouse
- btn.Left:=X;
- btn.Top:=Y;
- //Ну и
назначаем
Caption, т.к. кнопка
наследует
- //все
свойства
методы и
события
класса TButton
- btn.Caption:='Кнопка';
- end;
-
- procedure TForm1.Button1Click(Sender: TObject);
- var
- btn1: TButton;
- cmp: TComponent;
- begin
- try
- cmp:=FindComponent('btn');
- Form1.Caption:=cmp.Name;
- (cmp as TButton).Left:=0;
- (cmp as TButton).Top:=0;
- except
- ShowMessage('Сначала
кликните
мышью'#13#10+
-
'где-нибудь
на форме!!!');
- end;
-
- end;
 |
Ответ отправил: Alex Van Glukhman (статус: 7-ой класс)
Время отправки: 2 ноября 2006, 14:05
Оценка за ответ: 3
|
Мини-форум вопроса
Всего сообщений: 0.
31 января 2011, 19:58: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|