안녕하세요.. 날씨가 많이 풀렸네요.. 그래도 건강들 조심하세요.. ^^
다름이 아니라.. 각종 Grid나 리스트 박스에서 멀티셀렉트시 컨트롤키를
누른채 클릭하면 다중선택이 되는데, 컨트롤키를 누르지 않고 클릭만 으로
다중선택이 되도록 구현하고 싶습니다.
어떤 시점에(어떤 이벤트발생시) 컨트롤키가 눌린 효과를 줘야 컨트롤키를
누른채 마우스클릭을 한 효과를 줄수 있을까요?
참고로 OnMouseDown, OnKeyDown등의 이벤트에 컨트롤키가 눌린효과를 줘도
제가 원하는 효과를 얻을수 없더군요..
Down이벤트가 발생하는 시점에는 이미 마우스키 등이 눌려 버렸기 때문에
그시점에 컨트롤키가 눌린 효과를 줘봤자 뒷북인듯 싶더군요..
마우스 버튼은는 먼저 눌러놓고 나중에 컨트롤 키를 누른것과 동일하다는 이야깁니다...
또 OnMouseMove이벤트에 컨트롤키가 눌린효과를 주면
제가 원하는 효과를 얻을수 있긴 한데, 그때 마우스 휠을 움직이거나 F11키를
누르거나 하면 컨트롤 키가 눌린 상태이므로 제가 원하지 않는 여러가지 현상이
발생합니다.. 예를 들면 폰트가 작아진다거나 익스플로러의 툴바가 없어진다거나..
(쩝.. 제가 지금 엑티브엑스로 뭔짓을 하고 있어서.. ^^;)
여러가지 기현상이 발생해서 컨트롤키를 안누르고 멀티셀렉트하는 장점보다
단점이 더 많이 생겨서.. OnMouseMove는 포기해야 할것 같습니다..
정확히 마우스키가 눌리는 시점에만 Ctrl + OnMouseDown 현상을 발생시키고
MouseUp될때 Ctrl키가 눌린것을 해제해주면 될것같은데..
막강고수님들의 한수 부탁드립니다..
그럼 답올라올때까지 눈빠지게 기둘리겠습니다.. ^^;
또한 다른 컴포실행시엔 컨트롤 키를 해제시킴니다
그리고 더블 클릭시 컨트롤키를 해제시킴니다.
private
{ Private declarations }
DblClick :boolean; //마우스더블클릭에 필요한 변수
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
pKeyboardState : ^TKeyboardState;
begin
if (DblClick = false) then begin
New(pKeyboardState);
GetKeyboardState(pKeyboardState^); //초기 상태 구함
pKeyboardState^[VK_CONTROL] := $80; //Ctr키를 누를 상태로 설정
SetKeyboardState(pKeyboardState^);
end
else
DblClick := false;
end;
procedure TForm1.ListBox1Exit(Sender: TObject);
var
pKeyboardState : ^TKeyboardState;
begin
New(pKeyboardState);
GetKeyboardState(pKeyboardState^); //초기 상태 구함
pKeyboardState^[VK_CONTROL] := $0; //Ctr키를 누를 상태해제
SetKeyboardState(pKeyboardState^);
end;
procedure TForm1.ListBox1DblClick(Sender: TObject);
var
pKeyboardState : ^TKeyboardState;
i : integer;
begin
DblClick := True;
New(pKeyboardState);
GetKeyboardState(pKeyboardState^); //초기 상태 구함
pKeyboardState^[VK_CONTROL] := $0; //Ctr키를 누를 상태해제
SetKeyboardState(pKeyboardState^);
for i := 0 to ListBox1.Items.Count-1 do
ListBox1.Selected[i] := False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DblClick := false;
end;
hsr///////////////////////////////////////////////////