![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
![]() В программе : Вызываю процедуру в которой создается массив TLabel с последующим переименованием, завершаю процедуру, и при попытке обратится к одной из созданных TLabel Компилятор указывает на то что созданные мною MyLabel не задикларированны. Как быть?
|
#2
|
||||
|
||||
![]() Искать нужный компонент по имени :
Код:
var lbl : TLabel; ................... lbl := TLabel(FindComponent('имя_нужного_лейбла')); Не профи, но и не чайник ![]() ![]() |
#3
|
|||
|
|||
![]() Цитата:
не прокатывает, так же ругается на отсутствие LB1 компонента всписке. |
#4
|
||||
|
||||
![]() Gad99, в качестве имени нужно указывать вот это
Код:
LabelAr[k].Name := 'MyLabel'+inttostr(k); Не профи, но и не чайник ![]() ![]() |
#5
|
|||
|
|||
![]() У вас небольшая путаница в голове, вызванная работой в 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; Вот в таком вот аксепте ![]() |
#6
|
|||
|
|||
![]() Что то я совсем запутался.
Разве при выполнении процедуры по созданию массива меток они не появляются на фрейме? Text это фрейм. Что конкретно нужно сделать что бы задумка сработала, обявлять массив глобальным ??? |
#7
|
|||
|
|||
![]() Цитата:
Код:
LabelAr[k].Parent := Text.Panel1; Код:
with TLabel.Create(Self) do begin ... Parent := Text.Panel1; end; Цитата:
Но если вы будете искать метки по имени, то массив вам вообще не нужен. Поиск, строго говоря, работает, конечно, дольше прямого обращения, но вряд ли вы создадите столько меток, чтобы это стало заметным. Вы бы написали какую задачу-то пытаетесь решить? Может и не нужен там массив совсем, а мы тут мучаемся. |
#8
|
|||
|
|||
![]() Как вы создаете метки и как обращаетесь?
|
#9
|
|||
|
|||
![]() Вот так создаю
Код:
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; |
#10
|
||||
|
||||
![]() Вот вам нормальный код создания лейблов.
Код:
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; Не профи, но и не чайник ![]() ![]() |
#11
|
|||
|
|||
![]() Компилятор ругается вот на это:
l := Text.FindComponent('MyLabel1'); Incompatible TLabel и TComponent ![]() |
#12
|
|||
|
|||
![]() Ну да, это я приведение типов забыл поставить. Вот так нужно:
Код:
l := TLabel(Text.FindComponent('MyLabel1')); |