dbgrid

dbgrid中移动焦点到指定的行和列   dbgrid是从TCustomGrid继承下来的,它有col与row属性,只不过是protected的,不能直接访问,要处理一下,可以这样:

    TDrawGrid(dbgrid1).row:=row;
    TDrawGrid(dbgrid1).col:=col;
    dbgrid1.setfocus;
就可以看到效果了。

    1 这个方法是绝对有问题的,它会引起DBGrid内部的混乱,因为DBGrid无法定位当前纪录,如果DBGrid只读也就罢了(只读还是会出向一些问题,比如原本只能单选的纪录现在可以出现多选等等,你可以自己去试试),如果DBGrid可编辑那问题就可大了,因为当前纪录的关系,你更改的数据字段很可能不是你想象中的
    2 我常用的解决办法是将上程序改为(随便设置col是安全的,没有一点问题)

    Query1.first;
    TDrawGrid(dbgrid1).col:=1;
    dbgrid1.setfocus;

    这就让焦点移到第一行第一列当中

如何使DBGrid的指针不移动?
【问题】:我用DBGRID显示TABLE中的内容,现在我要从头到尾读一遍TABLE里的数据,用
Table1.First,Next来做会使DBGRID里面的指针也跟着跑,怎么才能使这时候DBGRID里面的指针不
动呢?

【答案】:使用如下代码即可:

with DataSet do
try
  DisableControls;
   Do_something;
finally
   EnableControls;
end;

在DBGrid控件中显示图形 如果在数据库中设置了一个为BLOB类型的字段用于保存图形,在使用DBGrid控件显示时,在表格中显示的是BLOB,而无法显示出图形,当然,有一些第三方控件可以显示出图形,但是要去找第三方控件不是一件容易的事,而且有些好用的都需要付费。能不能在DBGrid中显示图形呢?答案是肯定的。
在DBGrid的OnDrawCell事件中加入如下代码即可在DBGrid控件中显示图形。
var
  Bmp: TBitmap;
begin
  if (Column.Field.DataTyp = ftBLOB) or (Column.Field.DataTyp = ftGraphic) then
  begin
    Bmp:=TBitmap.Create;
    try
      Bmp.Assign(Column.Field);
      DBGrid1.Canvas.StretchDraw(Rect,Bmp);
      Bmp.Free;
    Except
      Bmp.Free;
    end;
  end;
end;
按照类似的方法,就可以在DBGrid中显示Memo类型的字段内容。
另外,在往数据库中保存图形时,建议使用EMF图元文件,这样数据库文件的大小不会变的十分惊人,我试过了,同样是一幅400*300的图形,如果用位图,保存100多幅时,数据库文件大小会达到近20MB,而使用EMF矢量图形保存,保存800多幅时才260多KB,保存EMF矢量图形的方法与保存位图是差不多的,在DBGrid中显示也差不多,只不过BLOB型字段内容不能直接Assign给EMF文件,要用MemoryStream来中转。

如何侦测DBGrid目前的记录与栏位资讯   请问用什麽方式可以抓到游标或滑鼠目前所在DBGrid的Record? 我的意思是,让游标所在之record可以立即显示在另外的edit 内

    如果您的问题是对应一组 Edit 元件的话, 建议采用 TDBEdit 或 TDBLabel, 可以不必再费心管记录位置;
    如果是只有一个 EditBox, 内容要一直反应 DBGrid 的目前记录的目前栏位, 那可以同时在 DataSource 的 OnDataChange 与 DbGrid 的 OnColEnter 这两个事件中写更新EditBox内容的程式.
    例如 DBGrid 的 OnColEnter 事件:

procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
  if DBGrid1.SelectedField <> nil then
    Edit1.Text := DBGrid1.SelectedField.AsString;
end;

    但只靠 OnColEnter 是不够的, 因为, 在同一个 Column(同一个栏位)上下移动反白方格时, OnColEnter 是不会被触发的, 所以, 可以再搭配 OnDataChange事件, 在 State 为 dsBrowse 时的 DataChange, 可以视同记录位置的改变,以下的程式是呼叫 DBGrid 的 OnColEnter 事件处理程序:

procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
  if DataSource1.State = dsBrowse then
    DBGrid1ColEnter(Sender);
end;

procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect; Field: TField; State: TGridDrawState);

var Temp:string; //说明一个字符串变量,用于暂存放单精度的数值

begin

with(Sender as TDBGrid).Canvas do

begin

FillRect(Rect);

//对字段的值的数据类型进行判断,如果是浮点型则进行格式设置

if (Field.DataType = ftFloat) then

begin

if not (field.IsNull) then

//当字段的值不为空时,调用format函数,对数值的格式进行设置

{格式字符串‘%8.4f'表示显示长度为8,以4位小数的形式输出。如果要改变输出的长度及小数位数,只须修改格式字符串即可。如要保留两位小数,则用‘%8.2'。更多的信息,请参考Delphi帮助文档}

temp:= format(‘%8.4f',[strtofloat(field.asstring)]);

TextOut(Rect.Right-TextWidth(temp)-3,Rect.Top+3, temp);//左对齐画出单元

end

else

TextOut(Rect.Left+2,Rect.Top+3,Field.AsString);

end;

end;

转载于:https://www.cnblogs.com/zsdentist/articles/1562907.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值