Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование формы в dll, Лезут ошибки. Поделитесь опытом! 
:(
    Опции темы
DimW
Дата 14.2.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: нет
Всего: 44



Всем привет!!!
Есть пример взятый из умной книжки, я его проверил работает:

готовим форму которя будет импортирована в dll:

Код

unit Unit_Dll;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, MemDS, DBAccess, Ora, Grids, DBGridEh;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
function ShowFormInDLL(name: string): TModalResult;
implementation uses ShareMem;

{$R *.dfm}
function ShowFormInDLL(name: string): TModalResult;
begin
Form1:= TForm1.Create(Application);
Form1.Caption:= name;
Result:= Form1.ShowModal;
Form1.Free;
end;
end.


сама dll:

Код

library Project2;

uses
  ShareMem,
  SysUtils,
  Classes,
  Unit_Dll in 'Unit_Dll.pas' {FormInDLL};

{$R *.res}
exports ShowFormInDLL;
begin
end.


и форма из которой вызываем dll:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBAccess, Ora;

type
  TForm_Main = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form_Main: TForm_Main;

implementation

{$R *.dfm}
function ShowFormInDLL(name: string):TModalResult;
external 'Project2.dll';
procedure TForm_Main.Button1Click(Sender: TObject);
begin
ShowFormInDLL('FormInDLLName');
end;
end.


после некоторых своих модификацый кода лезут ошибки, собственно модификации(поменял только ShowFormInDLL(name: string) на ShowFormInDLL(Session_Id: TOraSession)):

! готовим форму которя будет импортирована в dll:

Код

unit Unit_Dll;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, MemDS, DBAccess, Ora, Grids, DBGridEh;

type
  TForm1 = class(TForm)
    OraQuery1: TOraQuery;
    Button1: TButton;
    DBGridEh1: TDBGridEh;
    OraDataSource1: TOraDataSource;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
function ShowFormInDLL(Session_Id: TOraSession): TModalResult;
implementation

{$R *.dfm}
function ShowFormInDLL(Session_Id: TOraSession): TModalResult;
begin
Form1:= TForm1.Create(Application);
Form1.OraQuery1.Session:= Session_Id;
Result:= Form1.ShowModal;
Form1.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
OraQuery1.Close;
OraQuery1.Open;
end;
end.


! сама dll:

Код

library Project2;

uses
  SysUtils,
  Classes,
  Forms,
  Windows,
  Unit_Dll in 'Unit_Dll.pas' {FormInDLL};

{$R *.res}
exports ShowFormInDLL;
begin
end.


! и форма из которой вызываем dll:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBAccess, Ora;

type
  TForm_Main = class(TForm)
    Button1: TButton;
    OraSession1: TOraSession;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form_Main: TForm_Main;

implementation

{$R *.dfm}
function ShowFormInDLL(Session_Id: TOraSession):TModalResult;
external 'Project2.dll';
procedure TForm_Main.Button1Click(Sender: TObject);
begin
ShowFormInDLL(OraSession1);
end;
end.


ошибки лезут при попытке сделать Form1.Free формы из dll(exeption EInvalidPointer in module Project2.dll) и при закрытии Form_Main(память неможет быть read).

Вобщем надеюсь на вашу помошь!!!
Спасибо!

Это сообщение отредактировал(а) DimW - 14.2.2006, 14:42
PM MAIL ICQ   Вверх
Romikgy
Дата 14.2.2006, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Цитата(DimW @ 14.2.2006, 13:39 Найти цитируемый пост)
TOraSession;

А что это , мож через указатель его надо?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Akella
Дата 14.2.2006, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



допустим, что fmApartAdd - это форма в DLL

из модуля убери

var
fmApartAdd: TfmApartAdd <-этотнужно убрать!!

TfmApartAdd - форма, которую нужно создать

и создавай форму так
Код

...
  public
    { Public declarations }

    procedure ClearControls();
    procedure CreateParams(var Params: TCreateParams); override;

    property AMetodEdit : boolean read fAMetodEdit write FAMetodEdit;//добавление или редактирование

  end;

  procedure CallEditApart(ID:integer;AEditMode:Boolean;iBaseType:Integer);

implementation

uses uDM, Math, uPhotoStretch, StrUtils, uFoundedPhones;

{$R *.dfm}

procedure CallEditApart(ID:integer;AEditMode:Boolean;iBaseType:Integer);
Const
 aSQL = 'select id, Name from types where id = :id';
Var
 vName:variant;
begin
  with TfmApartAdd.Create(Application) do
  begin
    //что-то можно определять
    if id = 10 then ...
    if AEditMode then ...
и т.д.

//в самом конце вызываем метод Show
    Show;
  end;//with
end;



в событии OnClose
Код

procedure TfmApartAdd.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;


использование

Код

//  в другом модуле
implementation

uses uApartAdd;

{$R *.dfm}



//где-то в модуле по нажатию кнопки
//просто вызываем эту функцию, т.к. она видна безо всякиз Form1. ...
CallEditApart(10,True, 20);

можно хоть 10 раз вызвать подряд
будут созданы 10 одинаковых форм, независимых друг от друга


надеюсь то, что нужно

если да, то благодарить можно не только меня а и Alex`а. smile

Это сообщение отредактировал(а) Akella - 14.2.2006, 15:40
PM MAIL   Вверх
DimW
Дата 15.2.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: нет
Всего: 44



Цитата(Akella @ 14.2.2006, 15:38 Найти цитируемый пост)
можно хоть 10 раз вызвать подряд
будут созданы 10 одинаковых форм, независимых друг от друга


не к этому стремлюсь...

проблема описана здесь - http://forum.vingrad.ru/index.php?showtopic=83197

нужно что бы форма вызванная из dll держала сессию к БД основной формы.
впринцыпе все получилось, за исключением непонятных мне ошибок!!!
поэтому и пишу сюда т.к. ошибки явно не связаны с БД.

Цитата(Romikgy @ 14.2.2006, 15:18 Найти цитируемый пост)
Цитата(DimW @ 14.2.2006, 13:39 )
TOraSession;


А что это , мож через указатель его надо?


есть компонента OraSession типа TOraSession которая соединяется с БД.
да мне кажется пофиг что передовать string или TOraSession, но в том вся и беда что когда передаю string все нормально, а когда TOraSession, лезут ошибки!
Help!!!

PM MAIL ICQ   Вверх
DimW
Дата 15.2.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: нет
Всего: 44



Цитата(Romikgy @ 14.2.2006, 15:18 Найти цитируемый пост)
А что это , мож через указатель его надо?


А как? smile

PM MAIL ICQ   Вверх
Romikgy
Дата 15.2.2006, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 26
Всего: 146



Скинул бы ссылку на эти компоненты Ora , я бы хелп их полистал, а так
Код

function ShowFormInDLL(Session_Id: ^TOraSession): TModalResult;

типа такого чтот.


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Vas
Дата 15.2.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 4
Всего: 28



Почитай книгу М.Фленов "Программирование глазами хакера" про плугины там написано разберешься и
сделаешь без проблем. Как раз там используется хранение формы в длл, причем эта форма с твоей основной сможет делать что ей позволишь. У меня MDI приложение в статусбаре встроен ProgressBar так вот любая форма из длл может заполнять этот прогресс бар когда делает что-то долгое smile

Книга кстати была на форуме в разделе книг, не найдешь давай мыло кину.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
DimW
Дата 15.2.2006, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: нет
Всего: 44



Цитата(Vas @ 15.2.2006, 17:07 Найти цитируемый пост)
Книга кстати была на форуме в разделе книг, не найдешь давай мыло кину.


[email protected]
PM MAIL ICQ   Вверх
Snowy
Дата 15.2.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484




M
Snowy
Обсуждение книг Флеонова - оффтоп.
Т.к. эти книги не имеют отношения к программированию.

PM MAIL   Вверх
Vas
Дата 15.2.2006, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 4
Всего: 28



Цитата(Snowy @ 15.2.2006, 17:18 Найти цитируемый пост)
Т.к. эти книги не имеют отношения к программированию.

Хм... интересно это как?



--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Snowy
Дата 15.2.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Vas @ 15.2.2006, 19:46 Найти цитируемый пост)
Хм... интересно это как?

Что здесь непонятного?
Если сантехник, ничего не понимающий в кулинарии учит тому, как печь пирог...
Также, ламер, ничего не понимающий в программировании учит писать на дельфи...
Это книги категории "перед прочтением сжечь".
Читать их не только не стоит, но и категорически не рекомендуется.
Соответственно, обсуждение оккультной литературе в разделах программирования, является оффтопом.
PM MAIL   Вверх
Akella
Дата 16.2.2006, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Попробуй так

Код

unit Unit_Dll;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, MemDS, DBAccess, Ora, Grids, DBGridEh;

type
  TForm1 = class(TForm)
    OraQuery1: TOraQuery;
    Button1: TButton;
    DBGridEh1: TDBGridEh;
    OraDataSource1: TOraDataSource;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
function ShowFormInDLL(Session_Id: TOraSession): TModalResult;
implementation

{$R *.dfm}
function ShowFormInDLL(Session_Id: TOraSession): TModalResult;
begin
Form1:= TForm1.Create(Application);
Form1.OraQuery1.Session:= Session_Id;
Result:= Form1.Show;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  action := caFree;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
OraQuery1.Close;
OraQuery1.Open;
end;
end.




PM MAIL   Вверх
DimW
Дата 16.2.2006, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: нет
Всего: 44



Vas, сапасибо большое за письмо и вложение!!!

спомощью твоего примера накотал небольшую програмулину - все работает, ошибок нет, вот только не доконца осмыслел материал, но это я думаю разгребу уже сам!

спасибо всем за помощь!!! smile
Добавлено @ 11:43
Цитата(Akella @ 16.2.2006, 09:19 Найти цитируемый пост)
Попробуй так

вобщем нет теперь ошибки после закрытия формы(dll), а при закрытии основного модуля осталась, при этом эсли вызывал dll то ошибка если нет то нормально.... smile
Akella, спасибо!!!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1241 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.