Q&A

  • 된 폼위에 리스트 박스 ...
다덜 안녕하세요
오랜만에 들어왓는데 좋은 글은 못 남기고 질문만 드리고 갑니다.

type
    ...
    procedure Button3Click(Sender: TObject);
    procedure memberboxclick(Sender: TObject);
    procedure memberboxmousedown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);


procedure TForm1.Button3Click(Sender: TObject);
var
    listform : TForm;
    memberbox, procbox : TListBox;
begin

    listform := TForm.Create(self);
    listform.Left := 10;
    listform.Top := 10;
    listform.Width := 200;
    listform.Height := 500;
    listform.show;

    procbox := TListBox.Create(self);
    procbox.parent := listform;
    procbox.Left := -1000;
    memberbox := TListBox.Create(self);
    memberbox.Parent := listform;
    memberbox.Align := alclient;
    memberbox.OnClick := memberboxclick;
    memberbox.OnMouseDown := memberboxmousedown;

end;


procedure TForm1.memberboxmousedown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  p:Tpoint;
  count:integer;
begin
  if button = mbRight then
  begin
    p.x := x;
    p.y := y;
    if memberbox.ItemAtPos(p,true) <> -1 then
    begin
      for count := 0 to memberbox.Items.Count-1 do
      begin
        memberbox.Selected[count] := false;
      end;
      memberbox.Selected[memberbox.ItemAtPos(p,true)] := true;
      p:=memberbox.ClientToScreen(p);
    end;
  end;
end;

memberboxmousedown 에서 실행하지 못하고 에러가 납니다.
폼을 생성하고 생성된 폼위에 리스트 박스를 올려서 작업을 하려고 하는데 왜 에러가 나는지 잘 모르겠네요

답변 부탁드립니다.
그럼 이만...
4  COMMENTS
  • Profile
    박성훈 2002.01.22 01:29


    안녕하세요.
    리스트박스를 오른쪽버튼으로 선택하는 코드네요.
    제가 해본 결과로는 에러는 안떨어지는데요.
    다만, 리스트박스의 MutiSelect속성이 False로 되어 있으면 에러가 나게 됩니다. Selected속성은 MultiSelect속성이 활성화 되어 있을 때 사용가능하군요.

  • Profile
    조헌철 2002.01.22 01:41

    희한하네요
    MultiSelect속성도 true로 바꾸고 해 봐도 안되는데
    님은 어디서 해 봤는지
    머튼을 누르면 폼을 생성한 뒤 그위에 리스트 박스를 생성했는데 연결고리 같은게 필요한것 같은데
  • Profile
    최용일 2002.01.22 02:32
    안녕하세요. 최용일입니다.

    보니까 memberbox란 리스트박스가 Button3의 클릭이벤트에서 로컬로 변수선언 되어 있던데 이렇게 되면 memberbox란 것은 이 이벤트 내에서만 유효한 값을 가집니다. MemberBoxMouseDown이벤트에 있는 memberbox와는 다르죠...

    이벤트가 발생하면 Sender로 그 이벤트를 발생시킨 객체가 들어옵니다.
    그러니까 아래처럼 형변환해서 사용해보세요...

    procedure TForm1.memberboxmousedown(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: Integer);
    var
        p:Tpoint;
        count:integer;
    begin
        if button = mbRight then
        begin
            p.x := x;
            p.y := y;
            if TListBox(Sender).ItemAtPos(p,true) <> -1 then
            begin
                for count := 0 to TListBox(Sender).Items.Count-1 do
                begin
                    TListBox(Sender).Selected[count] := false;
                end;
                TListBox(Sender).Selected[memberbox.ItemAtPos(p,true)] := true;
                p:=TListBox(Sender).ClientToScreen(p);
            end;
        end;
    end;

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

  • Profile
    조헌철 2002.01.22 18:52
    역시 최용일님

    감사합니다.

    해결 했습니다.