Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.25;
Скачать: CL | DM;

Вниз

DLL немодальный вызов, MDI   Найти похожие ветки 

 
IntruderLab   (2008-03-13 16:00) [40]

Мне параметром ему хендл главной формы присваивать?


 
Сергей М. ©   (2008-03-13 16:07) [41]

О боже)...

Ты в состоянии средствами отладчика отсановиться на строчке

Result := LongInt(TfrmTest.Create(Application);

и посмотреть, чему равно значения Application.MainForm, Application.MainForm.Visible, Application.MainForm.FormStyle ?


 
IntruderLab   (2008-03-13 16:12) [42]

В состоянии :) Application = nil так что я думаю, что все остальное тоже nil


 
Сергей М. ©   (2008-03-13 16:18) [43]


> Application = nil


Да быть того не может !
Что угодно, но только не nil там должно быть.

Если, конечно же, над этим не потрудились твои очумелые ручки)


 
IntruderLab   (2008-03-13 16:22) [44]

Вот ShowMessage(Application.MainForm.Name) у меня frmMain, то есть как и должно быть


 
Сергей М. ©   (2008-03-13 16:24) [45]

Ну ?!

А говоришь nil)


> то есть как и должно быть


Еще должно быть Application.MainForm.FormStyle = fsMDIForm - давай, проверяй ...


 
IntruderLab   (2008-03-13 16:28) [46]

В вызове написал
if Application.MainForm.FormStyle = fsMDIForm then ShowMessage("1");
выскочило access violation


 
IntruderLab   (2008-03-13 16:32) [47]

Все нормально! теперь fsMdiForm


 
IntruderLab   (2008-03-13 16:33) [48]

Что дальше?


 
Сергей М. ©   (2008-03-13 16:34) [49]

А с чего ты взял, что причиной AV явилось именно Application=nil ?

Ты давай уже не мудри, а воспользуйся для проверки отладчиком)
А кустарщину с ShowMessage оставь для иных случаев)


 
Сергей М. ©   (2008-03-13 16:36) [50]


> Все нормально! теперь fsMdiForm


Ну раз fsMdiForm, то пробуй так:

Application.CreateForm("TfrmTest", frmTest);


 
IntruderLab   (2008-03-13 16:36) [51]

я такого не говорил, сейчас все нормально, Application.MainForm := frmMain;
Application.MainForm.FormStyle := fsMDIForm; Теперь как мне форму вызвать чтобы она стала дочерней, делаю как ранее:
frmTest := TfrmTest.Create(Application);
frmTest.FormStyle := fsMDIChild;
frmTest.Show;
он не ругается - но подвисает


 
Сергей М. ©   (2008-03-13 16:39) [52]


> frmTest.FormStyle := fsMDIChild;


Что мешает выставить FormStyle=fsMDIChild у формы прямо в дизайн-тайм ?


 
IntruderLab   (2008-03-13 16:40) [53]

Application.CreateForm(TfrmTest,frmTest); - программа просто висит - никаких реакций


 
Сергей М. ©   (2008-03-13 16:41) [54]


> frmTest.Show;


Это лишнее.

При создании MDIChild-формы она автоматически станет видимой


 
Сергей М. ©   (2008-03-13 16:43) [55]

Пробуй:

try
Application.CreateForm(TfrmTest,frmTest);
except
 on e:exception do ShowMessage(e.Classname + " " + e.Message);
end;

Что видишь ?


 
IntruderLab   (2008-03-13 16:44) [56]

никаких реакций, что я не так делаю :(


 
Сергей М. ©   (2008-03-13 16:45) [57]


> что я не так делаю


Приводи уже полный текст тестового dll-проекта ..


 
IntruderLab   (2008-03-13 16:48) [58]

После отлова exception вывалил debugger fault notification а перед этим висел :(


 
IntruderLab   (2008-03-13 16:49) [59]

почту или аську мож дашь чтобы не светить - можешь прислать на intruderlab@mail.ru


 
Сергей М. ©   (2008-03-13 16:52) [60]

Тебе что, сложно выложить тестовый проект здесь ?

Там всего-то два-три десятка строчек)


 
IntruderLab   (2008-03-13 16:58) [61]

не проблема :) выкладываю
unit UfrmMain;

