아래 소스를 보시고 조언을 부탁드립니다
문제1> MDI 폼에서 Cilent 영역에 그림을 불러왔는데 Child 폼을 불러오면
Access Violation Error 발생합니다. 하지만 그림을 불러오지 않으면
잘 됩니다.
문제2> Form2와 Form3은 Child 폼인데요
Form3에서 버튼을 클릭하면 Form2의 Edit1에 특정값을 넣어 주려고 하는데..
이때도 마찬가지로 Access Violation Error 발생합니다.
델 고수님들의 조언을 부탁드립니다.
첫번째 Unit
unit main_u;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, Buttons, Menus, ToolWin, ComCtrls, Grids;
type
TForm1 = class(TForm)
CoolBar1: TCoolBar;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
DM1: TMenuItem;
N3: TMenuItem;
SpeedButton1: TSpeedButton;
StatusBar1: TStatusBar;
procedure SpeedButton1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FOldDefWndProc : Pointer;
FNewDefWndProc : Pointer;
{ Private declarations }
procedure ClientWndProc(var msg : TMessage);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.DFM}
{ Child Form Create }
Function CreateChild(sClass : string) : Boolean;
var
MyFormClass : TFormClass;
WorkForm : TForm;
// H : Thandle;
begin
Result := True;
MyFormClass := TFormClass(GetClass(sClass)); // 클래스 찾기
if MyFormClass <> nil then
WorkForm := MyFormClass.Create(Application.MainForm)
else Result := False;
end;
procedure TForm1.ClientWndProc(var msg : TMessage);
var
SBar : Boolean;
ClientDC : HDC;
MemDC : TBitMap;
MemDCX : Integer;
MemDCY : Integer;
begin
{ Scroll Bar Control }
SBar := True;
case Msg.msg of
$3F : SBar := False;
end;
if SBar Then with Msg
do Result := CallWindowProc(FOldDefWndProc, ClientHandle, Msg, wParam, lParam);
{ Main Form Image Contril }
case Msg.Msg of
WM_PAINT : begin
ClientDC := GetDC(ClientHandle );
MemDC := TBitmap.Create;
MemDC.LoadFromFile('sh.bmp');
MemDCX := 0;
MemDCY := 0;
repeat
repeat
BitBlt ( ClientDC, MemDCX, MemDCY, MemDC.Width,
MemDC.Height, MemDC.Canvas.Handle, 0, 0, SRCCOPY );
Inc ( MemDCX, MemDC.Width );
until MemDCX >= ClientWidth;
MemDCX := 0;
Inc ( MemDCY, MemDC.Height );
until MemDCY >= ClientHeight;
ReleaseDC ( ClientHandle, ClientDC );
MemDC.Free;
end;
end;
with Msg do
Result := CallWindowProc ( FOldDefWndProc, ClientHandle, Msg, wParam, lParam );
{ Control End }
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
// Form2 := TForm2.Create(Self);
CreateChild('TForm2');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FNewDefWndProc := MakeObjectinstance(ClientWndProc);
FOldDefWndProc := Pointer(SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FNewDefWndProc)));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SetWindowLong(ClientHandle, GWL_WNDPROC, LongInt(FOldDefWndProc));
FreeObjectInstance(FNewDefWndProc);
end;
end.
두번째 UNIT
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;
type
TForm2 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
uses Unit3;
{$R *.DFM}
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := Cafree;
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
Form3 := TForm3.Create(self);
end;
initialization RegisterClasses([TForm2]);
end.
세번째 UNIT
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm3 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm3.Button1Click(Sender: TObject);
begin
Form2.Edit1.Text := '1111';
end;
end.
끝까지 읽어 주셔서 감사하구요.. 꼭 문제점을 알려주시기 바랍니다.
멜을 주셔도 감사구요
E-Mail : ironfly@popsmail.com