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

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

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

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

Сообщение Rastchepkin » 27.11.2010 11:25:00

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

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

Сообщение Иван Шихалев » 27.11.2010 11:36:07

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

http://www.freepascal.org/docs-html/ref/ref.html
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

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

Сообщение Polugut » 27.11.2010 13:50:36

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

Если правильно понял, надо вторую форму подключить, с доступом к ее компонентам? Объявите не в usue, а в implementation
Polugut
новенький
 
Сообщения: 19
Зарегистрирован: 25.02.2010 23:50:29

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

Сообщение Odyssey » 27.11.2010 15:03:19

Важно понять различие между процедурами и методами. Процедуры (и функции) -- самостоятельные элементы, а методы -- это процедуры (или функции), включённые в состав классов.
Код: Выделить всё
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, тем более что на этом форуме давали ссылки как минимум на две, обе доступны для свободного скачивания.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru