Консультация № 30476
29.11.2005, 21:19
0.00 руб.
0 12 12
Здравствуйте уважаемые эксперты. Как мне сделать чтобы в процедуре или функции написанной мной можно было напрямую использовать компоненты расположеные на форме? Может там куда-то что-то прописать надо? Например
procedure someproc;
begin
Edit1.Text := ‘Something‘;{выходит ошибка E2003 Undeclared identifier: ‘Edit1‘}
end;

Обсуждение

Неизвестный
29.11.2005, 21:30
общий
это ответ
Здравствуйте, Teapot!

Она же тебе написала - "Не знаю я кто-такой Edit1"

Если у тебя Edit1 находится в модуле Unit1 (например на Красной площади)
а процедура someproc находиться в модуле Unit2 (например во Владивостоке)
То нужно же как-то сказать процедуре (а точнее модулю Unit2) где находится Edit1, а также где находится Unit1
Неизвестный
29.11.2005, 21:31
общий
это ответ
Здравствуйте, Teapot!
Можно в функцию передать указатель на TForm и там дальше уже использовать массив контролов, и юзать их свойства.
Неизвестный
29.11.2005, 22:02
общий
это ответ
Здравствуйте, Teapot!
Да, кое-что надо добавить:
procedure TForm1.someproc;
begin
Edit1.Text := ‘Something‘;{выходит ошибка E2003 Undeclared identifier: ‘Edit1‘}
end;
Удачи!
Неизвестный
29.11.2005, 22:29
общий
это ответ
Здравствуйте, Teapot!
Нужно указывать объект-владелец Edit1: например, Form1 (переменная).
Тогда обращение в вашем случае буде выглядеть так:
Form1.Edit1.Text := ‘Something‘;
Неизвестный
30.11.2005, 05:34
общий
это ответ
Здравствуйте, Teapot!
Я знаю по крайней мере 2 способа:

1)Явно указать какой форме принадлежит тот или иной компонент.

2)Сначала объявить процедуру в разделе определения класса.
К названию процедуры прибавить Tform1. (в общем название класса формы), после этого внутри процедуры можно без проблем обращаться к компонентам формы и различным глобальным переменным юнита.

Пример смотрите в приложении. Соответствующие процедуры Somedo1 и Somedo2


Приложение:
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Edit1: TEdit; private procedure SomeDo2; { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}Procedure somedo1;begin form1.edit1.text:=‘123‘;end;Procedure Tform1.somedo2;begin edit1.text:=‘123‘;end;end.
давно
Мастер-Эксперт
425
4118
30.11.2005, 05:56
общий
это ответ
Здравствуйте, Teapot!
Либо введите Вашу процедуру или фцнкцию в состав класса формы:
TForm1 = class(TForm)
...
private
Procedure YourProc(s:string);
End;
Тогда все, что написано в Вашей процедуре можно оставить так, как есть.
Либо напрямую пишите имя формы в этой процедуре:
Form1.Edit1.Text:=‘Something‘;
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
30.11.2005, 08:02
общий
это ответ
Здравствуйте, Teapot!
Делфя тебе сказала, мол незадекларированный идентификатор переменной.
Надо объявлять переменные.
procedure someproc;
var
a : string; //Объявление переменной
begin
a:=Edit1.Text;
Edit1.Text := ‘Something‘;
end;
P.S Мой совет сначала выучи Turbo Pascal 7.0, а потом уже занимайся объектным програмиорванием.
Неизвестный
30.11.2005, 09:51
общий
это ответ
Здравствуйте, Teapot!
Необходимо немного подправить код:

procedure someproc;
begin
Form1.Edit1.Text := ‘Something‘;{выходит ошибка E2003 Undeclared identifier: ‘Edit1‘}
end;

Иначе процедура просто не видит контрола, который принадлежит форме.
Неизвестный
30.11.2005, 16:24
общий
это ответ
Здравствуйте, Teapot!
Для этого нужно указывать полное имя компонента. Ваш пример будет правильным так:
procedure someproc;
begin
<Имя Формы>.Edit1.Text := ‘Something‘;{выходит ошибка E2003 Undeclared identifier: ‘Edit1‘}
end;

Можно так:

procedure someproc;
begin
with <Имя Формы> do
begin
Edit1.Text := ‘Something‘;{выходит ошибка E2003 Undeclared identifier: ‘Edit1‘}
Edit1.Text := ‘Something‘;
Panel1.Button1.Caption := ‘OK‘
end;
end;

Неизвестный
30.11.2005, 16:36
общий
это ответ
<i>Здравствуйте, <b>Teapot</b>!</i>
Edit1 - это подкласс формы (Form1, например).
Ошибка происходит именно по этой проблеме. Т.к. Вы пытаетесь обратиться к Edit1 напрямую, а не через форму (Form1.Edit1).
Решения:
1. Обратиться к компоненту через форму: Form1.Edit1.Text
2. Создать процедуру someproc внутри класса формы:
<table border=1><tr><td>
<b>type</b> TForm1 = <b>class</b>(TForm)
  ...
  <b>protected</b>
    <b>procedure</b> Someproc;
  ...
<b>end;</b>
........
<b>procedure</b> Form1.Someproc;
<b>begin</b>
  Edit1.Text:= ‘Something‘;
<b>end;</b>
</td></tr></table>
3. Не совсем, конечно, ответ по теме, но несколько рекомендаций (все эти рекомендации Вы можете прочитать в статье Марко Канту "20 правил ООП в Delphi):
1) Называйте компоненты "говорящими" именами (не Edit1, Button1, а, например, edName, btnOK и т.д.);
2) Не обращайтесь к компонентам напрямую - обращайтесь к ним через свойства формы:
<table border=1><tr><td>
<b>type</b>
  TmyForm = <b>class</b>(TForm);
    edName: TEdit;
  <b>protected
    procedure</b> SetName(AValue: <b>string</b>);
    <b>function</b> GetName: <b>string</b>;
  <b>public
    property</b> Name: <b>string read</b> GetName <b>write</b> SetName;
  <b>end;</b>
........
procedure</b> MyForm.SetName(AValue: <b>string</b>);
<b>begin</b>
  edName.Text:= AValue;
<b>end;</b>

<b>function</b> MyForm.GetName: <b>string</b>;
<b>begin</b>
  Result:= edName.Text;
<b>end;</b>
</td></tr></table>
Это позволит Вам в дальнейшем перейти на использование любых типов компонентов (например, у которых будет не свойство Text, а свойство Caption).
Далее, в других местах Вы сможете обращаться к Edit так:
MyForm.Name:= ‘Имя‘;
strName:= MyForm.Name;
Неизвестный
30.11.2005, 16:56
общий
это ответ
Дело в том что Delphi не видит вашу процедуру.
К ней нужно обращатся через Tform1.someproc.
Смотри пример.

Приложение:
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Edit1: TEdit; procedure someproc; private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementationprocedure tform1.someproc;beginedit1.text:=‘text‘;end;{$R *.dfm}end.
Неизвестный
30.11.2005, 18:07
общий
это ответ
Здравствуйте, Teapot!
Необходимо писать Form1.Edit1.Text := ‘Something‘;
Форма ответа