interface

uses
 ShareMem, Windows, Messages, SysUtils,
 Variants, Classes, Graphics,
 Controls, Forms,
 Dialogs,
 ComCtrls, Menus,
 ADODB,
 DB,
 DBTables,
 SConnect,
 Sockets,
 DBClient,
 MConnect, StdCtrls, ImgList, jpeg, ExtCtrls,
 Registry, Buttons, OleCtrls, SHDocVw, IdBaseComponent, IdComponent,
 IdTCPConnection, IdTCPClient, IdMessageClient, IdSMTP, JvExStdCtrls,
 JvMemo, JvDotNetControls, JvExControls, JvComponent, JvEditorCommon,
 JvUnicodeEditor, JvUnicodeHLEditor, JvaScrollText, JvCheckBox,
 IdAntiFreezeBase, IdAntiFreeze, JvRichEdit,
 Consts, ConvUtils, Math, SyncObjs, ComObj, UfrmAbout, StrUtils,
 URemoteReadNews,
 URemoteKKMSettings,
 IdFTP,
 IniFiles, frxClass, JvEdit, ToolWin, DBCtrls, JvDBDotNetControls,
 JvScrollMax, JvExExtCtrls, Grids, JvListBox, ShellAPI, ActnList, Tabs;

type
 TfrmMain = class(TForm)
   status: TStatusBar;
   menu: TMainMenu;
   frmReg: TMenuItem;
   mnuLogOn: TMenuItem;
   mnuVvod: TMenuItem;
   mnuNotes: TMenuItem;
   mnuReports: TMenuItem;
   mnuOSV: TMenuItem;
   mnuNumerators: TMenuItem;
   mnuhLIST_FACTORY_FILIAL: TMenuItem;
   mnuhLIST_TYPE_DOCUMENTS: TMenuItem;
   mnuhLIST_DOCUMENT_NUMERATOR: TMenuItem;
   mnuhLIST_ROLE: TMenuItem;
   mnuWorkers: TMenuItem;
   iList: TImageList;
   mnuClientShow: TMenuItem;
   mnuTourOperators: TMenuItem;
   mnuShowDocuments: TMenuItem;
   mnuSettings: TMenuItem;
   mnuKKMServer: TMenuItem;
   mnuXReport: TMenuItem;
   mnuZReport: TMenuItem;
   tcp: TTcpClient;
   IdAntiFreeze1: TIdAntiFreeze;
   N6: TMenuItem;
   mnuCloseSeans: TMenuItem;
   N1: TMenuItem;
   ftp: TIdFTP;
   mnuTourOperatorList: TMenuItem;
   mnuUserNotes: TMenuItem;
   mnuLIST_COUNTRY: TMenuItem;
   mnuLIST_CITY: TMenuItem;
   N8: TMenuItem;
   mnuLIST_HOTELS: TMenuItem;
   mnuAnalitica: TMenuItem;
   frmKKMFunction: TMenuItem;
   N5: TMenuItem;
   mnuChangeOrderClient: TMenuItem;
   mnuInsertPay: TMenuItem;
   mnuGetPay: TMenuItem;
   N2: TMenuItem;
   aList: TActionList;
   aEsc: TAction;
   Panel1: TPanel;
   N3: TMenuItem;
   ts: TTabSet;
   sm1: TJvScrollMax;
   JvScrollMaxBand2: TJvScrollMaxBand;
   lblKKMHost: TLabel;
   lblKKMPort: TLabel;
   JvScrollMaxBand3: TJvScrollMaxBand;
   lblGetLocalIP: TLabel;
   lblClientHostName: TLabel;
   JvScrollMaxBand5: TJvScrollMaxBand;
   Label1: TLabel;
   Label2: TLabel;
   dtpBegin: TDateTimePicker;
   dtpEnd: TDateTimePicker;
   smTypeDocuments: TJvScrollMaxBand;
   ckOrders: TCheckBox;
   ckInvoice: TCheckBox;
   ckAnnulOrders: TCheckBox;
   ckPays: TCheckBox;
   ckTours: TCheckBox;
   ckSortDate: TCheckBox;
   mnuDocumentsNM: TMenuItem;
   mnuProgramParameters: TMenuItem;
   ckUpdates: TCheckBox;
   ckNews: TCheckBox;
   Panel2: TPanel;
   txtNews: TMemo;
   
   procedure mnuDocumentsNMClick(Sender: TObject);
 private

 public
   //Наборы данных подключения к серверу и пользовательских параметров
   slServer       : TStringList;
   slUser         : TStringList;
   //Параметры удаленного сервера
   sServerAddress : String;
   sServerName    : String;
   sServerPort    : String;
   sServerGUID    : String;
   sInterceptGUID : String;
   sServerBegin   : String;
   sServerEnd     : String;
   //Параметры ККМ
   sKKMCode       : String;
   //Даты текущего периода
   sBegin, sEnd   : String;
   //Параметры фильтрации документов
   sOrders, sInvoice, sAnnulOrders, sTours, sPays, sDateSort, sDogTour, sZayavkaTour, sUpdates, sNews : String;
   //Поток считывания версий системы
   coRemoteKKMSettings : TRemoteKKMSettings;
   //Параметры локального компьютера
   sHost          : String;
   //Параметры пользователя
   sUSER_ID          : String;
   sUSER_NICKNAME    : String;
   sUSER_PASSWORD    : String;
   sUSER_FULLNAME    : String;
   sUSER_FILIAL_ID   : String;
   sUSER_KKM_USE     : String;
   sUSER_IS_ADMIN    : String;
   sUSER_FILIAL_NAME : String;
   sUSER_ROLE_ID     : String;
   sUSER_DOVERENNOST : String;
   sUSER_TOURS       : String;
   sSESSION          : String;
 end;

 function AddLog(sText:String):Longint;StdCall;external"events.dll";

