Q&A

  • 여러개의 키보드조합을 지정해서 그림을 변경
폼위에 A라는 그림을 나타내고

키조합을 Shift+A로 하면 그림A가 임의의 B가되고

물론 자리변동은 없어야겠죠

또 똑깥이 Shift+A를 누르면 원래 A그림으로 되돌아오는 것을

만들려고 하는데요.

문제는 창이 활성화되었건 비활성화되었건 간에 그림이 바뀌어야

하는데 방법이 없을까요?

제가 좀 무식해서 소스만 보고는 이해를 못하거든요.

소스와 아주 자세한 설명을 부탁드립니다.

비활성화 되면 안될거라고 하시는 말씀이 있던데...

아무튼 답변 부탁드립니다.

???

1  COMMENTS
  • Profile
    최용일 2000.03.13 23:47
    레지스트리에 핫키를 등록하시어 사용하시면 됩니다. 그럼 폼이 활성화되었건

    비활성화 되었건간에 상관없이 작동합니다.



    다음은 예제 프로그램입니다. 이미지는 아래와 같이 직접 비트맵객체를 직접 생성

    하여 사용하시거나 TImageList를 이용하세요. 동적으로 비트맵객체를 생성하는것

    보단 TImageList를 사용하시는 것을 추천하고 싶습니다. 그럼 더 코드가 간결해

    지니까요... 여기선 그냥 직접 생성하겠습니다.



    별루 길지도 않으니까 충분히 이해하리라 믿습니다.



    unit SetHotKey;



    interface



    uses

    Windows, Messages, Classes, Controls, Dialogs, Graphics, Forms, ExtCtrls;



    type

    TForm1 = class(TForm)

    Image1: TImage;

    procedure FormCreate(sender: Tobject);

    procedure FormDestroy(sender: Tobject);

    private

    // ATOM은 Windows유닛에 선언된 타입으로 16비트 부호없는 정수(Word)형입니다.

    FHotKeyA, FHotKeyB: ATOM; // 핫키에대한 인덱스를 저장하는 변수입니다.

    FImageA, FImageB: TBitmap; // 보여줄 비트맵객체.

    protected

    // 핫키를 처리하는 메세지 핸들러.

    procedure WMHotKey(var msg: TWMHotKey); message WM_HotKey;

    end;



    var

    Form1: TForm1;



    implementation



    {$R *.DFM}



    procedure TForm1.WMHotKey(var Msg: TWMHotKey);

    // 핫키가 눌려지면 이 메세지 핸들러가 실행됩니다.

    // TWMHotKey는 Messages유닛에 저장되어 있습니다.

    // TWMHotKey.HotKey값에 눌려진 핫키의 인덱스가 들어있습니다.

    begin

    if Msg.HotKey = FHotKeyA then // 핫키가 Shift-A 이면

    Image1.Picture.Assign(FImageA) // 이미지객체에 그림 A를 저장합니다.

    else if Msg.HotKey = FHotKeyB then // 핫키가 Shift-B 이면

    Image1.Picture.Assign(FImageB); // 이미지객체에 그림 B를 저장합니다.

    end;



    procedure TForm1.FormCreate(Sender: TObject);

    begin

    // GlobalAddAtom은 문자열에 대한 전역적인 인덱스(Atom)를 추가하는 함수입니다.

    // 전역적인 Atom 테이블은 윈도우즈가 관리합니다.

    FHotKeyA := GlobalAddAtom('MyHotKey_A');

    // RegisterHotKey는 윈도전체에 대한 핫키를 등록하는 API함수입니다.

    // 첫번째 파라매터는 이 ㅎ핫키를 받을 윈도우 핸들을 넣어줍니다. 여기에선

    // TForm1의 핸들이 되겠죠...

    // 두번째 파라매터는 위에서 구한 ATOM값을 써주시교,

    // Alt, Ctrl, Shift키와 함께 쓰려면 세번째 파라매터에다 MOD_ALT, MOD_CONTROL,

    // MOD_SHIFT를 써주시고 그렇지 않으면 0을 넣어주시면 됩니다.

    // 네번째 파라매터는 핫키의 가상키값입니다. 가상키값은 Windows유닛에 보시면

    // 많은 키값들이 정의되어있습니다. '0' ~ '9', 'A' ~ 'Z'를 키값으로 쓰려면

    // 그냥 그 키에 대한 아스키값을 넣어주시면 됩니다.

    if RegisterHotKey(Handle, FHotKeyA, MOD_SHIFT, Integer('A')) = False then

    // 핫키등록이 실패하면 에러 메세지를 출력합니다.

    ShowMessage('HotKey Registration Failed');



    FHotKeyB := GlobalAddAtom('MyHotKey_B');

    if RegisterHotKey(Handle, FHotKeyB, MOD_SHIFT, Integer('B')) = False then

    ShowMessage('HotKey Registration Failed');



    // 그림 A와 B의 두개의 비트맵객체를 생성합니다.

    FImageA := TBitmap.Create;

    // 나타내고자하는 그림의 화일명을 써주세요...

    FImageA.LoadFromFile('C:Delphi5Projects그림A.BMP');

    FImageB := TBitmap.Create;

    FImageB.LoadFromFile('C:Delphi5Projects그림B.BMP');

    end;



    procedure TForm1.FormDestroy(Sender: TObject);

    begin

    // 그림 A와 B의 두개의 비트맵객체를 제거합니다.

    FImageA.Free;

    FImageB.Free;

    // 등록된 핫키를 제거합니다.

    UnRegisterHotKey(Handle, GlobalDeleteAtom(FHotKeyA));

    UnRegisterHotKey(Handle, GlobalDeleteAtom(FHotKeyB));

    end;



    end.



    mad wrote:

    > 폼위에 A라는 그림을 나타내고

    > 키조합을 Shift+A로 하면 그림A가 임의의 B가되고

    > 물론 자리변동은 없어야겠죠

    > 또 똑깥이 Shift+A를 누르면 원래 A그림으로 되돌아오는 것을

    > 만들려고 하는데요.

    > 문제는 창이 활성화되었건 비활성화되었건 간에 그림이 바뀌어야

    > 하는데 방법이 없을까요?

    > 제가 좀 무식해서 소스만 보고는 이해를 못하거든요.

    > 소스와 아주 자세한 설명을 부탁드립니다.

    > 비활성화 되면 안될거라고 하시는 말씀이 있던데...

    > 아무튼 답변 부탁드립니다.

    > ???

    • 왕초짜
    • 2000.03.13 23:26
    • 8 COMMENTS
    • /
    • 0 LIKES
    • 조규춘
      2000.03.14 00:17
      왕초짜 wrote: > 안녕하세요... > 궁금한게 있어서 질문드립니다. > 에디트박스 3개로 년, 월, 일을 입...
    • 왕초짜
      2000.03.14 01:03
      MyDate:=EncodeDate(strtoint(ed1.Text),strtoint(ed2.Text ),strtoint(ed3.Text) ); 요렇게 하니까 년...
    • parkisu
      2000.03.14 09:46
      왕초짜 wrote: > MyDate:=EncodeDate(strtoint(ed1.Text),strtoint(ed2.Text ),strtoint(ed3.Text) ); > ...
    • 박성훈
      2000.03.14 00:16
      왕초짜 wrote: > 안녕하세요... > 궁금한게 있어서 질문드립니다. > 에디트박스 3개로 년, 월, 일을 입...
    • 최용일
      2000.03.14 00:13
      다음과 같이 FormatDateTime함수를 이용하세요 FormatDateTime('yyyymmdd', StrToDate(Box1.Text+'-'+...
    • 왕초짜
      2000.03.14 00:57
      최용일 wrote: > 다음과 같이 FormatDateTime함수를 이용하세요 > > FormatDateTime('yyyymmdd', Str...
    • 최용일
      2000.03.14 01:17
      당연히 에러가 날수밖에 없습니다. FormatDateTime은 TDate형을 돌려주는게 아니라 날짜의 문자열을 돌려...
    • • • •
    • 젠키
      2000.03.13 23:42
      철이 wrote: > delphi에서 엑세스 디비를 연결하여 사용하였습니다.... > 프로그램이 실행되거나, 디비가...
    • 철이
      2000.03.14 18:34
      젠키 wrote: > 철이 wrote: > > delphi에서 엑세스 디비를 연결하여 사용하였습니다.... > > 프로그램이...
    • 근수
      2000.03.25 07:16
      박성훈 wrote: > 2000-02-02 02:50:00과 2000-03-03 14:10:00의 차이를 구한다음 이것을 시간으로 표시하...
    • 최용일
      2000.03.14 00:58
      TimeStamp를 이용하시면 간단히 구하실 수 있습니다. var Time1, Time2, pTime: TTimeStamp; begin ...
    • 박성훈
      2000.03.14 00:23
      박성훈 wrote: > 2000-02-02 02:50:00과 2000-03-03 14:10:00의 차이를 구한다음 이것을 시간으로 표시하...
    • 송정환
    • 2000.03.13 22:38
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.03.13 23:59
      텍스트(.txt)파일로 저장하는 방법처럼 하시면 됩니다. 단지 그 사이사이에 HTML태그를 넣어서 저장하시...
    • 한승수
    • 2000.03.13 22:16
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 장은석
      2000.03.14 15:57
      한승수 wrote: > > 두개 이상 실행시키는 것을 막기 위해 > > 제가 짠 프로그램이 이미 실행중이...
    • blueSky
      2000.03.13 23:55
      한승수 wrote: > > 두개 이상 실행시키는 것을 막기 위해 > > 제가 짠 프로그램이 이미 실행중이...
    • toto1052
    • 2000.03.13 22:02
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 착한악마
      2000.03.14 07:24
      리포트 옵션에 있는 기능이거든요... 리포트 세팅에서 컬럼수를 조정해 보세요....그럼 될겁니다...( 코딩...
    • 하얀까마귀
      2000.03.13 22:19
      안녕하세요 하얀까마귀 입니다... 불행히도 없어요....(
    • 종이학
      2000.03.13 21:00
      Go100 wrote: > 어떤 폼에서 조회를 하면서 DbGrid 숫자 필드에 > (1,000,000,000) 이처럼 3자리에 컴마...
    • 하얀까마귀
      2000.03.13 20:55
      안녕하세요 하얀까마귀 입니다. 처음 질문은 그냥 불러 올때 소트를 하시구요... order by 하시면 됩니...
    • blueSky
      2000.03.13 19:11
      김경한 wrote: > > 급합니다. > > 시간이 만약 16:45 초라면,, (16 분 45 초) > > 에디트 박스...
    • 김경한
      2000.03.13 19:25
      blueSky wrote: > 김경한 wrote: > > > > 급합니다. > > > > 시간이 만약 16:45 초라면,, (16 분 ...
    • 강인규
      2000.03.13 21:59
      위의 분이 답변주신것이 맞습니다. 초에서 'ss'를 해주면 01초가 되지요. 아마도 문자형으로 디비에 저...
    • 박성훈
    • 2000.03.13 18:59
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.03.13 20:41
      저의 답변을 이해를 못하신것 같군요... 저는 OS(explorer.exe)차원에서 이야기한 것인데... 그럼 두번째 ...
    • 박상길
    • 2000.03.13 18:36
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2000.03.14 23:54
      박상길 wrote: > Windows CE 에서 델파이 지원이 가능한지 알고 싶습니다....... 안녕하세요 하얀까마...
    • 안대규
    • 2000.03.13 18:35
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박성훈
      2000.03.13 18:56
      안대규 wrote: > 안녕하세요~~~ > 궁금중이 있어 이렇게 글을 올립니다. > 델파이에서 제공하는 vcl디렉...
    • 초보
    • 2000.03.13 17:30
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 장은석
      2000.03.14 10:15
      초보 wrote: > 레지스트리의 rootkey: HKEY_LOCAL_MACHINE 에서 > 'SOFTWAREMicrosoftWindowsCurrentVers...
    • 초보
      2000.03.15 01:08
      제 질문을 바로 이해해 주시고 답변 주시니 고마습니다. 덕분에 성공했습니다.
    • 최용일
      2000.03.13 21:22
      SetWindowHookEx와 같은 API함수를 이용하여 시스템전체의 메세지나 이벤트를 장악하시면 됩니다. 쉽게 말...
    • 조규춘
      2000.03.13 21:16
      고수는 아니지만 그냥 한번 올려 봅니다. 아래의 소스는 ctrl + alt + del을 눌렀을때 내가 만든 프로그...
    • mad
    • 2000.03.13 11:15
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.03.13 23:47
      레지스트리에 핫키를 등록하시어 사용하시면 됩니다. 그럼 폼이 활성화되었건 비활성화 되었건간에 상관없...
    • 때밀이
    • 2000.03.13 10:58
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 종이학
      2000.03.13 20:56
      때밀이 wrote: > test1과 test2에서 다음과 같이 비교하려 합니다. > > select a.* from test1 a, > ...