Q&A

  • 포커스가 있는 컨트롤에 색 주기...
안녕하세요

폼에 TEdit, TMemo, TCombobox 등등의 여러가지 컨트롤이 있을때

각 포커스가 이동하잖아요?

그때 포커스가 있는 컨트롤의 색을 바꿀 수 있는 방법 아시나요?

각 컨트롤의 OnEnter, OnExit 에 일일이 써주지 않고 한방에 해결하는 방법이...

폼이 한 60개 정도 되다보니 각 컨트롤마다 해줄수는 없구요

컨트롤에 포커스가 가면 노란색으로 Color 가꼈다가 포커스가 없어지면 다시

하얀색 등등으로 바뀌는...

아시는 분~  
5  COMMENTS
  • Profile
    김용일 2002.03.13 20:35
    굉장히 간단한 방법이 있죠.
    물론, 다 아시는 부분을 활용을 못하시는듯 하군요.
    질문대로 OnEnter 이벤트에서 clYellow으로 바꾸고 OnExit 이벤트에서 clWindow로 바꾸시면 됩니다.

    그런데, 컴포넌트가 폼당 20개라고 해서 20개를 다 써주는건 많이 괴롭겠죠?
    폼 디자인 화면에서 적용하고 싶은 컴포넌트를 <Shift> 키와 마우스 왼쪽키를 이용해서 모두 선택을 하세요.

    그리고, Object Inspector의 Events 탭에서 OnEnter 이벤트와 OnExit 이벤트를 각 각 더블클릭해서 코드를 추가할 수 있도록 하세요.
    ☞ 이렇게 한 후 각 컴포넌트마다 OnEnter 이벤트와 OnExit 이벤트를 클릭해 보시면 모두 동일한 이벤트명이 보일 것입니다. 예컨데 아래와 같이 Edit1Enter, Edit1Exit로 말입니다.

    그리고는 아래와 같이 코딩하세요.
    procedure TForm1.Edit1Enter(Sender: TObject);
    begin
       if Sender is TEdit then
          (Sender as TEdit).Color := clYellow
      else if Sender is TComboBox then
          (Sender is TComboBox).Color := clYellow
      else if Sender is TMemo then
          (Sender is TMemo).Color := clYellow
                 :
    end;

    procedure TForm1.Edit1Exit(Sender: TObject);
    begin
       if Sender is TEdit then
          (Sender as TEdit).Color := clWindow
      else if Sender is TComboBox then
          (Sender is TComboBox).Color := clWindow
      else if Sender is TMemo then
          (Sender is TMemo).Color := clWindow
                 :
    end;



  • Profile
    깨비 2002.03.11 21:56
    아래는 좀 무식하게 했군요.. 흐흐..
    좀 다른 방법이 있어 올립니다.
    일단  포커스가 있는 컴포넌트는 onEnter 이벤트와 onExit 이벤트가 있슴다.
    불행히도 일반 버튼 컴포는 색을 바꾸려면 꽤 힘이 들군요.
    그래서 font style 만 바꾸었습니다.
    흐흐.
    포커스를 체트하지 말구 둣 enter 와 exit를 체크 해서 Sender를 처리하는 방식이 나을듯 합니다.
    아. 여러개의 컴포넌트(포커스가 있는 컴포넌트 )를 한꺼번에 선택해서 한번에 이벤트를 동시에 주십시요 그리고 어떤건지 생각 마시고 그냥 sender를 잘 이용하세요.. (^^);
    궁금한게 있으시면 리플 달아주세요.. 흐흐..
    아래는 예제 입니다.

    procedure TForm1.Button2Enter(Sender: TObject);
    var
        s : String;
    begin
        s := Sender.ClassType.ClassName;
        if S = 'TButton' then //TEdit, TMemo, TCombobox
        begin
            TButton(Sender).Font.style := [fsBold];
        end;
    end;

    procedure TForm1.Button2Exit(Sender: TObject);
    var
        s : String;
    begin
        s := Sender.ClassType.ClassName;
        if S = 'TButton' then  // TEdit, TMemo, TCombobox
        begin
            TButton(Sender).Font.style := [];
        end;
    end;


    >안녕하세요
    >
    >폼에 TEdit, TMemo, TCombobox 등등의 여러가지 컨트롤이 있을때
    >
    >각 포커스가 이동하잖아요?
    >
    >그때 포커스가 있는 컨트롤의 색을 바꿀 수 있는 방법 아시나요?
    >
    >각 컨트롤의 OnEnter, OnExit 에 일일이 써주지 않고 한방에 해결하는 방법이...
    >
    >폼이 한 60개 정도 되다보니 각 컨트롤마다 해줄수는 없구요
    >
    >컨트롤에 포커스가 가면 노란색으로 Color 가꼈다가 포커스가 없어지면 다시
    >
    >하얀색 등등으로 바뀌는...
    >
    >아시는 분~  
    >
  • Profile
    윤신호 2002.03.11 20:03
    무식하지만 이렇게 전체 loop돌리는 방법은 어떠실련지..
    timer로 특정form의 전체컴퍼넌트를 체크하면서 포커스가 있는 컴퍼넌트인지
    아닌지에 따라서 색상을 설정하면 간단히 처리를 할 수 있습니다.

    procedure TForm1.Timer1Timer(Sender: TObject);
    var i:integer;
    begin
        for i:=0 to Form1.ComponentCount -1 do
           begin
           if Form1.Components[i] = ActiveControl then
              begin
               if (ActiveControl is Tedit) then
                  begin
                  (ActiveControl as Tedit).Color :=$00E3FDFB
                  end;
              end
           else
              begin
               if (Form1.Components[i] is Tedit) then
                  begin
                  (Form1.Components[i] as Tedit).Color :=clWindow
                  end;
              end;
           end;
    end;


  • Profile
    서정길 2002.03.11 20:10
    ^^

    우선 답변 무지 빨리 주셨네요...

    한시만만인가? 호...^^

    고맙습니다

    방법은 방법인데...솔직히 말해서 무식하긴 하군요 ^^;

    ㅎㅎ

    하여간 타이머의 Interval을 100정도 주니깐 되네요

    고맙습니다

    잘 쓰겠습니다~



  • Profile
    윤신호 2002.03.11 20:37
    ^^

    그게 말이죠
    현재 focus가 있는것은 loop돌리지 않아도 되는데.
    컴퍼넌트에서 빠져나오는것 체크하기가 한번에 쉽지가 않아서리.

    더 훌륭하게 하실려면...
    메세지 후킹같은 기법을 이용하셔서 컴퍼넌트에 focus가 갈때와 빠질때를 잡아서 컴퍼넌트색상을 넣는것도 방법이 되지 않을까 싶네요.