도움에 감사드립니다.
책을 뒤져가며, 게시판을 훑어가며
차일드 폼을 dll로 만들어 메인폼에서 부르는데까지는
성공했는데요. 그다음이 문제네요.
하고자 하는 일을 간단하게 변경해서 질문 드릴께요.
DLL을 부르는 실행파일안에는 Form_Main 폼이있고요,
DLL안에는 Form_SearchTip 폼이 있습니다.
하고자 하는 일은 DLL을 부르면 DLL의 폼이 생성되면서 Form_Main의 caption을 '하하하'로 바꿀려고 하는 것인데 여기서 에러가 생기네요.
어떻게 해야 하나요?
<소스 일부>
1. Form_Main
............
LibHandle := LoadLibrary('searchtipdll.dll');
if LibHandle = 0 then Exit;
........
Show_Form(Form_Main) //DLL에 있는 Show_Form을 Call
2. DLL
uses Form_Library
.............
procedure Show_Form(Form:TForm);
begin
Form_SearchTip := TForm_SearchTip.Create(Form);
Form_SearchTip.Show;
end;
procedure TForm_SearchTip.FormCreate(Sender: TObject);
begin
Form_main.Caption := 'hhhhhh'; //실행중에 에러
{ 아래 방법을 해보았으나 컴파일 에러....
Hwnd := FindWindow('Form_Main', 'Form_Main');
HWND.Form_Main.Caption := 'hahhaha';
}
end;
end;
고수님 도와 주세요.
실행파일과 dll은 서로 다른 프로세스로 실행됩니다. 그러니까 이 경우는 uses절에 유닛을 추가했다고 해도 아래와 같이 바로 바꿀수는 없을겁니다.
Form_main.Caption := 'hhhhhh'; //실행중에 에러
보니까 dll함수 호출할때 파라매터로 위 폼이 들어오군요.
Form_SearchTip에 Form_main타입으로 필드나 속성을 하나 만들어서 그것을 억세스하세요...
TForm_main=class(...)
......
private
fForm_main: TForm_main;
end;
procedure Show_Form(Form:TForm);
begin
Form_SearchTip := TForm_SearchTip.Create(Form);
Form_SearchTip.fForm_main := Form;
Form_SearchTip.Show;
end;
procedure TForm_SearchTip.FormCreate(Sender: TObject);
begin
fForm_main.Caption := 'hhhhhh';
end;
또 다른 방법으로 Form_SearchTip의 Owner가 Form_main이니까 형변환만 하셔두 되구요...
procedure TForm_SearchTip.FormCreate(Sender: TObject);
begin
TForm_main(Self.Owner).Caption := 'hhhhhh';
end;
^^ 항상 즐코하세요...