Q&A

  • MDI 폼에서 Child 폼사이의 값이동
아래 소스를 보시고 조언을 부탁드립니다



문제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



0  COMMENTS