var
 frmMain: TfrmMain;

implementation

{$R *.dfm}

//******************************************************************************
procedure TfrmMain.mnuDocumentsNMClick(Sender: TObject);
var LibHandle       : THandle;
   ShowDocumentsNM : function (slServer,slUsers:TStringList):Integer;StdCall;
begin
 LibHandle := LoadLibrary("iHercules.dll");
 if LibHandle <> 0 then
 begin
   @ShowDocumentsNM := GetProcAddress(LibHandle,"ShowDocumentsNM");
   ShowDocumentsNM(slServer,slUser);
 end;
 FreeLibrary(LibHandle);
end;
//******************************************************************************
end.

dll
library iHercules;

uses
 ShareMem,
 ActiveX,
 Windows,
 Messages,
 SysUtils,
 Variants,
 Classes,
 Graphics,
 Controls,
 Forms,
 Dialogs,
 ComCtrls,
 Menus,
 ADODB,
 DB,
 DBTables,
 SConnect,
 Sockets,
 DBClient,
 MConnect,
 Registry,
 DateUtils,
 Math,
 UfrmShowDocuments in "UfrmShowDocuments.pas" {frmShowDocuments};

{$R *.res}

//******************************************************************************
function ShowDocumentsNM(slServer,slUsers:TStringList):Integer;StdCall;
var frmShowDocuments : TfrmShowDocuments;
begin
   try
 Application.CreateForm(TfrmShowDocuments,frmShowDocuments);
 except
   on E:Exception do ShowMessage(E.ClassName + " " + E.Message);
 end;
end;
//******************************************************************************
exports
 ShowDocumentsNM;
//******************************************************************************
begin
end.
//******************************************************************************


 
Сергей М. ©   (2008-03-13 17:04) [62]

Это, ты считаешь, тестовый проект, да ?)

И я во всем этом хламе должен разбираться ?)

Убирай нафих из всех форм все !
И никаких лишних юнитов в проектах не должно быть, только действительно необходимые для теста !
Формы должны быть девственно чистыми !

ShareMem убрать к лешему везде ! Мало того , что не знаешь зачем оно надо, да еще и влупил его в хост-проекте совсем не туда, куда требует документация.


 
IntruderLab   (2008-03-13 17:24) [63]

unit UfrmMain;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus;

type
 TfrmMain = class(TForm)
   menu: TMainMenu;
   mnuTest: TMenuItem;
   procedure mnuTestClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 frmMain: TfrmMain;

