Создание своей процедуры. |
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 как и стандартные модули и писать где надо вызов процедур или функций. Всё ясно?
|
|
| |
|
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); этим? То есть вообще можно не выкидывать его на форму или что это означает? Да, именно. Компонент необязательно выкидывать на форму, можно его создавать в методе, использовать и там же удалять, как в нашем случае
|
|
| |
|
Dubl | Дата: Суббота, 23.10.2010, 00:45 | Сообщение # 9 |
Ранг 3
Группа: Проверенные
Сообщений: 73
Награды: 0
Репутация: 0
Статус: Offline
| Идеально. Огромное спасибо. Вот и сегодня я узнал много нового))
|
|
| |
|