Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/55: Рейтинг темы: голосов - 55, средняя оценка - 4.78
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615

Объявление функций и процедур. Как правильно объявлять?

13.11.2017, 23:38. Показов 12169. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как правильно объявлять?

Вот например я создаю свою функцию(я не знаю чем отличается functions от procedure, кроме того, что в процедуре не нужно ничего возвращать):

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
unit Unit1;
 
interface
 
uses
  Windows, Messages, Dialogs, Classes, Forms, StdCtrls, Controls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1OnClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure Tttt();
begin
  ShowMessage('Копка нажата');
end;
 
procedure TForm1.Button1OnClick(Sender: TObject);
begin
  Tttt(); // <<<<<<<<<<<
end;
 
end.
Оно работает, когда функция описана выше, чем используется.

Нужно ли совать её в private?
Просто не очень удобно листать то вверх, то вниз, и лучше было бы, чтобы функция была ниже события нажатия кнопки.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
unit Unit1;
 
interface
 
uses
  Windows, Messages, Dialogs, Classes, Forms, StdCtrls, Controls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1OnClick(Sender: TObject);
  private
    procedure Tttt();
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
 
procedure TForm1.Button1OnClick(Sender: TObject);
begin
  Tttt(); // <<<<<<<<<<<
end;
 
procedure Tttt();
begin
  ShowMessage('Копка нажата');
end;
 
end.
При этом вылезает ошибка:
Delphi
1
[DCC Error] Unit1.pas(13): E2065 Unsatisfied forward or external declaration: 'TForm1.Tttt'
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.11.2017, 23:38
Ответы с готовыми решениями:

Объявление функций - в каком месте кода объявлять собственные функции
Здравствуйте. Еще раз всех с наступившим. Появилась пара вопросов, наверное очень глупых по языку. Итак, первый. Пишу обычный...

Как правильно объявлять массивы
У меня вопрос: Я видел объявления массивов, где в скобках писались нолики и еденицы В теме про объявление, заполнение и т. д. никакой...

Как правильно объявлять ArrayList?
Готовлюсь к прохождению собеседования, на хабре где то вычитал, что правильно объявлять так List ggg = new ArrayList(); а не так ...

12
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
14.11.2017, 01:54
Лучший ответ Сообщение было отмечено артист как решение

Решение

Цитата Сообщение от артист Посмотреть сообщение
я не знаю чем отличается functions от procedure, кроме того, что в процедуре не нужно ничего возвращать
А больше они и ничем не отличаются. Ну разве кроме неявного, но вполне логичного замечания, что функцию всегда можно вызвать как процедуру. Компилятор возражать не будет. А вот процедуру никак нельзя вызвать как функцию!
P.S.
А по поводу всего остального в энный раз настоятельно советую купить/украсть учебник по Дельфи/Паскалю. Ибо у вас во втором варианте кода ошибка вовсе не из-за того что и где описано. Давно пора научиться различать методы класса и регулярные процедуры.
1
 Аватар для krapotkin
6851 / 4677 / 1465
Регистрация: 14.04.2014
Сообщений: 20,674
Записей в блоге: 21
14.11.2017, 05:44
Лучший ответ Сообщение было отмечено артист как решение

Решение

методы объекта имеют доступ ко всем полям объекта "напрямик"
просто процедуры и функции обращаются к ним через сам объект

чаще всего, если уж вы пишете в делфи, где все построено на ООП, нужно создавать методы форм, а не простые процедуры
тогда принципиально все равно, где ее объявить, ведь главное объявление будет в объявлении самого класса формы
1
Фриланс Pascal/Delphi etc
 Аватар для ILinker
67 / 73 / 16
Регистрация: 25.11.2016
Сообщений: 263
14.11.2017, 06:38
Лучший ответ Сообщение было отмечено артист как решение

Решение

Так будет работать:

Delphi
1
2
3
4
procedure TForm1.Tttt();
begin
  ShowMessage('Копка нажата');
end;
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
14.11.2017, 07:24  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
в энный раз настоятельно советую купить/украсть учебник по Дельфи/Паскалю
Он очень неудобный, и там ничего не найдёшь.
Я гуглил, и видимо просто не заметил, что имя класса должно быть перед функцией.

--------------------------------------------------------------------------------------------------------

