скрыть

скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Google  
 

Имя свойства в течение выполнения программы



Если бы строители строили здания так же, как программисты пишут программы, первый залетевший дятел разрушил бы цивилизацию.


If ( Sender is TLabel ) then.. 

или, если вам заранее известен тип объекта, то можно так:


TLabel( Sender ).Caption 

Чтобы получить доступ к имени, воспользуйтесь одним из приведенных ниже примеров. Пример:


formname:=(myform as tobject).name; 

или


formname:=(myform as tcontrol).name; 

Это должно работать. Причина того, что этого не хочет делать сама Delphi в том, что у нее есть определенные элементы управления, у которых нет специфического имени и, следовательно, компилятор должен проверять каждый вызов для проверки его валидности.

Если вы используете свойство ClassName подобно этому:


with Sender as TForm do
  Label1.Caption := copy(ClassName,2,length(ClassName)-1);

Это даст желаемый эффект без дополнительного кодирования в обработчике формы OnCreate.

'Sender' может и не быть формой, которую вы пытаетесь обработать, и ваша программа получит исключительную ситуацию, сообщающую о неверном приведении типа. Я не уверен в том, что содержание (если оно есть) Sender в действительности является самой формой.

По крайней мере, от этого вы можете защититься сами, заключив в скобки вызов с приведением типа, и сделав предварительно простую проверку на нужный тип:


If Sender is TForm then
  Label1.Caption := (Sender as TForm).Name ;

Это в случае, если вы пытаетесь выполнить следующее:


Label1.Caption := Form1.Name ;

Это целый сонм проблем. Я читал, что при исполнении этого кода или не доступно свойство Form (во время выполнения программы), или, что чаще, возникает заблуждение относительно инициализируемого класса (вернее, его имени, Form1). Если вы тщательно читали документацию по Delphi, то наверняка заметили тот факт, что установка свойства в Инспекторе Объектов (Object Inspector) НЕ означает его автоматическую установку во время выполнения программы. Чтобы с честью выбраться из этой ситуации, необходимо явно установить свойство (в нашем случае свойство .Name) в методе фомы .Create. Это может выглядеть приблизительно так:


procedure TForm1.Create( Sender : TObject ) ;
begin
  Form1.Name := 'Form1' ;
end ;

procedure TForm1.Button1Click( Sender : TObject ) ;
begin
  Label1.Caption := Form1.Name ;
end ;


var
  TC: TComponent;
begin
  TC := label1.Owner;
  label1.Caption := TC.ClassName;
end;

К своей форме я добавил кнопку, и в обработчике нажатия на нее я записал следующий код:


name := 'AName';

Затем, после щелчка на кнопке, я мог бы щелкнуть на форме, и заголовок метки изменился бы на 'AName'. Решением может служить определение свойcтва Name в обработчике события создания формы. Т.е., если вы назвали форму именем MyForm, то в обработчике события OnCreate вы должны написать следующее:


name := 'MyForm';

Это решит вашу проблему, а я закругляюсь.






Copyright © 2004-2016 "Delphi Sources". Delphi World FAQ




Группа ВКонтакте   Ссылка на Twitter   Группа на Facebook