Q&A

  • 버튼에 포커스가 오게 하지 않으려면...
안녕하세요.
아래 올렸는데 질문이 좀 잘못 된것 같아 다시 한 번 올립니다.

기본 폼에 이미 비트버튼으로 올려 프로그램을 몽땅 작성하였고
또 버튼의 이벤트를 사용하였기에 버튼을 스피드버튼으로 바꾸는건
좀 불가능하구요
단지 몇개의 버튼에 포커스가 오지 않게 하려 합니다.

포커스 되돌리기, 포커스 막기 그런 비법이 없을까요 ?
6  COMMENTS
  • Profile
    최용일 2003.09.17 01:33
    안녕하세요. 최용일입니다.

    아래와 같이 해보세요... 첨부터 포커스가 있는건 어쩔수가 없네요...

    type
        TForm1 = class(TForm)
            Button1: TButton;
            Button2: TButton;
            Button3: TButton;
            BitBtn1: TBitBtn;
            ......
            procedure Button1Click(Sender: TObject);
            procedure FormCreate(Sender: TObject);
        private
            mPrevFocusedControl: TWinControl;
            procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED;
            ......
        end;

    implementation

    procedure TForm1.CMFocusChanged(var Message: TCMFocusChanged);
    begin
        if Message.Sender = Button1 then
        begin
            Message.Sender := mPrevFocusedControl;
            Message.Result := 0;
        end;
        mPrevFocusedControl := Message.Sender;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
        if mPrevFocusedControl <> nil then
            mPrevFocusedControl.SetFocus;

        // Does Something...
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
        mPrevFocusedControl := ActiveControl;
    end;

  • Profile
    구관중 2003.09.19 18:14
    역시 관리자님이십니다.
    정말 도움이 확 되는 답변이십니다.
    별 꽁수를 다써봤지만
    서브클래씽 흉내도 내보고 했지만 잘 안풀리던데
    역시 전 프로그램에 관련된 직종을 그만~
    계속해야 될것 같습니다.
    하면 할 수 록 재미 있거든요.
    물론 고용주에겐 미안하지만.. ( 돈주고 프로그램 제대로 못짜고 .. )
    감사하구요...
    정말 이럴땐 술이라도 한잔 사드리고 싶다니까요 ^^
    그럼 수고하세요...

  • Profile
    major 2003.09.16 20:47


    혹시 TabStop := False를 말씀하시는건 아닌지요?

    이건 Tab에서 focus가 오지 않게 막는 건데...

    이런 기능을 말씀하시는게 아닌가요?

    그럼 즐프하세염..
  • Profile
    구관중 2003.09.16 21:12
    답변감사합니다.

    하지만 제가 하고 싶은건 클릭해도 포커스가 이전 포커스에

    머물게 하는 것입니다. 마치 스피드 버튼 처럼요.

    버튼을 눌렀을때 컴포넌트 상태를 체크하는  부분이 있거든요..

    그럼 답변이 있길 고대하며....

  • Profile
    한원희 2003.09.16 23:20
    안녕하세요. 한원희입니다.

    간단하게 기존의 비트버튼을 스피드 버튼으로 교체하면 되는 문제인것 같네요

    위처럼 수많은 컴포넌트중 특정 컴포넌트를 그대로 둔체 클래스만 변경하는 경우,

    먼저 델파이 bin 디렉토리에 있는 Convert 파일로 해당 폼 파일을 텍스트로 변환합니다.
    텍스트로 변환한 폼 소스(dfm)를 열어서 필요한 부분에서 TBitBtn -> TSpeedButton 으로 변경한 후에 저장합니다.
    변환한 폼의 pas 소스를 읽어들이면, 변환된 컴포넌트간에 맞지 않는 속성때문에 오류를 표시할 수 있지만, 모두 무시를 합니다.
    그리고, 다시 저장하면, 컴포넌트의 클래스가 일치하지 않으므로 dfm 소스의 클래스로 변경하겠는지 묻습니다. 이때 예를 클릭하시면 pas 부분까지 변환되어 저장되게 됩니다.

    물론, 제대로 호환이 안되서 위와 같은 방법으로 변경이 불가능한 경우가 있을 수 있으므로 소스는 반드시 백업해 놓으시고 작업하세요.
    너무 무책임한 답변이었나요?

    저는 유사한 Edit 간, 유사한 Button 간의 변환을 적용할 때, 위와 같은 방법을 써서 매우 편리하게 작업한 기억이 있어서...

    그럼, 즐푸~

  • Profile
    major 2003.09.16 22:51

    답변감사합니다.

    하지만 제가 하고 싶은건 클릭해도 포커스가 이전 포커스에

    머물게 하는 것입니다. 마치 스피드 버튼 처럼요.

    버튼을 눌렀을때 컴포넌트 상태를 체크하는  부분이 있거든요..

    그럼 답변이 있길 고대하며....

    포커스만 보내시는 거라면 걍 Click이벤트에서 포커스를 강제로 보내거나 아니면 TabOrder := BitBtn1.TabOrder - 1;을 하시면 되지 않을 까요?

    제가 워낙 초짜다 보니 넘 간단하게 생각하는 거 같네요..^^;;

    그럼 즐프하세염...