메뉴를 동적으로 생성해주고 각 메뉴를 클릭했을때 해당 폼이 뜨게하려고 합니다
============================================================
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
.....
procedure FormCreate(Sender: TObject);
procedure EditClick(Sender: TObject);
procedure FileClick(Sender: TObject);
procedure CopyClick(Sender: TObject);
var
Form1: TForm1;
MainMenu1: TMainMenu;
....
procedure TForm1.FormCreate(Sender: TObject);
begin
.............
MainMenu1.Items[0][1].OnClick := EditClick;
MainMenu1.Items[0][2].OnClick := FileClick;
MainMenu1.Items[0][3].OnClick := CopyClick;
..............
end;
procedure TForm1.EditClick(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
end;
procedure TForm1.FileClick(Sender: TObject);
begin
Application.CreateForm(TForm3, Form3);
Form3.Show;
end;
procedure TForm1.CopyClick(Sender: TObject);
begin
Application.CreateForm(TForm4, Form4);
Form4.Show;
end;
============================================================
위와 같은 방법말구
procedure TForm1.FormCreate(Sender: TObject); 에서 파라미터를 넘기고
공통 프로시져나 함수를 콜하고
procedure TForm1.EditClick(Sender: TObject);
procedure TForm1.FileClick(Sender: TObject);
procedure TForm1.CopyClick(Sender: TObject); 는 하나의 프로시져(함수)로 만들면
좋은것 같은데요.....생각만 앞서니...어떻해야 하나요???
프로시져(함수)에서 파라미터 처리는 어떻게 해야하는지........
=<대충이런식으로 되면 좋을것 같은데.......===================================
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
.....
procedure FormCreate(Sender: TObject);
procedure MenuClick(????);
var
Form1: TForm1;
MainMenu1: TMainMenu;
....
procedure TForm1.FormCreate(Sender: TObject);
begin
.............
MainMenu1.Items[0][1].OnClick := MenuClick(1); <====요기서 자꾸 에러가...
MainMenu1.Items[0][2].OnClick := MenuClick(2);
MainMenu1.Items[0][3].OnClick := MenuClick(3);
..............
end;
procedure TForm1.MenuClick(????);
begin
if ???? = 1 then begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
end;
if ???? = 2 then begin
Application.CreateForm(TForm3, Form3);
Form3.Show;
end;
if ???? = 3 then begin
Application.CreateForm(TForm4, Form4);
Form4.Show;
end;
end;
=========================================================
불가능한가????
> 메뉴를 동적으로 생성해주고 각 메뉴를 클릭했을때 해당 폼이 뜨게하려고 합니다
> ============================================================
> type
> TForm1 = class(TForm)
> MainMenu1: TMainMenu;
> .....
> procedure FormCreate(Sender: TObject);
> procedure EditClick(Sender: TObject);
> procedure FileClick(Sender: TObject);
> procedure CopyClick(Sender: TObject);
>
> var
> Form1: TForm1;
> MainMenu1: TMainMenu;
> ....
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> .............
> MainMenu1.Items[0][1].OnClick := EditClick;
> MainMenu1.Items[0][2].OnClick := FileClick;
> MainMenu1.Items[0][3].OnClick := CopyClick;
> ..............
> end;
>
> procedure TForm1.EditClick(Sender: TObject);
> begin
> Application.CreateForm(TForm2, Form2);
> Form2.Show;
> end;
>
> procedure TForm1.FileClick(Sender: TObject);
> begin
> Application.CreateForm(TForm3, Form3);
> Form3.Show;
> end;
>
> procedure TForm1.CopyClick(Sender: TObject);
> begin
> Application.CreateForm(TForm4, Form4);
> Form4.Show;
> end;
>
> ============================================================
> 위와 같은 방법말구
> procedure TForm1.FormCreate(Sender: TObject); 에서 파라미터를 넘기고
> 공통 프로시져나 함수를 콜하고
>
> procedure TForm1.EditClick(Sender: TObject);
> procedure TForm1.FileClick(Sender: TObject);
> procedure TForm1.CopyClick(Sender: TObject); 는 하나의 프로시져(함수)로 만들면
> 좋은것 같은데요.....생각만 앞서니...어떻해야 하나요???
> 프로시져(함수)에서 파라미터 처리는 어떻게 해야하는지........
>
> =<대충이런식으로 되면 좋을것 같은데.......===================================
> type
> TForm1 = class(TForm)
> MainMenu1: TMainMenu;
> .....
> procedure FormCreate(Sender: TObject);
> procedure MenuClick(????);
>
> var
> Form1: TForm1;
> MainMenu1: TMainMenu;
> ....
> procedure TForm1.FormCreate(Sender: TObject);
> begin
> .............
> MainMenu1.Items[0][1].OnClick := MenuClick(1); <====요기서 자꾸 에러가...
> MainMenu1.Items[0][2].OnClick := MenuClick(2);
> MainMenu1.Items[0][3].OnClick := MenuClick(3);
> ..............
> end;
>
> procedure TForm1.MenuClick(????);
> begin
> if ???? = 1 then begin
> Application.CreateForm(TForm2, Form2);
> Form2.Show;
> end;
>
> if ???? = 2 then begin
> Application.CreateForm(TForm3, Form3);
> Form3.Show;
> end;
>
> if ???? = 3 then begin
> Application.CreateForm(TForm4, Form4);
> Form4.Show;
> end;
>
> end;
> =========================================================
> 불가능한가????
OnClick에 넘겨줄수있는건 OnClick과 인자구조가 같은 메소드만 가능합니다.
위에서 새로만든 MenuClick은 인자구조가 다르므로 사용할수 없습니다.
여러 이벤트가 하나의 이벤트 메소드를 공유하고자 할때는 Sender를 활용해야 합니다.
위소스를 수정해보면...
procedure TForm1.FormCreate(Sender: TObject);
begin
.............
MainMenu1.Items[0][1].OnClick := MenuClick;
MainMenu1.Items[0][2].OnClick := MenuClick;
MainMenu1.Items[0][3].OnClick := MenuClick;
..............
end;
procedure TForm1.MenuClick(Sender: TObject);
begin
if Sender = MainMenu1.Items[0][1] then begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
end;
if Sender = MainMenu1.Items[0][2] then begin
Application.CreateForm(TForm3, Form3);
Form3.Show;
end;
if Sender = MainMenu1.Items[0][3] then begin
Application.CreateForm(TForm4, Form4);
Form4.Show;
end;
end;
이렇게 되겠지요... Sender는 이벤트를 보내는 객체입니다.