implementation

{$R *.dfm}
//******************************************************************************
procedure TfrmMain.mnuTestClick(Sender: TObject);
var LibHandle : THandle;
   ShowChild:function :Longint;StdCall;
begin
 LibHandle := LoadLibrary("dll.dll");
 if LibHandle <> 0 then
 begin
   @ShowChild := GetProcAddress(LibHandle,"ShowChild");
   ShowChild;
 end;
 FreeLibrary(LibHandle);
end;
//******************************************************************************
end.

library dll;
uses
 ShareMem,
 Windows,
 Messages,
 SysUtils,
 Variants,
 Classes,
 Controls,
 Forms,
 Dialogs,
 UfrmChild in "UfrmChild.pas" {frmChild};

{$R *.res}
//******************************************************************************
function ShowChild:Longint;StdCall;
var frmChild:TfrmChild;
begin
 try
   Application.CreateForm(TfrmChild,frmChild);
 except
  on E:Exception do ShowMessage(E.ClassName + " " + E.Message);
 end;
 Result := 1;
end;
//******************************************************************************
exports
 ShowChild;
//******************************************************************************
begin
end.

Сейчас форма реально появилась на экране - но приложение подвисло!


 
IntruderLab   (2008-03-13 17:28) [64]

на главной форме при запуске дочки caption исчезает


 
Сергей М. ©   (2008-03-13 19:03) [65]


> IntruderLab   (13.03.08 17:24) [63]


> library dll;
> uses
>  ShareMem,


Ты вообще-то русский ?)


 
intruderlab   (2008-03-13 19:52) [66]

ты знаешь нет, я башкир :). Убираю


 
Сергей М. ©   (2008-03-13 19:56) [67]

Я тоже "русскостью", увы, "похвастать" не вправе)

Но .. надо же быть внимательным, когда это в твоих интересах)


 
intruderlab   (2008-03-13 22:35) [68]

извини,просто запарил,сейчас убиру и попробую запустить.


 
IntruderLab   (2008-03-19 15:59) [69]

Вобщем то для тех кому интересно - решилось простым не прописыванием
FreeLibrary(LibHandle);


 
Сергей М. ©   (2008-03-19 17:24) [70]


> решилось простым не прописыванием
> FreeLibrary


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

Тебе оно надо ?

Если надо, то дело хозяйское)


 
IntruderLab   (2008-03-21 10:33) [71]

Я завершаю работу формы из самой дочерней формы, и вроде как она уничтожается


 
Сергей М. ©   (2008-03-21 10:38) [72]


> завершаю работу формы из самой дочерней формы


Причем здесь форма ?

Я тебе про саму dll говорю - ты убрал LoadLibrary, значит ты не выгружаешь dll из памяти процесса.


> вроде как она уничтожается


Это она тебе сама сказала ?)


 
Сергей М. ©   (2008-03-21 10:57) [73]

И вот еще что : везде stdcall понатыкано - это "щоб було" или как ?)


 
Loginov Dmitry ©   (2008-03-21 23:04) [74]

> Вобщем то для тех кому интересно - решилось простым не прописыванием
>
> FreeLibrary(LibHandle);


Логично. Ты создавал в библиотеке дочернюю форму и тут же выгружал эту библиотеку а вместе с нею и код всех обработчиков, которые наверняка присутствовали у дочерней формы. А представляешь, каково это - обработчики без кода! :)


 
IntruderLab   (2008-03-31 11:20) [75]

Представляю :) Спасибо всем!!!



Страницы: 1 2 вся ветка

Текущий архив: 2009.01.25;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.023 c
1-1207224542
Skyhawk
2008-04-03 16:09
2009.01.25
Последовательный перебор элементов


15-1228385772
Palladin
2008-12-04 13:16
2009.01.25
HTTPS сервер


15-1227596126
depoint
2008-11-25 09:55
2009.01.25
Техника безопасности при заправке картриджей


2-1228978681
zorik
2008-12-11 09:58
2009.01.25
TObjectList. Правильно ли я делаю?


15-1228112203
Ламо777
2008-12-01 09:16
2009.01.25
Геометрия, помогите освежить...