DELPHI4中dbgrid拷贝与时间的显示(200分)

  • 主题发起人 主题发起人 jlle
  • 开始时间 开始时间
J

jlle

Unregistered / Unconfirmed
GUEST, unregistred user!
1:如何选定一个DBGRID中的任意几列并加亮显示;如何拷贝DBGRID中的任意几列并复制到另一个DBGRID中?
2:如何修改DELPHI的原代码使得在DELPHI中显示出的所有日期的年份均为4位
(仅限于修改DELPHI原有的代码而不是修改操作系统或在每编一个程序时都使用格式输出
 

对第二个问题,据我所知,可以在BDE的administrator里面进行设置。
第一个问题,我不清楚怎样选定几列(印象中没有这样的方法),
但是复制是没有必要的,只要把两个DBGrid的datasource设成一样,
改变columns属性就行了。
 
1.在DBGRID中的OPTIONS中把DGMULTISELECT设为TRUE,在运行时按CTRL键,用鼠标
点击要选择的行前就可以了, 也可以按住CTRL,用键盘光标键上下移动.在程序中,
要处理选中的行用SELECTEDROWS.

2.查查已答问题.
 
1 可以设置DBGrid为复选,其复选项只是提供了几个BOOKMARK,
要拷贝嘛顺着书签一条条下来就行了。
2 在主程序的FormCreate 中加上下面几句就行啦
DateSeparator := '/';
LongDateFormat := 'YYYY/MM/DD';
ShortDateFormat := 'YYYY/MM/DD';
 
glassguo的答案不正确, 日期显示与控制面板里的国家设置有关
wuyi和xixi 关于DBGRID多选的回答也有问题,请注意 提问者要求的是
DBGRID的选择列

xixi 关于日期显示的回答我以前试验过,似乎不正确,正确的用法是
使用FIELD的displayformat 属性比较好
fieldbyname('ADateField').DisplayFormat := 'yyyy/mm/dd';
fieldbyname('BDateField').DisplayFormat := 'yyyy/mm/dd HH:MM:SS';

DBGRID的列多选高亮问题,可以按下面的思路做,仅仅是个简单参考

var
Form1: TForm1;
a : Integer;
implementation

{$R *.DFM}

//在DBGRID的ONTITLECLICK事件里写

procedure TForm1.DBGridPlus1TitleClick(Column: TColumn);
begin
Caption := IntToStr( Column.Index );
a := Column.Index;
DbGridPlus1.Invalidate;
end;

//在 Dbgrid的OnDrawColumnCell里写
procedure TForm1.DBGridPlus1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
If Column.Index = a Then
With DbGridPlus1.Canvas do
begin
Brush.Color := ClLime;
Font.Color := ClBlue;
DBGridPlus1.Canvas.TextOut( Rect.Left +1 ,Rect.top+1,
DBGridPlus1.DataSource.DataSet.fields[a].DisplayText);
end;
end;

当然实际操作中应该是这样,建立一个 tLIST, 用来保存选中的 字段 Column
的序号INDEX, 每次TITLECLICK时,在tlist 里查找是否已经含有此COLUMN的
INDEX,如果有,就清除掉,如果没有,就将INDEX加到列表里去


在上面的 OnDrawColumnCell 里去判断当前要绘制的Column.Index是否在
tList里存在,如果存在就画成特别的颜色

 
我觉得如果只是几列dbgrid的话,只需在desc dbgrid中设置几个columns,再设定
一下field就可以了,至于高亮列的方法,可以按王寒松思路做。
 
1.王兄的方法可以.另外,还可以更简单一些,不用建个List之类的。
利用Column.Field.Tag即可。

在TitleClick事件中:
procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
if Column.Field.tag=0 then
Column.Field.Tag :=1
else
Column.Field.Tag :=0;
Dbgrid1.Repaint ;
end;

在DrawColumnCell事件中,DefalutDrawing设为false:
with dbgrid1.Canvas do
begin
if Column.Field.Tag=1 then
begin
Brush.Color :=clred;
dbgrid1.DefaultDrawColumnCell(rect,datacol,column,state);
end
else
begin
Brush.Color :=clwindow;
dbgrid1.DefaultDrawColumnCell(rect,datacol,column,state);
end;
end;

所谓的复制到另一个Dbgrid也只是对应的同一个数据集,那个Field.tag=1既表示被选中,visible=true既可,其它的visible概为false.

2.应该是xixi说的吧,这种方法我没有遇到过问题。
 
比较满意
 
怪事,既然满意如何不给分呢? :)
只好我来了。
 
后退
顶部