Вопрос № 104125: Привет всем!Вопрос у меня конечно делитанта, но я хочу разобраться в чём принципиальная разница между функцией и процедурой и когда(в каких случаях) лучше использовать то или другое?...Вопрос № 104153: Help, чуваки!!! Очень срочно, как кнопкой отменить предыдущую процедуру, вызваную другой кнопкой?...Вопрос № 104174: Добрый день!
Столкнулся с такой проблемой, попробую описать сразу на примере: запущена некая программа (например project.exe), которая выставляет в трей свою иконку и полностью туда сворачивается.
Вопрос: как найти координаты (x, y на экране)...
Вопрос № 104.125
Привет всем!Вопрос у меня конечно делитанта, но я хочу разобраться в чём принципиальная разница между функцией и процедурой и когда(в каких случаях) лучше использовать то или другое?
Отправлен: 03.10.2007, 10:27
Вопрос задал: Gaz (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Архангельский Андрей Германович
Здравствуйте, Gaz!
Функция возвращает значение
Процедура выполняет действие над чем-то
--------- Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Отвечает: Лукьяненко Алексей Валериевич
Здравствуйте, Gaz!
Принципиальная разница в том, что у фукнкции есть результат - то есть после ее выполнения Вы можете использовать результаты ее работы для вызова другой подпрограммы (к примеру).
Процедура не имеет возвращаемого результата. Функцию можно использовать как процедуру - то есть никак не использовать ее результат - но только если включена опция компилятора "Extended syntax".
Пример использования функции:
Здесь IntToStr, ParamCount, ParamStr - системные функции Delphi.
При использовании процедур добиться такой записи невозможно.
P.S. В языке C (все SDK для Windows использую именно C) нет процедур, есть только функции. Но при этом у некоторых тип возвращаемого результата void (неопределенный) и по своей сути они являются эквивалентом процедур Паскаля.
Ответ отправил: Лукьяненко Алексей Валериевич (статус: 9-ый класс)
Ответ отправлен: 03.10.2007, 10:44 Оценка за ответ: 5 Комментарий оценки: Спасибо за достаточно подробный ответ
Отвечает: Coupler
Здравствуйте, Gaz!
Вообще-то как в процедуре, так и в функции можно возвратить результат, передав не значение переметра, а адрес. Часто так делают, когда в процедуру нужно передать переменную большого размера, например, массив. Кроме того, так можно вернуть больше одного значения.
Приложение:
Ответ отправил: Coupler (статус: Практикант)
Ответ отправлен: 03.10.2007, 13:33 Оценка за ответ: 5 Комментарий оценки: спасибо за дополнение
Отвечает: C. Junta
Здравствуйте, Gaz!
Процедуры и функции - это разновидности подпрограмм, функция отличается от процедуры тем, что она умеет возвращать значение (результат своего действия)
Процедуры используются когда в нескольких частях программы надо выполнить одно и то же действие. Например, несколько раз вывести строку из символов "*".
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
procedure starline();
var
i: integer;
begin
for i:=1 to 20 do
write('*');
end;
begin
{ TODO -oUser -cConsole Main : Insert code here }
starline();
writeln;
starline();
readln;
end.
В этой программе 2 раза печатается строка из 20 символов "*". Это самый простой пример, который удалось придумать :)
Что же касается функций, то возвращаемое ею значение можно присвоить переменной того же типа, что и функция. В качестве примера можно привести любую библиотечную функцию суммирующую свои параметры. Надеюсь, из кода станет понятней ;)
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
function Adder(n1, n2: real): real;
begin
Adder:=n1+n2;
end;
var
x,y: real;
begin
{ TODO -oUser -cConsole Main : Insert code here }
x:=Adder(3,5);
writeln('3+5= ',x:5:2);
Ответ отправил: C. Junta (статус: 1-ый класс)
Ответ отправлен: 04.10.2007, 22:39 Оценка за ответ: 4 Комментарий оценки: Спасибо за ответ
Вопрос № 104.153
Help, чуваки!!! Очень срочно, как кнопкой отменить предыдущую процедуру, вызваную другой кнопкой?
Отправлен: 03.10.2007, 14:43
Вопрос задал: Axlash (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 14)
Отвечает: Stari
Здравствуйте, Axlash!
Написать код производящий противоположные действия
Перед запуской процедуры запоминаем значения которо=ые она изменяет и при отмене восстанавливаем их, а как ещё??
Ответ отправил: Stari (статус: 1-ый класс)
Ответ отправлен: 03.10.2007, 14:53
Отвечает: Boriss
Здравствуйте, Axlash!
Не думаю, что пишу ответ, но посоветовали здесь написать, чтобы Вы увидели.
Есть два варианта:
1) более простой: процедура, запускаемая по первой кнопке время от времени проверяет состояние второй. А еще лучше: есть глобальная переменная, значение которой изменяет вторая кнопка, а первая только проверяет значение.
2) более крутой: через потоки и их приоритеты.
Если нужна помощь, пишите в минифоруме. Поможем
--
ЗЫ: минифорумом можно пользоваться еще очень долгое время, даже когда ответы добавлять уже нельзя
--------- Вывод - то место в тексте, где вы устали думать
Ответ отправил: Boriss (статус: Профессор) Россия, Саранск Организация: mte WWW:Программирование на Паскале ---- Ответ отправлен: 04.10.2007, 15:19
Вопрос № 104.174
Добрый день!
Столкнулся с такой проблемой, попробую описать сразу на примере: запущена некая программа (например project.exe), которая выставляет в трей свою иконку и полностью туда сворачивается.
Вопрос: как найти координаты (x, y на экране) значка этой программы в трее?
Заранее спасибо!
Отправлен: 03.10.2007, 17:16
Вопрос задал: Red Spirit (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Denisss
Здравствуйте, Red Spirit!
Пример находится в приложенном к ответу файле.
В данном примере основные функции заложены в модуль "TrayPro.pas". Все, что нужно сделать - воспользоваться функцией function FindOutPositionOfIconDirectly(const a_hWndOwner: HWND; const a_iButtonID: Integer; var a_rcIcon : TPoint) : BOOL;
- hWndOwner - Handle окна, указанного при регистрации значка в трее (в примере - nid.Wnd);
- iButtonID - идентификационный номер кнопки. Также указывается при регистрации значка в трее (в примере - nid.uID);
- a_rcIcon - а это как раз положение курсора.
Функция возвращает True, если значок (и, соответственно, его координаты) найден и False в обратном случае.
В примере, при запуске программы создается значок в трее. При нажатии на кнопку "Нажми меня" курсор мыши перемещается к значку приложения в трее (точнее, к его левому верхнему краю).
Файл примера можно также скачать здесь: trayicondemo.zip [153 K] (Файл будет удален через 1 месяц после последнего скачивания).
Удачи!
Прикреплённый файл: Загрузить >> Срок хранения файла на сервере RusFAQ.ru составляет 30 суток с момента отправки ответа.
Ответ отправил: Denisss (статус: Профессионал) Россия, Москва ---- Ответ отправлен: 03.10.2007, 20:30 Оценка за ответ: 5 Комментарий оценки: Спасибо за пример, очень хорошая функция!