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

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Ответить
Rastchepkin
незнакомец
Сообщения: 5
Зарегистрирован: 10.10.2010 17:17:24

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

Сообщение Rastchepkin »

1) Почему когда в процедуре обращаешься к стринггриду, лейблу или еще к чему-нибудь вылетает ошибка типа " Identifier not found *** "? как это исправить?
2) Объявляю в uses еще 1 unit, в var объявляю вторую форму, но вылетает ошибка "Identifier not found ***"
3)как правильно объявить процедуру в private или public?
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

1. Потому что компоненты на форме — это не глобальные переменные. Нужно указывать форму.
2. Ничего не понятно. Пример?
3. Процедуры (которые не методы) не бывают private или public.

http://www.freepascal.org/docs-html/ref/ref.html
Polugut
новенький
Сообщения: 19
Зарегистрирован: 25.02.2010 22:50:29

Сообщение Polugut »

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

Если правильно понял, надо вторую форму подключить, с доступом к ее компонентам? Объявите не в usue, а в implementation
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение 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, тем более что на этом форуме давали ссылки как минимум на две, обе доступны для свободного скачивания.
Ответить