Q&A

  • 마우스 오른쪽 버튼을 클릭했을 때 팝업메뉴 띄우기
popupMenu 프로퍼티에 세팅을 해도...

onMouseDown으로 체크를 해도 제가 원하는게 안나옵니다. T_T

전 Listview에서 아이템 위에 가서 오른쪽 버튼을 누르면

아이템이 셀렉트 되면서 팝업 메뉴가 나오고

아이템이 없는 빈 공간에서 오른쪽 버튼을 누르면 아무것도 안나오게 하고 싶습니다.

그런데 잘 안되네요...

shellListview를 보니 그런 식으로 잘 작동하던데...

폴더위에서 오른쪽 버튼 클릭할 때랑 파일 위에서 오른쪽 버튼을 클릭할 때도 다르고...

이런식으로 아이템종류를 구분해서 팝업 메뉴를 띄우는 방법과

빈 곳에서 오른쪽 버튼을 클릭하면 무시하고 아이템 위에서 클릭할 경우만 띄워주는 방법이 궁금합니다.

고수분들의 많은 답변 바랍니다.~~ (간단한 소스도 있으면 더욱 좋구요. ^^;;;)
3  COMMENTS
  • Profile
    권순모 2003.04.15 10:21
    리스트뷰의 마우스 다운 이벤트로 한번 만들어봤습니다.

    님이 원하는데로 선택적 팝업을하려면 델파이에서 제공하는 PopMenu 프라퍼티에 세팅을하면 안됩니다.
    PopMenu 프라퍼티를 이용하면 마우스 오른쪽 버튼이 눌리면 무조건 팝업이 띄워지기 때문에... 안되겠죠...

    procedure TFormMain.ListView1MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    var
      Pos: TPoint;
      Item: TListItem;
    begin
      if (Button = mbRight) then // 마우스 오른쪽버튼이 눌렸다면...
      begin
        Item := ListView1.GetItemAt(X, Y); // 현재 마우스좌표의 아이템을 구함
        if Item <> Nil then // 아이템이 있다면
        begin
          // 현재 X,Y 좌표는 리스트뷰의 좌표이기 때문에 이를 스크린 좌표로
              바꾸어준 다음에...
          Pos := ListView1.ClientToScreen(Point(X, Y));
          // 팝업을 띄운다...
          PopupMenu1.Popup(Pos.X, Pos.Y);
        end
    end;

    그리고 님 질문중에...

    폴더위에서 오른쪽 버튼 클릭할 때랑 파일 위에서 오른쪽 버튼을 클릭할 때도 다르고...

    이게 무슨말인지 잘 모르겠는데요... 뭐가 다르단건가요?
    만약 팝업메뉴가 다르게 나타나는거라면 PopupMenu1 의 OnPopup 이벤트에서 선택적으로 처리해주면 되겠죠...
    아니면 한쪽은 팝업이 뜨고 다른한쪽은 팝업이 안뜨는거라면 위에 제가 적은 코드를 조금만 수정하면 되겠습니다...
  • Profile
    고가람 2003.04.15 18:35
    답변 감사합니다. ^^;;

    아래는 제가 어제 질문을 올리고 대충 작정한 코드인데요...

    답변해주신 것과 비슷한 로직을 사용했습니다.

    -----------------------------------------------------
    var
      item: TlistItem;

    begin
      if Button = mbRight then
      begin
        item := nil;
        item := Listview1.GetItemAt(X, Y);
        if item <> nil then
          Listview1.PopupMenu := PopupMenu1;
      end;
    end;
    -------------------------------------------------------

    그런데 여기서 문제가 하나 있더군요. 아이템 위에서 마우스를 클릭할 때만

    팝업이 뜨는건 잘 되는데, 프로그램을 실행하고 아이템 위에 올라가서 누르는

    첫번째 클릭 때는 아이템이 셀렉트만 되고 팝업 창이 뜨질 않습니다.

    두번째 클릭부터는 제가 원했던 대로 아무 문제 없이 잘 뜹니다만은...

    첫번째 클릭 때는 팝업창이 아무런 반응이 없네요. 이건 왜 이런걸까요?

    올려주신 프로퍼티로 바꾸고 나서는 잘 됩니다. 리스트뷰의 좌표를 스크린 좌표로

    바꿔야 하는 부분이 있더군요. 그것때문에 그런건가 하는 생각도 해봤는데

    그렇다면 두번째 클릭할 때부턴 문제없이 잘 된다는 것도 이상하고...

    문제가 해결됬지만 여전히 궁금한게 남아서 다시 질문드립니다. ^^;;;

    해결해주셔서 정말 감사하구요.

    참 그리고 제가 파일,폴더 등등을 구별한다는 이야기는 아이템 종류에 따라

    뜨는 팝업 메뉴가 다르다는 이야기였습니다만... 해결할 수 있을 듯 하네요.

    감사합니다~ 좋은 하루 되세요~~~

  • Profile
    최용일 2003.04.16 00:24
    안녕하세요. 최용일입니다.

    두번째부터 팝업메뉴가 뜨는것은 맨처음실행될때는 Listview1.PopupMenu에 어떤 팝업메뉴도 링크되어 있지 않지만 마우스클릭했을때 아래소스를 이용해서
    Listview1.PopupMenu := PopupMenu1;
    리스트뷰에 팝업메뉴를 연결시키니까 그 다음부터 뜨게 되는겁니다...

    아래와 같이 바꿔서 직접 팝업메뉴를 띄우세요...

    마우스이벤트에서 넘어오는 X, Y좌표를 ClientToScreen메소드를 이용해서 전역좌표로 바꾸어서 넣어주시면 됩니다.
    if item <> nil then
    begin
        ...;    // 전역좌표로 바꾸는 루틴....
        PopupMenu1.PopUp(X, Y);
    end;

    ^^ 항상 즐코하세요...

    • 김상완
    • 2003.04.15 21:31
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 서은구
      2003.04.15 21:51
      음.. 일단 클래스가 틀리겠죠.. 둘다 TCustomMemo 까지는 같이 상속을 받지만 그후에 틀려지네요.. Ric...
    • 이종택
    • 2003.04.15 21:18
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 임진묵
      2003.04.15 21:24
      확장자가  Pas 로 되어 있는 걸을.. 델파이에 Component - Install component - Unit file name...
    • 이종택
      2003.04.15 23:58
      죄송한데요.잘모르겠요.. 제가 원하는 팔레트에 올려놓고 그걸 가져다가 쓰고 싶은데 그게 잘 안되네요...
    • 임진묵
      2003.04.22 04:13
      [델5]기준으로... 메뉴에 보시면 컴포넌트에 팔레트 설정 부분이 있습니다. (제일 아래에 있어요) 그...
    • 이경남
    • 2003.04.15 20:33
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 그냥
      2003.04.15 22:25
      Access Violation 에러는 메모리관련 부분에서 에러가 발생합니다. 혹시 DB관련 내부 함수나 아님 폼에 선...
    • 최용일
      2003.04.16 00:04
      안녕하세요. 최용일입니다. 인디 8.0부터 아래와 같이 바뀌었네요...   AThread.Connectio...
    • 델파이스
      2003.04.16 20:53
    • irashi
    • 2003.04.15 20:07
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 정우성
    • 2003.04.15 19:27
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 임진묵
      2003.04.15 21:18
      이건 제가 짜본건데요.... 맞는건지.. 님꺼 보니깐.. 이해가.. 잘 ㅡ.ㅡ (죄송) 주석은 파일 안에...
    • 정우성
      2003.04.15 23:13
      관심 가져주셔서 정말 감사합니다. 님이 짜주신걸 봤는데요, 솔찍히 정말 감동이었습니다. ^^ 그런데........
    • 임진묵
      2003.04.15 23:31
      이제야 목적을 알겠군요...ㅎㅎ 제가 보냈던건 점들의 거리상 젤루 작은거리는 어느것이냐 하는 것이었습...
    • 장태원
      2003.04.15 19:51
          while cn<k do     begin     &nb...
    • 정우성
      2003.04.15 20:53
      친절한 답변 진심으로 감사드립니다. 말씀하신 부분을 고쳐서 while cn<k do     ...
    • 티모니
    • 2003.04.15 19:23
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2003.04.16 00:09
      안녕하세요. 최용일입니다. 인디 컴포넌트보시면 TIdAntiFreeze란게 있습니다. 이게 어는거 방지해줍니...
    • 김동환
      2003.05.14 18:47
      안녕 하세요.... 소스 2부분 설명드릴 려고 합니다.... 아마도 HPrt 의 변수를 선언 하실 때 Integer...
    • 최용일
      2003.04.16 00:19
      안녕하세요. 최용일입니다. 다른건 다 해결되신거 같구... 2번째 질문인데... if not OpenPrinter(AD...
    • 나명
      2003.04.16 01:41
      감사합니다. 제가 너무 바보 같아서 여기 들르신 분들 너무 번거롭게 해드린거 같네요.. 정말 무지...
    • 그냥
      2003.04.15 22:41
      uses 절에 Variants 입니다. Variant가 아닙니다. 읽다가 보니 혹시나 해서리..^^ 그리고 포인터가 상...
    • 나명
      2003.04.15 23:24
      답변 감사합니다. uses 절  도움말이나 혹시나 해서 제가 스펠링을 잘못 적었나 싶어서 여...
    • nilriri™
      2003.04.15 19:23
      1. uses 절에 Variants 가 지정되어있는지 확인해 보세요.. function VarIsNull(const V: Variant): Boo...
    • 나명
      2003.04.15 19:53
      같은 폼상에.. uses 절에는 Variant 가 지정되어 있지 않아요 그래서 써주신데로 표기해보고 다른 폼에도 ...
    • • • •
    • 궁금이
    • 2003.04.15 18:47
    • 2 COMMENTS
    • /
    • 0 LIKES
    • KDDG_ZZOM
      2003.04.15 19:16
      procedure TForm1.FormCreate(Sender: TObject); begin   Application.HintHidePause := 10000...
    • 궁금이
      2003.04.17 00:41
      답변감사합니다. 마우스를 안갖다대고 풍선만 나오게하는 방법은 업나요 클릭할때 다른곳에서 풍선이 나...
    • KDDG_ZZOM
      2003.04.15 18:39
      전 잘나오는데요??? 다시 한번 확인해보세요... 델7에서 Label1.Caption := FormatCurr('#,##', 1543500...
    • 양승렬
    • 2003.04.15 08:33
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이경문
      2003.04.15 09:34
      객체앞에 @ 를 붙이면 됩니다.
    • 서은구
    • 2003.04.15 07:00
    • 4 COMMENTS
    • /
    • 0 LIKES
    • KDDG_ZZOM
      2003.04.15 07:13
      쓰레드를 이용해서 돌리면 빠르겠지만... 350만건이면 배치성아닌가요? 우선 테이블 인덱스를 삭제하...
    • 서은구
      2003.04.15 07:30
      답변 감사합니다.. 오라클이 맞기는 한데요.. 그게 고려될 사항이 많거든요.. 하나의 테이블이 여러개로 ...
    • 거리
      2003.04.15 18:16
      많은 데이터라면 디비단에서 바로 프로시저 만들어서 쓰시기 바랍니다. jsp에서 말하는 DBConnectionPool...
    • 장태원
      2003.04.15 19:25
      쓰레드가 빠른것은 아닙니다. 어짜피 서버가 처리해야 하는 속도는 한계가 잇고. 쓰레드는 단지.. 클...
    • 푸우
    • 2003.04.15 06:16
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장태원
      2003.04.15 22:43
      Access 를 오라클 같이 사용해보세요. 오라클에스 트리거라는 이벤트형식이 존재합니다. 저장시, 삭...
    • 고가람
    • 2003.04.15 06:14
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 권순모
      2003.04.15 10:21
      리스트뷰의 마우스 다운 이벤트로 한번 만들어봤습니다. 님이 원하는데로 선택적 팝업을하려면 델파이에...
    • 고가람
      2003.04.15 18:35
      답변 감사합니다. ^^;; 아래는 제가 어제 질문을 올리고 대충 작정한 코드인데요... 답변해주신 것...
    • 최용일
      2003.04.16 00:24
      안녕하세요. 최용일입니다. 두번째부터 팝업메뉴가 뜨는것은 맨처음실행될때는 Listview1.PopupMenu에 ...
    • yuricity
    • 2003.04.15 04:40
    • 0 COMMENTS
    • /
    • 0 LIKES