А можно без формы описать эти функции, чтобы вызывать их как есть, а не через класс?
0
Модератор
 Аватар для D1973
9929 / 6467 / 2457
Регистрация: 21.01.2014
Сообщений: 27,423
Записей в блоге: 3
14.11.2017, 08:41
Цитата Сообщение от артист Посмотреть сообщение
А можно без формы описать эти функции, чтобы вызывать их как есть, а не через класс?
Утащите их в отдельный модуль, объявите их в секции interface этого модуля, сам модуль пропишите в секции uses оставшихся модулей проекта, в которых будут эти функции использоваться
1
Фриланс Pascal/Delphi etc
 Аватар для ILinker
67 / 73 / 16
Регистрация: 25.11.2016
Сообщений: 263
14.11.2017, 13:50
Конечно можно, главное чтобы эти функции были объявлены до их использования.

Delphi
1
2
3
4
5
6
7
8
9
procedure Tttt();
begin
  ShowMessage('Копка нажата');
end;
 
procedure TForm1.Button1OnClick(Sender: TObject);
begin
  Tttt(); // <<<<<<<<<<<
end;
1
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
14.11.2017, 21:23
Цитата Сообщение от артист Посмотреть сообщение
А можно без формы описать эти функции, чтобы вызывать их как есть, а не через класс?
ошибкаа так нет
найдите 7 отличий
1
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
14.11.2017, 21:25
и почитайте учебник, ибо
Цитата Сообщение от артист Посмотреть сообщение
там ничего не найдёшь.
есть брехня

Добавлено через 1 минуту
это называется "предварительное объявление". когда ты описываешь методы в классе, это тоже самое предварительное объявление
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
14.11.2017, 21:26  [ТС]
DenNik, Вот про это я и спрашивал, спасибо. ))

А на счёт литературы, как я могу найти то, что не знаю как называется? (про предварительное).
Перед тем как создать эту тему, я гуглил - "делфи объявление функций".
И везде было одно и тоже, суйте пишут в классы.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
14.11.2017, 22:04
Цитата Сообщение от артист Посмотреть сообщение
А на счёт литературы, как я могу найти то, что не знаю как называется?
потому что базовые знания получают не путем выхватывания кусков, а при помощи последовательного чтения литературы для начинающих. а обретя базовые знания, ты получишь доступ к перку "изучение наперед", то бишь будешь способен найти то, о чем не знаешь, но догадываешься (или хотя бы сумеешь об этом правильно спросить)

сужу по собственному опыту

Добавлено через 13 минут
артист, живейший пример. я в соседней теме задал вопрос о директивах компилятора, а через некоторое время вспомнил, что когда-то сталкивался с понятием "условная компиляция". опираясь на это, я без труда нашел ответ на свой вопрос )
1
15.11.2017, 00:37

Не по теме:

Цитата Сообщение от DenNik Посмотреть сообщение
сужу по собственному опыту
Аналогично. Только учебников в моё время еще не было в доступе. Только хелп на забугорном :)

0
Фриланс Pascal/Delphi etc
 Аватар для ILinker
67 / 73 / 16
Регистрация: 25.11.2016
Сообщений: 263
15.11.2017, 16:28
артист

Можно ещё использовать предварительное описание функции через директиву forward:

Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure Tttt(); forward;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   Tttt(); // <<<<<<<<<<<
end;
 
procedure Tttt();
begin
  ShowMessage('Êîïêà íàæàòà');
end;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.11.2017, 16:28
Помогаю со студенческими работами здесь

Как правильно объявлять массивы?
Добрый день, помогите разобраться пожалуйста, объявление массива такого вида на С# private float GeomObject = new float; Пробую...

Как правильно объявлять переменные?
Здравствуйте, перед тем как писать что то наподобие &quot;google в помощь&quot; скажу что на разных сайтах написано по разному! Собственно говоря...

Как правильно объявлять классы
Предположим, есть класс .box, который будет использоваться только в div-ах. Как вы его объявите в стилях, как .box или все же как div.box? ...

Указатели. Как правильно объявлять
Я не пойму, почему в указательях звезду ставят то после пробела (пример1), то до (пример2) //пример1 int n = 6; // Объявление...

Как правильно объявлять struct переменную?
Как правильно объявлять? str one или struct str one; #include &lt;iostream&gt; using namespace std; struct str { int a; int b; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru