Здравствуйте, Гость
Среда, 20.09.2017, 04:17
Главная Главная страница форума Регистрация Вход
Новые сообщения Участники форума Правила форума Поиск
Страница 1 из 11
Модератор форума: stalker, Ekz 
Форум » Все о Delphi » Начинающим » Создание своей процедуры. (ну вот как-то так.)
Создание своей процедуры.
DublДата: Среда, 20.10.2010, 01:11 | Сообщение # 1
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
У меня есть мысли, но в кучу никак собрать их не могу. В идеале я бы хотел иметь .pas файл моей процедуру который где-то находится в директории Делфи и в любой программе может вызываться как стандартная Делфовская. Как минимум я бы хотел, чтобы это был так же файл .pas в папке с проектом и тоже вызывался как стандартный с входными параметрами.

Мои размышления, исходя из знаний:
1. Мы создаем файл pas в котором как обычно пишем процедуру которою хотим превратить в как-бы стандартную(я не знаю как это называется).
2. Мы после, к примеру procedure VKlogin пишем в скобках локальные параметры, например (http:TIdHTTP; uns, s, cook:String;); .(только я как бы cook получаю уже в итоге процедуры, ее нужно здесь описывать?)
3. Пишем соответственно код процедуры.
4. Затем вызываем ее уже из сторонней программы, например begin VKlogin(idhttp1, xx, zz, cookie); (вот тут я опять погорячился наверное, cookie на выходе)

Посмотрите пожалуйста где я не прав, и как сделать такую процедуру как-бы стандартную, которую можно будет вызвать из любого проекта всегда, как например, эмм... Inc(N) пускай будет.

И вот еще, я получаю в процедуре какую-то переменную, которую мне нужно будет использовать в программе, ее все-таки стоит описывать в локальных и глобальных параметрах или как-то иначе? Блин, запутался)))

Сообщение отредактировал Dubl - Среда, 20.10.2010, 01:15
 
skycarДата: Четверг, 21.10.2010, 00:57 | Сообщение # 2
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Для таких целей надо создать модуль, описать в интерфейном разделе свои методы и реализовать их соответсвенно в разделе реализации (соотв. секции interface и implementation).
Пример можно глянуть в таком модуле, например, как StrUtils.pas. Как создать свой модуль: File -> New -> Unit, после этого в соотв. секциях надо описать заголовки методов, и их реализации. После создания модуля: Tools -> Environment options -> Library (вкладка) -> клик на Library path. Выбираешь любой путь в списке, нажимаешь кнопку с тремя точками внизу. Выбираешь директорию, где у тебя твой модуль хранится, и нажимаешь Add. После этого понажимать везде Ok. В принципе всё. После этого, чтоб юзать модуль, надо подключать его в секцию uses как и стандартные модули и писать где надо вызов процедур или функций. Всё ясно? wink
 
DublДата: Четверг, 21.10.2010, 01:00 | Сообщение # 3
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Все предельно ясно. Спасибо))
 
skycarДата: Четверг, 21.10.2010, 01:21 | Сообщение # 4
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Насчёт переменной: если значение используется только в пределах подпрограммы, то она должна быть локальной. Если надо использовать в пределах одного модуля, можно объявить переменную сразу после implementation. Чтоб переменная была доступна и по всему модулю, и в других модулях, объявляй её в интерфейсной секции.
Зачем это нужно? Это хороший стиль программирования. Переменная должна быть глобальной, если это действительно надо. Иначе можно запутаться в названиях, объявив глобальную и локальные переменные с одинаковыми именами, тогда трудно будет искать ошибку.
 
DublДата: Пятница, 22.10.2010, 22:03 | Сообщение # 5
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
В общем пожалуй снова обращусь, в целом, все, что вы описали работает, но тут есть один нюанс, а именно:

// Коды модуля и программы в конце поста.

1. Я, значит, все правильно создал, но если у меня процедура находилась в самой программе, переменная resultLOG в программа была объявлена как глобальная string, то у меня этот resultLOG(куда записывался рез-т авторизации) был в процедуре, и, собственно говоря, в процедуре нажатия клавиши я добавлял в мемо строку с этим параметром. Все было отлично. Да, или же я делал сразу в процедуре без resultLOG, сразу писал рез-т в мемо.

2. Но когда я resultLOG в новом модуле объявил как локальную переменную, и все запустил, то попросту, рез-т не записывается в мемо. ХОТЯ!!! 100% результат есть, я просниффил работу программы и получил ответ как всегда с pos('http://vkrugudruzei.ru/exit.asp', c)<>0.

В чем проблема? Я уже как только не пробовал)) Хелп))

Мой Модуль.

Code

unit druzlib;

interface
uses Classes,Windows, Messages, SysUtils, Variants,  Graphics, Controls, Forms,
    Dialogs, ExtCtrls, StdCtrls, OleCtrls, ComCtrls,syncobjs,
    IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,UrlMon,
    IdMultipartFormData, activex,wininet,StrUtils, ShellApi, Registry,winsock;

procedure druzLOG(login:string; password:string; comp:TIdHTTP; resultLOG:string);

implementation

procedure druzLOG(login:string; password:string; comp:TIdHTTP; resultLOG:string);
var s:TStringList; c:string;
begin
s := TStringList.Create;
comp:=TIdHTTP.Create(nil);
comp.HandleRedirects:= True;
s.add('ref=');
s.add('login='+login);
s.add('password='+password);
s.add('Ok=Войти');
C:=comp.post('http://vkrugudruzei.ru/login.asp', s);
if pos('http://vkrugudruzei.ru/exit.asp', c)<>0 then
resultLOG:=('Все хорошо. Авторизация прошла.')
else resultLOG:=('Все плохо. Авторизация не прошла.');
comp.Free;
s.Free;
end;

end.

Программа.

Code

unit Unit1;

interface

uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
    IdHTTP, StdCtrls, druzlib;

type
    TForm1 = class(TForm)
      Edit1: TEdit;
      Edit2: TEdit;
      Button1: TButton;
      Memo1: TMemo;
      IdHTTP1: TIdHTTP;
      Label2: TLabel;
      Label3: TLabel;
      procedure Button1Click(Sender: TObject);
    private

    public
      { Public declarations }
    end;

var
    Form1: TForm1;
    resultLOG:string;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var resultlg:string;
begin
druzLOG(Edit1.text, Edit2.text, idhttp1, resultlg);
memo1.Lines.add(resultlg);
end;

end.


Сообщение отредактировал Dubl - Пятница, 22.10.2010, 22:04
 
skycarДата: Пятница, 22.10.2010, 23:45 | Сообщение # 6
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Терь у меня пару вопросов: для чего в твоём модуле столько в секции uses подключений других модулей? ShellAPI, Registry и т. д. Ведь нигде не используются в твоём модуле ни методы, ни типы данных из них, а подключение некоторых из них заметно увеличивает размер екзешника. Надо оставить там лишь те, что относятся к Инди, и те, что делфи добавляет по дефолту.
И опять же, зачем процедура с переменной, ежели можно сделать функцию, тогда можно обойтись без доп. переменных. Если возвращается какое-либо значение в результате, то лучше использовать функции, ничего не возвращается - тогда процедуру. В твоём примере можно сделать строковую функцию, её рез-тат будет строкой, содержащей состояние, а можно и логической, раз два значения - да или нет - истина или ложь.
И ещё, параметр с компонентом, как мне кажется, лишний. Лучше в методе создавать объект, а потом удалять его.

Code

function DruzLog(Login, Password: string): string; //соотв. в интерфейс. разд.

Code

function DruzLOG(Login, Password:string): string;
var s:TStringList; c:string;
  Comp: TIdHTTP;
begin
  Result:='';
s := TStringList.Create;
comp:=TIdHTTP.Create(nil);
comp.HandleRedirects:= True;
s.add('ref=');
s.add('login='+login);
s.add('password='+password);
s.add('Ok=Войти');
C:=comp.post('http://vkrugudruzei.ru/login.asp', s);
if pos('http://vkrugudruzei.ru/exit.asp', c)<>0 then
Result:='Все хорошо. Авторизация прошла.' // строке необязательны скобки
else Result:='Все плохо. Авторизация не прошла.';
comp.Free;
s.Free;
end;

Затем юзаем функцию

Code

  Memo1.Lines.Add(DruzLog(Edit1.Text, Edit2.Text));
 
DublДата: Суббота, 23.10.2010, 00:20 | Сообщение # 7
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Code
Терь у меня пару вопросов: для чего в твоём модуле столько в секции uses подключений других модулей? ShellAPI, Registry и т. д. Ведь нигде не используются в твоём модуле ни методы, ни типы данных из них, а подключение некоторых из них заметно увеличивает размер екзешника. Надо оставить там лишь те, что относятся к Инди, и те, что делфи добавляет по дефолту.

Да да, щас исправлю, я просто копировал из другой библиотеки, и вот забыл убрать))

Так. А по поводу строковой функции ясно все, я опять забыл, спасибо, теперь так буду юзать. А на счет параметра с компонентом, как бы то есть я не выкидываю компонент на форму, а программно его создаю comp:=TIdHTTP.Create(nil); этим? То есть вообще можно не выкидывать его на форму или что это означает?

Сорри, я всех способов еще не знаю, стараюсь делать из каких-то кусков, или по каким-то шаблонам.

Добавлено (23.10.2010, 00:20)
---------------------------------------------
ДА! ДА! Спасибо огромное, учту на будующее, что подобные "Штуки"(эмм... ну... цели) нужно реализовывать функциями строковыми или логическими. Спасибо.

 
skycarДата: Суббота, 23.10.2010, 00:33 | Сообщение # 8
Ранг 6
Группа: Проверенные
Сообщений: 116
Награды: 5
Репутация: 31
Статус: Offline
Quote (Dubl)
Так. А по поводу строковой функции ясно все, я опять забыл, спасибо, теперь так буду юзать. А на счет параметра с компонентом, как бы то есть я не выкидываю компонент на форму, а программно его создаю comp:=TIdHTTP.Create(nil); этим? То есть вообще можно не выкидывать его на форму или что это означает?

Да, именно. Компонент необязательно выкидывать на форму, можно его создавать в методе, использовать и там же удалять, как в нашем случае wink
 
DublДата: Суббота, 23.10.2010, 00:45 | Сообщение # 9
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
Идеально. Огромное спасибо. Вот и сегодня я узнал много нового))
 
Форум » Все о Delphi » Начинающим » Создание своей процедуры. (ну вот как-то так.)
Страница 1 из 11
Поиск:

Copyright DelphiDevelop.ru © 2008-2017
Хостинг от uCoz