Q&A

  • 파라미터로 컨트롤(버튼,에디트박스......)을 넘길수 없나요!!!
델파이에 입문한지 얼마 안되는 초보입니다.

제가 하고 싶은것은 파라미터로 컨트롤을 개수를 가변으로 넘기고 싶습니다.
예를 들면,

    A (Button1,Edit1,Button2,Button3,........);

도움말중에 'Variant open array parameters'란 것을 이용해 보았으나, 컨트롤은 넘어가지 안더군요....

제가 구현하려는 것은 버튼이 눌렸을 경우 폼 안에 내가 넘겨준 컨트롤들을 순회(몇개를 넘겨줄지 모르겠죠?) 하면서 작업 (활성화,비활성화,값지우기등등)을 할려고 합니다.

참고로, 비주얼 베이직에는 매개 변수에 ParamArray를 선언하면 개수에 상관없이 넘어 갈뿐 아니라 control()이란 함수로 컨트롤을 넘길수 있습니다.

   ex)  //호출부
         A (Button1,Edit1,Button2,Button3,........)
      
        //구현함수
         A (ParamArray control())
          Dim aobj As Variant
          For Each aobj In control
           ......         <===여기서 다시 타입에 따라 활성, 비활성 작업수행
          Next aobj

이것이 안된다면 버튼하나 눌리때 마다 다른 버튼의 활성, 비활성화 및 텍스트 박스 클리어를 일일이 해주어야 하나요?

몇일을 고생했는데도 알길이 없네요.....ㅜ.ㅜ;
고수님들 도와주세요..........
3  COMMENTS
  • Profile
    이재훈 2003.01.30 22:43
    ..
  • Profile
    이중철 2003.01.30 21:40
    시간이 없어서 대충쓸께요

    일단 포인터로 하는 법....

    procedure TForm1.arraytests(const Args: array of Pointer);
    var i : integer;
    begin
      for i := 0 to  HIGH(Args) do
        if TObject(Args[i]^) is TButton then
           TButton(Args[i]^).caption := '1';
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      arraytests([@Button1, @Button2, @Button3]);
    end;


  • Profile
    박장용 2003.01.30 21:32
    unit Unit1;

    interface

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

    type
      TForm1 = class(TForm)
        Button1: TButton;
        Panel1: TPanel;
        Edit1: TEdit;
        Edit2: TEdit;
        Button3: TButton;
        Button4: TButton;
        Button5: TButton;
        Edit3: TEdit;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
        procedure fEnable(bUse:boolean);
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.fEnable(bUse:boolean);
    var i: Integer;
    begin
      for i := 0 to ComponentCount - 1 do
      begin
        if TControl(Components[i]).Parent <> panel1 then continue;

        if (Components[i] is TButton) then
          TButton(Components[i]).Enabled := bUse;

        if (Components[i] is TEdit) then
          with TEdit(Components[i]) do
          begin
            Enabled  := bUse;
            ReadOnly := not bUse;
            if not bUse then Clear;
            if bUse then Color := clWindow else Color := clBtnFace;
          end;
      end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      fEnable(True);
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
      fEnable(False);
    end;

    end.