안녕하세요 !!
저는 델파이를 처음 사용하여 개발하는 김승현이라고 합니다.
개발중에 어려운 문제에 접하여 도움을 청합니다.
저희가 구현하려는 환경은 CORBA를 이용하여 서버모듈과 클라이언트모듈을
두고, 클라이언트 모듈은 업무메인화면(.exe)에 업무별로 Form을 작성하려고
합니다.
그런데 SDI로 구현하자니 거래화면 분기시마다 Corba Connect시간이 오래
걸리고 MDI밑에 Child Form으로 구현하자니 실행화일이 너무 큽니다.
그래서 Child Form을 DLL로 구성하려고 하는데 Corba Connect루틴이 없으면
제대로 구현되는데, 이부분만 추가하면 Error가 발생합니다.
예) Access violation, Stack overflow, runtime error-216등...
긴급한 관계로 빠른 답변 부탁드리겠습니다...
추가로 간단한 예제도 포함해주시면 감사합니다...
제가 Dll에서 db쓰는 source를 알려드리겠습니다......
저도 여기서 무진장 많이 도움을 받고 있거던요...
library libmenu;
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ActnList, StdCtrls, ExtCtrls, Buttons, ComCtrls, Db, DBTables, ImgList,
ToolWin, Menus, bde;
{$r bullet.res}
type
Pinfo = ^TINfo;
Tinfo = record
jobid: integer;
buttonid: integer;
pgmid: integer;
menutext: string;
module: string;
end;
var
database: tdatabase;
query: Tquery;
Procedure libmenu_init(dbhandle: HDBIDB); stdcall;
Begin
database := Tdatabase.create(nil);
database.databasename := 'dll_db';
database.Handle := dbHandle;
query := tquery.create(nil);
query.databasename := database.databasename;
end;
procedure libmenu_loadmenu(treeview1: TTreeview); stdcall;
var
i: integer;
a1,a2,a3: integer;
t,t2: string;
CurItem, subitem, lastitem: TTreeNode;
NewInfo: Pinfo;
begin
with query do Begin
close;
sql.add('SELECT JOBID, BUTTONID, PGMID, MENUTEXT, PGMTEXT, MODULE, REMARK ');
sql.add(' FROM menu Menu ');
sql.add(' ORDER BY JOBID DESC, BUTTONID, PGMID ' );
open;
end;
with query, treeview1 do
for i:=0 to recordcount - 1 do Begin
a1 := fields[0].asinteger;
a2 := fields[1].asinteger;
a3 := fields[2].asinteger;
t := fields[3].asstring;
if (a3 <> 0) then Begin
lastitem := items.addchild(subitem,t);
lastitem.imageindex := 0;
end
else if (a2 <> 0) then begin
New(NewInfo);
NewInfo^.jobid := a1;
NewInfo^.buttonid := a2;
NewInfo^.Pgmid := a3;
NewInfo^.menutext := t;
if fields[5].isNull then NewInfo^.module := ''
else NewInfo^.module := fields[5].asstring;
subitem := items.AddChildObject(curitem,t,NewInfo);
subitem.imageindex := 2;
end
else begin
New(NewInfo);
NewInfo^.jobid := a1;
NewInfo^.buttonid := a2;
NewInfo^.Pgmid := a3;
NewInfo^.menutext := t;
if fields[4].isNull then NewInfo^.module := ''
else NewInfo^.module := fields[4].asstring;
curitem := items.AddChildObjectFirst(nil,t,newInfo);
curitem.imageindex := 1;
end;
next;
end;
query.free;
database.free;
end;
exports
libmenu_init,
libmenu_loadmenu;
end.
위의 Dll을 폼을 가진 exe project에서 사용시 libmenu_init;를 호출하시면
dll에서 메인폼의 tdatabase의 세션을 할당받고
libmenu_loadmenu;에서 제가 필요한 처리를 합니다....
아무쪼록 미약하나마 도움이 되시길....
--------------------------------------------------------
이정욱님과 김영대님의 멋진 답변.. 늘상 고맙습니다....
--------------------------------------------------------
델파이 왕초보 드림....
김승현 wrote:
> 안녕하세요 !!
> 저는 델파이를 처음 사용하여 개발하는 김승현이라고 합니다.
> 개발중에 어려운 문제에 접하여 도움을 청합니다.
> 저희가 구현하려는 환경은 CORBA를 이용하여 서버모듈과 클라이언트모듈을
> 두고, 클라이언트 모듈은 업무메인화면(.exe)에 업무별로 Form을 작성하려고
> 합니다.
> 그런데 SDI로 구현하자니 거래화면 분기시마다 Corba Connect시간이 오래
> 걸리고 MDI밑에 Child Form으로 구현하자니 실행화일이 너무 큽니다.
> 그래서 Child Form을 DLL로 구성하려고 하는데 Corba Connect루틴이 없으면
> 제대로 구현되는데, 이부분만 추가하면 Error가 발생합니다.
>
> 예) Access violation, Stack overflow, runtime error-216등...
>
> 긴급한 관계로 빠른 답변 부탁드리겠습니다...
> 추가로 간단한 예제도 포함해주시면 감사합니다...