Страница 1 из 1

Накопилось много вопросов. По поводу процедур и форм.

СообщениеДобавлено: 27.11.2010 11:25:00
Rastchepkin
1) Почему когда в процедуре обращаешься к стринггриду, лейблу или еще к чему-нибудь вылетает ошибка типа " Identifier not found *** "? как это исправить?
2) Объявляю в uses еще 1 unit, в var объявляю вторую форму, но вылетает ошибка "Identifier not found ***"
3)как правильно объявить процедуру в private или public?

Re: Накопилось много вопросов. По поводу процедур и форм.

СообщениеДобавлено: 27.11.2010 11:36:07
Иван Шихалев
1. Потому что компоненты на форме — это не глобальные переменные. Нужно указывать форму.
2. Ничего не понятно. Пример?
3. Процедуры (которые не методы) не бывают private или public.

http://www.freepascal.org/docs-html/ref/ref.html

Re: Накопилось много вопросов. По поводу процедур и форм.

СообщениеДобавлено: 27.11.2010 13:50:36
Polugut
Rastchepkin писал(а):2) Объявляю в uses еще 1 unit, в var объявляю вторую форму, но вылетает ошибка "Identifier not found ***"

Если правильно понял, надо вторую форму подключить, с доступом к ее компонентам? Объявите не в usue, а в implementation

Re: Накопилось много вопросов. По поводу процедур и форм.

СообщениеДобавлено: 27.11.2010 15:03:19
Odyssey
Важно понять различие между процедурами и методами. Процедуры (и функции) -- самостоятельные элементы, а методы -- это процедуры (или функции), включённые в состав классов.
Код: Выделить всё
type
  MyClass = class
    procedure Sum(A, B: Integer); // это метод
  end;
procedure Sum(A, B: Integer); // а это процедура

Кроме методов, в классах могут быть переменные, которые в этом случае называются полями.
Код: Выделить всё
type
  TForm1 = class(TForm)
    Label1: TLabel; // это поле класса TForm1
  end;
var
  Form1: TForm; // а это глобальная переменная

Rastchepkin писал(а):1) Почему когда в процедуре обращаешься к стринггриду, лейблу или еще к чему-нибудь вылетает ошибка типа " Identifier not found *** "? как это исправить?

Потому что стринггрид, лейбл и т.п. -- это поля формы, т.е. они внутри класса формы. Выхода два
1. сделать процедуру методом того же класса, т.е. включить её туда же, где находятся поля.
2. оставить процедуру, и указывать, где находятся стринггрид, лейбл и т.п., например Form1.Label1, как предложил Иван Шихалев.
Rastchepkin писал(а):2) Объявляю в uses еще 1 unit, в var объявляю вторую форму, но вылетает ошибка "Identifier not found ***"

Модули (юниты) не объявляют, это не переменные. Их создают и используют. Чтобы получить модуль с формой, нужно создать новую форму а модуль для неё Lazarus создаст автоматически. При этом переменная формы уже будет объявлена в новом модуле, и объявлять её где-то ещё уже не нужно. После этого файлы модуля (pas) и формы (lfm) нужно сохранить (например, в папку проекта). Имя, под которым сохранили модуль, можно добавлять в uses других модулей, т.е. использовать новый модуль из других.
Rastchepkin писал(а):3)как правильно объявить процедуру в private или public?

Нужно сделать её методом:
Код: Выделить всё
TMyClass = class
private
  procedure MyPrivateProcedure();
public
  procedure MyPublicProcedure();
end;

Чем путаться в понятиях, проще приложить пример и спросить почему не работает. И кстати, было бы полезно для начала почитать какую-нибудь книжку по Lazarus или Delphi, тем более что на этом форуме давали ссылки как минимум на две, обе доступны для свободного скачивания.