Q&A

  • 예제와 상속에 관한 질문
아래 소스는 메뉴의 내용을 런타임상에서 더

추가 시킬 수 있는 간단한 예제입니다.

근데 만일

myITEM := TMenuItem.Create(nil);  에서 nil아니고

Form1이나 MenuItem1을 넣고 메뉴 내용을 더 추가시키면

내용이 넣으면 넣을수록 제곱이 되어서 들어가 지더군요.

왜 그런걸까요? 아직 제가 상속에 대한 개념이 덜 잡힌거 같습니다.

좋은 답변 바랍니다.

=======================================================================
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Menus, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    procedure Button1Click(Sender: TObject);


  private
    { Private declarations }
     procedure myClickEvent(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  myITEM : TMenuItem;
  i : Integer;
  IsExist : boolean;
begin
  IsExist := False;

        for i:=1 to MainMenu1.Items[0].Count do begin

          if MainMenu1.Items[0].Items[i-1].Caption= edit1.text then begin
              IsExist := true;
              break;
          end;

          if not IsExist then begin

  myITEM := TMenuItem.Create(); //만일 nil이 아니고 다른 값이라면?

                myITEM.onClick := myClickEvent;

                myITEM.caption := edit1.text;

                MainMenu1.items[0].Add(myITEM);
           end
            else ShowMessage('이미 존재하는 메뉴 입니다.');

         end;
end;

// 런 타임 중에 생성된 메뉴를 클릭했을 때 발생하는 이벤트 프로시저
procedure TForm1.myClickEvent(Sender: TObject);
begin
  ShowMessage(TMenuItem(Sender).Caption+'이 눌렸습니다');
end;



end.
2  COMMENTS
  • Profile
    미소나눔 2003.01.10 22:58
    procedure TForm1.Button1Click(Sender: TObject);var
      i : Integer;
      myITEM : TMenuItem;
    begin

        MainMenu1.Items[0].RethinkLines;
        for i:=0 to MainMenu1.Items[0].Count-1 do begin
            if MainMenu1.Items[0].Items[i].Caption = Edit1.Text then begin
                ShowMessage('존재하는 메뉴');
                Exit;
            end;
        end;

        myITEM := TMenuItem.Create(MainMenu1);
        myITEM.onClick := myClickEvent;
        myITEM.caption := edit1.text;
        MainMenu1.items[0].Add(myITEM);

    end;

    // 런 타임 중에 생성된 메뉴를 클릭했을 때 발생하는 이벤트 프로시저
    procedure TForm1.myClickEvent(Sender: TObject);
    begin
      ShowMessage(TMenuItem(Sender).Caption+'이 눌렸습니다');
    end;

    즐푸~~
  • Profile
    구창민 2003.01.10 21:14
    안녕하세요~ 구창민입니다.

    음.. 코드를 잘못 작성하신거 같은데..

    아래 문장은 항상 0 번째 메뉴 아이템이 존재하는지만 검사하게 될거 같군요.

    if MainMenu1.Items[0].Items[i - 1].Caption = edit1.text then

    모든 아이템을 비교하도록 코드를 바꾸어 주심 문제가 해결 될거 같군요.

    그리고, 님이 질문하신 Create 의 인자는 객체의 해제와 관련된 것이지,

    위의 문제와는 상관없는 문제입니다.

    nil 로 생성하면 객체의 Owner 가 없다는 뜻이며, 스스로 해제를 담당해야 합니다.

    Application, Form1 등은 Owner 가 그들이 되는 것이지요.

    즉, 해제도 생성자가 해제될때 같이 수행된다는 뜻이됩니다.

    쩝.. 설명하는 제주가 부족해서 제대로 이해되셨는지 모르겠네요..

    항상 ~ 즐거운 프로그래밍 하세요~