Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 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 //не является;
Удачи Вам!

Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс)
Время отправки: 31 октября 2006, 12:09
Оценка за ответ: 5

Ответ #3. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Евгений Козаченко!
Предыдущие ответы, конечно, верны и Вы можете ими воспользоваться, но мне кажется лучше создать массив указателей на создаваемые компоненты и обращаться к ним напрямую. Это будет и быстрее, и "правельнее" во всех отношениях См. Код.

Приложение:
  1. ........
  2. var
  3. Form1: TForm1;
  4. Imgs : array[1..5] of TImage;
  5.  
  6. implementation
  7.  
  8. {$R *.dfm}
  9.  
  10. procedure TForm1.Button1Click(Sender: TObject);
  11. var
  12. i : Integer;
  13. begin
  14. Randomize;
  15. for i := 1 to 5 do
  16. begin
  17. Imgs[i] := TImage.Create(Self);
  18. Imgs[i].Left := Random(Width);
  19. Imgs[i].Top := Random(Height);
  20. end;
  21. end;
  22. ...........


Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 1 ноября 2006, 06:01
Оценка за ответ: 3

Комментарий к оценке: Спасибо. Но первый вариант меня вполне устроил. Ваш вариант, по моему "трудоёмкее", хотя и более правильный.

Ответ #4. Отвечает эксперт: Alex Van Glukhman

Здравствуйте, Евгений Козаченко!

Я полагаю что в данном случае присутствует ошибка динамического создания объекта, т.е. создаётся экземпляр класа TImage c полным набором свойств и методов, но некоторым ключевым свойствам не присвоено начальное значение в данном случае свойство Name в RunTime. Вот пример с другим объектом который я написал для следующего вопроса,
но аналогия та же.

Приложение:
  1. unit MnFrm
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants,
  7. Classes, Graphics, Controls, Forms, Dialogs,
  8. StdCtrls;
  9.  
  10. type
  11. TForm1 = class(TForm)
  12. Button1: TButton;
  13. procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  14. procedure Button1Click(Sender: TObject);
  15. private
  16.  
  17. public
  18.  
  19. end;
  20.  
  21. var
  22. Form1: TForm1;
  23. btn: TButton;
  24.  
  25. implementation
  26. {$R *.dfm}
  27.  
  28. procedure TForm1.FormMouseDown(Sender: TObject;
  29. Button: TMouseButton; Shift: TShiftState;
  30. X, Y: Integer);
  31. begin
  32. //Если есть экземпляр кнопки то уничтожили
  33. if Assigned(btn) then btn.Free;
  34. //Создаём
  35. btn:=TButton.Create(self);
  36. //Родитель форма
  37. btn.Parent:=Form1;
  38. btn.Name:='btn';
  39. //Координаты кнопки - координаты клика mouse
  40. btn.Left:=X;
  41. btn.Top:=Y;
  42. //Ну и назначаем Caption, т.к. кнопка наследует
  43. //все свойства методы и события класса TButton
  44. btn.Caption:='Кнопка';
  45. end;
  46.  
  47. procedure TForm1.Button1Click(Sender: TObject);
  48. var
  49. btn1: TButton;
  50. cmp: TComponent;
  51. begin
  52. try
  53. cmp:=FindComponent('btn');
  54. Form1.Caption:=cmp.Name;
  55. (cmp as TButton).Left:=0;
  56. (cmp as TButton).Top:=0;
  57. except
  58. ShowMessage('Сначала кликните мышью'#13#10+
  59. 'где-нибудь на форме!!!');
  60. end;
  61.  
  62. end;


Ответ отправил: Alex Van Glukhman (статус: 7-ой класс)
Время отправки: 2 ноября 2006, 14:05
Оценка за ответ: 3


Мини-форум вопроса

Всего сообщений: 0.

31 января 2011, 19:58: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 24 августа 2017, 02:06
Выполнено за 0.05 сек.
Рейтинг@Mail.ru