@@@我想从TDBGrid继承一个子类,可以实现奇偶行的颜色交替,但遇到了问题,请大家帮忙看看@@@(50分)

  • 主题发起人 maple_guo
  • 开始时间
M

maple_guo

Unregistered / Unconfirmed
GUEST, unregistred user!
我新增了四个TColor属性并用default指定了不同缺省值,但在安装该控件后每次新增该控件,那些新增的属性在ObjectInspecter中显示的却总是clBack,为什么?怎样改?谢谢!
代码:
    property SelectedCellBackColor: TColor read FSelectedCellBackColor
      write SetSelectedCellBackColor [b]default[/b] clHighlight;
    property SelectedCellFontColor: TColor read FSelectedCellFontColor
      write SetSelectedCellFontColor [b]default[/b] clHighlightText;
    property FirstAlternateColor: TColor read FFirstAlternateColor
      write SetFirstAlternateColor [b]default[/b] clSkyBlue;
    property SecondAlternateColor: TColor read FSecondAlternateColor
      write SetSecondAlternateColor [b]default[/b] clWhite;
 
default 的意思不是自动设置,而是当你的颜色与 default 的颜色相同时 dfm 不用存储它。
缺省颜色得你自己在 create 的时候设置的。
XXXX.create(owner: TComponent);
begin
inherited Create(Owner);
FSelectedCellBackColor := clHightlight;
...
end;
 
"default 的意思不是自动设置,而是当你的颜色与 default 的颜色相同时 dfm 不用存储它。"这句话的意思是否就是说当我在设计期设定的颜色与 default 的颜色相同时 dfm 就不存储?

因为我现在发现,当我在设计期设定的颜色跟 default 的一样的话,运行时就全变成黑色的了,不知道是不是就是上面所说的原因?
 
啊不会吧。肯定其它的代码有问题了。
 
应该是其它的代码有问题!
 
是真的,我的其它代码:
代码:
procedure TColorDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer;
  Column: TColumn; State: TGridDrawState);
begin
  inherited;
  if ((State = [gdSelected]) or (State = [gdSelected, gdFocused])) then
  begin
    Canvas.Brush.Color := ColorSelectedCellBack;
    Canvas.Font.Color := ColorSelectedCellFont;
  end
  else begin
    if DataSource.DataSet.RecNo mod 2 <> 0 then
      Canvas.Brush.Color := ColorAlternateFirst
    else
      Canvas.Brush.Color := ColorAlternateSecond;
  end;
  DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
 
不知道是什么原因,如果设成其它颜色的话就不会出现上面所说的情况!
 
我技穷了。。。。。。。。。。。。
 
DataSource.DataSet.RecNo
這個有時行有時不行
 
to goddy:
我没遇到过,以前都是写在DBGrid里的,后来应用多了,所以就想封装起来,结果就遇到了上面的问题,我对这方面一点都不熟悉,所以请高手指点, waiting...
 
不要再DrawColumnCell中写,RecNo在大型数据库中无用,要重写DrawCell,看一下CustomDBGrid
的原码.
 
好,我试试
但我上面的问题还没有解决,我用的是ACCESS.
 
原因大概找到了,没有定义sender
你的代码修该后,直接运行:
if ((State = [gdSelected]) or (State = [gdSelected, gdFocused])) then
begin
Canvas.Brush.Color := clgreen;
Canvas.Font.Color := clwhite;
end
else begin
if DataSource1.DataSet.RecNo mod 2 <> 0 then
Canvas.Brush.Color :=clred
else
Canvas.Brush.Color := clyellow;
end;
dbgrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
没有效果。
我改后:
if ((State = [gdSelected]) or (State = [gdSelected, gdFocused])) then
begin
dbgrid1.Canvas.Brush.Color := clgreen;
dbgrid1.Canvas.Font.Color := clwhite;
end
else begin
if DataSource1.DataSet.RecNo mod 2 <> 0 then
dbgrid1.Canvas.Brush.Color :=clred
else
dbgrid1.Canvas.Brush.Color := clyellow;
end;
dbgrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
就OK了。
 
注意,我说的问题是,如果颜色设置跟default的一样的话,在设计期是可以看到效果的,不过一运行就全变成黑的了。[?]
但是如果我在create里面初始化一下,就没有这个问题了。
代码:
constructor TColorDBGrid.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FColorSelectedCellBack := clHighlight;
  FColorSelectedCellFont := clHighlightText;
  FColorAlternateFirst := $00F2F2F2;
  FColorAlternateSecond := clWhite;
end;

请解释一下到底是什么原因,谢谢!
 
有的话给我一份
E_Mail:Wenhongqiu@163.com
 
给我发一份原代码吧,我看不明白。
[:)] wang2855@etang.com
 
问maple_guo:在设计期是可以看到效果的?我看不到,看到的也是黑色![?]
问交通银行:Sql Server 是可以这样用的,能告诉我其他的情况吗?[?]
 
顶部