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;