放个控件在DBGRID上面不就可以了

解决方案 »

  1.   

    procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
      Field: TField; State: TGridDrawState);
    begin
         if (gdFocused in State) then
         begin
            if (Field.DataType  = ftMemo) then
            begin
                    DBMemo1.DataField :=Field.FieldName;
                    DBMemo1.Left := Rect.Left + DBGrid1.Left;
                    DBMemo1.Top := Rect.Top + DBGrid1.top;
                    DBMemo1.Width := Rect.Right - Rect.Left;
                    DBMemo1.Height := DBMemo1.Width; 
                    DBMemo1.Visible := True;
            end
            else if (Field.DataType  = ftGraphic) then
            begin
                    DBImage1.DataField:=Field.FieldName;
                    DBImage1.Left := Rect.Left + DBGrid1.Left;
                    DBImage1.Top := Rect.Top + DBGrid1.top;
                    DBImage1.Width := Rect.Right - Rect.Left;
                    if not DBImage1.Picture.Bitmap.Empty then
                            DBImage1.Height := trunc(DBImage1.Picture.Height/DBImage1.Picture.Width * DBImage1.Width)
                    else    DBImage1.Height :=DBImage1.Width;
                    DBImage1.Visible := True;
            end;
         end;end;procedure TForm1.DBGrid1ColExit(Sender: TObject);
    begin
         If DBGrid1.SelectedField.FieldName = DBMemo1.DataField then
             DBMemo1.Visible := false
         else If DBGrid1.SelectedField.FieldName = DBImage1.DataField then
             DBImage1.Visible := false;end;procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
    begin
         if (key <> chr(9)) then
         begin
            if (DBGrid1.SelectedField.FieldName = DBMemo1.DataField) then
            begin
                    DBMemo1.SetFocus;
                    SendMessage(DBMemo1.Handle, WM_Char, word(Key), 0);
            end
            else if (DBGrid1.SelectedField.FieldName = DBImage1.DataField) then
            begin
                    DBImage1.SetFocus;
                    SendMessage(DBImage1.Handle, WM_Char, word(Key), 0);
            end;
         end;
    end;上面的例子是把一个DBImage和DBMemo放进DBGrid
    事先在Form上任意放置一个DBImage和DBMemo,设为不可见。
      

  2.   

    这个原理我是知道,但是我有发现一个问题不知如何解决:
    就是在cell中加入combox后缩小该column的宽度combox的宽度还保持原来的宽度,
    影响美观,不知如何解决
      

  3.   

    你详细的看一下DBGrid的Column中的属性,你会发现更好的方法。
    因为我不知道你的具体目的,所以不能具体的讲。
      

  4.   

    (这个原理我是知道,但是我有发现一个问题不知如何解决:
    就是在cell中加入combox后缩小该column的宽度combox的宽度还保持原来的宽度,
    影响美观,不知如何解决 )
    我的意思就是把一个DBComBox放进DBGrid后(不用Column中PickList属性)
    缩小该column的宽度,放进DBGrid该Cell的DBComBox的宽度还保持原来的宽度???
      

  5.   

    send me email ,i give you code
      

  6.   

    加入if not DBMemo1.Focused then  DBMemo1.Visible :=False;
    在if (gdFocused in State) then
         begin
    的前面,对于其他也一样。