Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 127

/ вопрос открыт /

Думаю вы мне поможете.
Так вот, начал я писать программку на delphi и решил прикрепить к ней DLL-ку (т.к. будет очень много повторяющихся процедур, а размещать их в exe-шнике не хочеться). Мои процедуры будут работать с компонентами на форме - допустим a:= StrToInt(edit1.text) + StrToInt(edit2.text); label1.caption:=IntToStr(a);
но у меня нечего не получаеться.... общие принцыпы создания и вызова библиотеки я знаю..... но похоже что не всё. Помогите мне пожайлусто!

Друщенко Денис Юрьевич Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Друщенко Денис Юрьевич (статус: Посетитель)
Вопрос отправлен: 6 октября 2006, 19:25
Состояние вопроса: открыт, ответов: 3.

Ответ #1. Отвечает эксперт: Вадим К

Вы наверное не совсем представляете для чего нужны dll. Туда нужно выносить процедуры и функции, которые не зависят от компонентов на форме. Иначе теряется всё прелесть dll. Работать с dll с компонентами формы можно, но подводных камней там стоко, что необерёшся.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 6 октября 2006, 20:01
Оценка за ответ: 4

Комментарий к оценке: спасибо! думаю тогда я буду помещать эти процедуры в exe-шнике

Ответ #2. Отвечает эксперт: ANBsoft

Есть некоторые тонкости при передаче в DLL данных типа String.
Сейчас все не помню (давно с этим сталкивался), но там приходилось использовать борландовскую библиотеку borlndmm.dll (на компьютерах где не установлен Делфи), а в раздел USES добавить Sharemem.
Приведу кусок своего:
uses
ShareMem, SysUtils, Windows, Classes;
Если не использовать длинные строки - этих проблем нет.

Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 7 октября 2006, 18:46
Оценка за ответ: 4

Комментарий к оценке: Спасибо!

Ответ #3. Отвечает эксперт: Alex Van Glukhman

Здравствуйте, Друщенко Денис Юрьевич!

Хочется ответить экспертам ответившим на данный вопрос - DLL может хранить кроме исполняемого кода различного рода рессурсы в том числе и саму форму приложения. Тип переменных и констант не ограничен - такой же раздел uses с подключаемыми модулями.
Теперь отвечаю своим собственным примером.
1.Создаём библиотеку DLL
- File->New->Other->DLL Wizard
Удаляем весь код и пишем:
library MyLib;
uses
SysUtils,
Classes, StdCtrls ;
{$R *.res}
function CalcSum(a, b: TEdit): Integer;
begin
Result:=StrToInt(a.Text)+StrToInt(b.Text);
end;
exports
CalcSum;
end.
Компилируем и строим - DLL готов
2.Далее создаём проект с формой кидаем Label1: TLabel; Edit1, Edit2: TEdit; Button1: TButton;
К проекту подключаем библиотеку DLL Project->Add To Project - указываем путь к библиотеке.

Вот код модуля формы:

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function CalcSum(a,b: TEdit): Integer;

var
Form2: TForm2;

implementation

{$R *.dfm}
function CalcSum; external 'MyLib';

procedure TForm2.Button1Click(Sender: TObject);
begin
Label1.Caption:=IntToStr(CalcSum(Edit1,Edit2));
end;

end.

Всё работает без каких то глюков со строками и т.д
Удачи

Ответ отправил: Alex Van Glukhman (статус: 7-ой класс)
Время отправки: 11 октября 2006, 14:33
Оценка за ответ: 5

Комментарий к оценке: огромное спасибо! это то что я хотел увидеть!

Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 8 октября 2006, 16:11; участников в обсуждении: 1.
ANBsoft

ANBsoft (статус: Студент), 8 октября 2006, 16:11 [#1]:

Приведу куски своего кода из рабочего проекта.
library Nakladn;

uses
ShareMem, SysUtils;
{$R *.RES}
Type
PNaklStrukt=^TNaklStrukt;

Procedure PrintNakl(DataNakl:PNaklStrukt);
Begin
//Текст процедуры
End;

Exports
PrintNakl Name 'PrintNakl';

begin

end.

И вызов ее из основной программы:
Procedure TFormNakladn.PrintNow(NaklType:Integer);
Type TNaklProc=Procedure(DataNakl:PNaklStrukt);
Var hLib:THandle;
NaklProc:TNaklProc;
Begin
if FileExists('Nakladn.dll') then begin
hLib:=LoadLibrary(PChar('Nakladn.dll'));
if hLib<32 then begin
Application.MessageBox(PChar('Ошибка загрузки драйвера печати накладной. Код ошибки '+IntToStr(GetLastError)),PChar('Ошибка'),mb_Ok);
Exit;
end;
NaklProc:=TNaklProc(GetProcAddress(hLib,'PrintNakl'));
NaklProc(@MyNakl.DataNakl);
FreeLibrary(hLib);
end
else
Application.MessageBox(PChar('Не найден драйвер печати накладной.'),PChar('Ошибка'),mb_Ok);
End;
Примерно так. В примере DLL содержит процедуру печати накладной, не зависящую от основного модуля программы.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:50
Выполнено за 0.02 сек.