Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 948
от 09.10.2007, 03:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 465, Экспертов: 80
В номере:Вопросов: 3, Ответов: 7


Вопрос № 104125: Привет всем!Вопрос у меня конечно делитанта, но я хочу разобраться в чём принципиальная разница между функцией и процедурой и когда(в каких случаях) лучше использовать то или другое?...
Вопрос № 104153: Help, чуваки!!! Очень срочно, как кнопкой отменить предыдущую процедуру, вызваную другой кнопкой?...
Вопрос № 104174: Добрый день! Столкнулся с такой проблемой, попробую описать сразу на примере: запущена некая программа (например project.exe), которая выставляет в трей свою иконку и полностью туда сворачивается. Вопрос: как найти координаты (x, y на экране)...

Вопрос № 104.125
Привет всем!Вопрос у меня конечно делитанта, но я хочу разобраться в чём принципиальная разница между функцией и процедурой и когда(в каких случаях) лучше использовать то или другое?
Отправлен: 03.10.2007, 10:27
Вопрос задал: Gaz (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Архангельский Андрей Германович
Здравствуйте, Gaz!

Функция возвращает значение
Процедура выполняет действие над чем-то
---------
Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 03.10.2007, 10:43
Оценка за ответ: 4

Отвечает: Лукьяненко Алексей Валериевич
Здравствуйте, Gaz!

Принципиальная разница в том, что у фукнкции есть результат - то есть после ее выполнения Вы можете использовать результаты ее работы для вызова другой подпрограммы (к примеру).
Процедура не имеет возвращаемого результата. Функцию можно использовать как процедуру - то есть никак не использовать ее результат - но только если включена опция компилятора "Extended syntax".
Пример использования функции:

Form1.Caption := IntToStr(ParamCount) + ' ' + ParamStr(0);

Здесь 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);

y:=Adder(2.7, 5.4);
writeln('2.7+5.4= ',y:5:2);
readln;
end.
Ответ отправил: 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
Комментарий оценки:
Спасибо за пример, очень хорошая функция!


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.60.10 от 27.09.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное