|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Обращение к динамическим компонентам
В программе : Вызываю процедуру в которой создается массив TLabel с последующим переименованием, завершаю процедуру, и при попытке обратится к одной из созданных TLabel Компилятор указывает на то что созданные мною MyLabel не задикларированны. Как быть?
|
#2
|
||||
|
||||
Искать нужный компонент по имени :
Код:
var lbl : TLabel; ................... lbl := TLabel(FindComponent('имя_нужного_лейбла')); Не профи, но и не чайник . D6 - лучше не придумали. Пока. |
#3
|
|||
|
|||
Как вы создаете метки и как обращаетесь?
|
#4
|
|||
|
|||
Вот так создаю
Код:
procedure TForm1.CreateLabel (x : integer); var LabelAr : array of TLabel; k : byte; Begin For k := 1 to x do Begin SetLength(LabelAr,k); LabelAr[k] := TLabel.Create(self); LabelAr[k].Name := 'MyLabel'+inttostr(k); LabelAr[k].Left := 50; LabelAr[k].Top :=k * 50; LabelAr[k].Parent := Text.Panel1; End; End; Код:
CreateLabel(1); Text.MyLabel1.Caption := 'hello'; Text.MyLabel1.Left := (Text.Panel1.Width - Text.MyLabel1.Width)Div 2; |
#5
|
|||
|
|||
Цитата:
не прокатывает, так же ругается на отсутствие LB1 компонента всписке. |
#6
|
||||
|
||||
Gad99, в качестве имени нужно указывать вот это
Код:
LabelAr[k].Name := 'MyLabel'+inttostr(k); Не профи, но и не чайник . D6 - лучше не придумали. Пока. |
#7
|
|||
|
|||
У вас небольшая путаница в голове, вызванная работой в IDE Delphi. Объясню: при создании метки в design-time ей присваивается имя, например, 'Label1', и одновременно в теле класса формы IDE создает переменную, указывающую на эту ссылку и называет переменную так же - Label1. Потом, если вы дадите метке другое имя, IDE автоматически переименует переменную. Но это все делает IDE, это не является функциональностью языка Delphi.
При работе в run-time от того, что вы дали компоненту метки имя 'Label1' переменная Label1 не появляется. Все переменные вам нужно объявлять явно. Еще раз посмотрим на ваш код: Код:
procedure TForm1.CreateLabel (x : integer); var LabelAr : array of TLabel; k : byte; Begin For k := 1 to x do Begin SetLength(LabelAr,k); LabelAr[k] := TLabel.Create(self); LabelAr[k].Name := 'MyLabel'+inttostr(k); LabelAr[k].Left := 50; LabelAr[k].Top :=k * 50; LabelAr[k].Parent := Text.Panel1; End; End; Дальше вы пытаетесь обратится к метке, используя имя, которое вы присвоили, в качестве переменной. Компилятор не обнаруживает такой переменной и сообщает вам об ошибке. Чтобы найти метку по имени, как совершенно правильно тут написали, нужно вызвать FindComponent: Код:
var L: TLabel; begin ... L := Text.FindComponent('MyLabel1'); if L <> nil then ... ... end; Вот в таком вот аксепте |
#8
|
|||
|
|||
Что то я совсем запутался.
Разве при выполнении процедуры по созданию массива меток они не появляются на фрейме? Text это фрейм. Что конкретно нужно сделать что бы задумка сработала, обявлять массив глобальным ??? |
#9
|
||||
|
||||
Вот вам нормальный код создания лейблов.
Код:
procedure TForm1.CreateLabel(X : Integer); var l : TLabel; begin while X > 0 do begin l := TLabel.Create(Self); l.Name := 'MyLabel' + IntToStr(X); l.Left := 50; l.Top := X * 50; l.Parent := Text.Panel1; Dec(X); end; end; Код:
var l : TLabel; ................................ CreateLabel(1); l := Text.FindComponent('MyLabel1'); if l <> nil then begin l.Caption := 'hello'; l.Left := (Text.Panel1.Width - l.Width)Div 2; end; Не профи, но и не чайник . D6 - лучше не придумали. Пока. |
#10
|
|||
|
|||
Цитата:
Код:
LabelAr[k].Parent := Text.Panel1; Код:
with TLabel.Create(Self) do begin ... Parent := Text.Panel1; end; Цитата:
Но если вы будете искать метки по имени, то массив вам вообще не нужен. Поиск, строго говоря, работает, конечно, дольше прямого обращения, но вряд ли вы создадите столько меток, чтобы это стало заметным. Вы бы написали какую задачу-то пытаетесь решить? Может и не нужен там массив совсем, а мы тут мучаемся. |
#11
|
|||
|
|||
Компилятор ругается вот на это:
l := Text.FindComponent('MyLabel1'); Incompatible TLabel и TComponent |
#12
|
|||
|
|||
Ну да, это я приведение типов забыл поставить. Вот так нужно:
Код:
l := TLabel(Text.FindComponent('MyLabel1')); |
#13
|
|||
|
|||
У меня тема дипломной работы "Разработка конкретной обучающей программы"
Создаю текстовый файл с методическим материалом откудава текст буду загружать в эти самые TLabel, количество которых будет зависеть от количества текста. |
#14
|
|||
|
|||
Ну так и загружайте текст сразу при создании метки, зачем к ней второй раз-то обращаться? Там же где создаете, напишите "Caption := ...".
|
#15
|
|||
|
|||
Просто помимо мет.материала сначало будет название темы, предмета ну и т.д.
чтото l := TLabel(Text.FindComponent('MyLabel1')); возвращает NIL, при этом компонент на фрейме появляется и имеет имя MyLabel1 Последний раз редактировалось Gad99, 15.03.2008 в 17:56. |