안녕하세요? 델파이 초보 다시 한번 질문드립니다.
먼저 제 프로그램에는 TPopUpMenu나 TButton, TBevel 등등 보통 사용하는
VCL 들을 얹어놓은 TForm 이 두 개 있습니다.
이 프로그램의 ActiveX 버젼을 만들기 위해서 ActiveForm 을 사용하고 있
습니다.
액티브 폼의 OnCreate 이벤트에서 제 TForm 을 생성해서 ParentWindow 를
액티브 폼으로 주는 방법을 쓰는 것입니다.
이 방법은 잘 동작하고 아무런 문제가 없습니다. 익스플로러의 HTML 페이
지에서 OBJECT 태그를 이용해서 ActiveX 를 사용하면 잘 돌아가고 별다른
문제도 없습니다.
그런데!
익스플로러에서 HTML 페이지를 연 상태에서 CTRL+N을 눌러서 새창을 띄우
면 제 폼의 유닛에서 선언한 전역변수(Implementation 절 위에 Var 로 잡
은...)들이 모두 공유됩니다.
(직접 iexplore.exe를 여러개 띄우는 것과 다름! 아마도 익스가 새창을 띄
우면 MTA로 동작하는 것 같은데... 정확히는 모르겠습니다)
보통 델파이에서 폼을 생성하면, 해당 유닛이
TMyForm = class(TForm)
........
end;
var
MyForm: TMyForm;
implementation
.....
이런식이잖습니까? (직접 쓰는거라 확실치가 않네요 -_-)
그래서 폼이 생성되면 MyForm 에 인스턴스를 넣어서 다른 유닛에서 참조가
가능하도록 되어 있는데요,
CTRL+N으로 익스가 두 번째 ActiveX를 생성하면, 제 루틴에서 폼을 만들어서
MyForm 에 넣기도 전에, 첫번째 녀석이 생성한 TMyForm 인스턴스가 들어있다
이겁니다!!
이것뿐이 아니고 그 TMyForm 이 TPopUpMenu 를 사용한다고 치면 TPopUpMenu
가 선언돼있는 유닛을 참조하게 되는데요(uses...), 그 유닛에 들어있는 전
역변수도 마찬가지로 공유됩니다!
단순히 값만 같은게 아니라 정확히 똑같은 변수를 사용합니다. 따라서 처음
만들어진 놈이 내용을 맘대로 바꾸면 두번째 놈이 망가지게 되죠.
(실제로 새창을 띄우면 팝업 메뉴가 안뜹니다)
그래서 저는 문제가 있는 유닛들을 찾아서 전역변수를 다 클래스 안으로 집
어넣어봤더니 문제가 없어지더군요. 그런데 이런 방법은 제가 사용하는 모든
유닛들에 대해 해줘야하는 것이니... 삽질이 아닐수가 없고 델파이 자체의
한계로도 받아들일 수 있는 점입니다.
다른 분들도 이렇게 문제를 해결하셨을것이라고는 생각지 않습니다.
다른 방법이 있는지요?