Listview中通过自画方式能够嵌入panel或ComboBox之类的组件吗?

解决方案 »

  1.   

    public
        { Public declarations }
        Pos:TPoint;
        FComboBox: TComboBox;
        procedure GetModID(i :Integer);
        procedure CreateCombobox(var aComboBox:TCombobox;aLeft, aTop,Width: integer;txt: String);
        procedure MyComboBoxChange(Sender: TObject);
        procedure MyComboBoxExit(Sender: TObject);
        procedure DestroyCom;
    procedure TFrmUser.CreateCombobox(var aComboBox: TCombobox; aLeft, aTop,
      Width: integer; txt: String);
    begin
       aComboBox := TComboBox.Create(Self);
       aComboBox.Parent := Self;
       aComboBox.OnChange := MyComboBoxChange;
       aComboBox.OnExit := MyComboBoxExit;
       aComboBox.DropDownCount := 5;
       aComboBox.Style := csDropDown;   aComboBox.Items.Add('0');
       aComboBox.Items.Add('1');
       aComboBox.Items.Add('2');
       aComboBox.Items.Add('3');
       aComboBox.Items.Add('4');
       aComboBox.Left := aLeft + ListView2.Left + 1;
       aComboBox.Top := aTop + ListView2.Top + 1;
       aComboBox.Width := Width;
       aComboBox.BringToFront;
       aComboBox.SetFocus;
       aComboBox.Text := txt;
    end;procedure TFrmUser.DestroyCom;
    var
      lp: integer;
    begin
      for lp := ComponentCount - 1 downto 0 do
      begin
        if Components[lp] is TCombobox then
        begin
          TCombobox(Components[lp]).Free;
        end;
      end;
      FComboBox := nil;
    end;
    procedure TFrmUser.GetModID(i: Integer);
    begin
       RoleID := I;
    end;procedure TFrmUser.MyComboBoxChange(Sender: TObject);
    begin
       if ListView2.Selected.Checked then
        ListView2.Selected.SubItems[0] := TCombobox(Sender).Text;
    end;procedure TFrmUser.MyComboBoxExit(Sender: TObject);
    begin
      try
        FComboBox.Free;
      except
      end;
      FComboBox := nil;
    end;
    var
       i,j: Integer;
       End_Y,End_X,Begin_X,Begin_Y,DO_X,DO_Y: Integer;
    begin
       End_X := 0;
       Begin_X := 0;
       DestroyCom;
       for i:= 0 to ListView2.Columns.Count -1 do
       begin
          if I > 0 then
             Begin_X := Begin_X  + ListView2.Columns[i-1].Width
          else
             Begin_X := Begin_X ;
          End_X := End_X  + ListView2.Columns[i].Width;
          if  (Pos.X >Begin_X) and (Pos.x <End_X) then
          begin
             DO_X := Begin_X;
             for j := 0 to ListView2.Items.Count -1 do
             begin
                Begin_Y :=  ListView2.Items[j].Top;
                if J <ListView2.Items.Count -1 then
                   End_Y :=  ListView2.Items[j+1].Top
                else
                   End_y := ListView2.Items[j].Top + ImageList1.Height;
                   if  (Pos.Y >Begin_Y) and (Pos.Y <End_Y) then
                   begin
                      Do_Y := Begin_Y;                  if i> 0 then
                      CreateCombobox(FComboBox, Do_X, DO_Y,ListView2.Columns[i].Width-2,ListView2.Items[j].SubItems[i-1]);
                      ListView2.Selected := ListView2.Items[j];
                   end;
             end;
           end;
       end;
    end;procedure TFrmUser.ListView2MouseDown(Sender: TObject;
      Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
       Pos.X := x;
       Pos.Y := y;
    end;
    代码片断实现我指定的列里画COMBOBOX但是当我拉动旁边滚动条时,我就没有办法了
      

  2.   

    谢linkyou(chenhong) 
    也谢 langziwujia007(※刑警队长※)同志的参与