怎样实现stringgrid中每一个cells格子中的字以各自的颜色显示(100分)

  • 主题发起人 主题发起人 wjxiaoshen
  • 开始时间 开始时间
W

wjxiaoshen

Unregistered / Unconfirmed
GUEST, unregistred user!
能在鼠标放于每一行上时,改行立体凸出

能在该了其中一格中的内容后,该格内容变颜色
 
TStringGrid.OnDrawCell
 
除了用OnDrawCell之外,还需要建立一个数组之类的来保存每个Cell的颜色
 
看下列的,,,,
procedure TFMAIN.PLANGRIDDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
showme,st,tt:string;
RectWidth, StartHere : integer;
listn,lists:integer;
a,b,c,d,e,f,g,h,i,n,GG:integer;
// qexy,qedy,cexy,cedy,tco:tcolor;//缺额小于 缺额大于 超额小于 超额大于
begin
if (Sender IS TStringGrid) then
with TStringGrid(Sender) do
BEGIN
ShowMe := Cells[ACol, ARow];
IF SHOWME<>'' THEN
begin
VAL(SHOWME,GG,N);
if n=0 then
begin
LISTN:=FSETUP.mainstr.Count;
ST:=CELLS[0,AROW];
IF ST<>'' THEN
BEGIN
LISTS:=0;
WHILE LISTS<LISTN DO
BEGIN
tt:=trim(copy(fsetup.mainstr.Strings[lists] ,length('编号为: '),length(fsetup.mainstr.Strings[lists])-length('编号为: ')+1));

IF ST=TT THEN
BEGIN
ST:=FSETUP.TreeView1.Items[0].ITEM[LISTS].ITEM[2].TEXT;
ST:=COPY(ST,12,LENGTH(ST)-11);
VAL(ST,A,B); //A为限额数量

ST:=FSETUP.TreeView1.Items[0].ITEM[LISTS].ITEM[3].TEXT;
I:=INSTRL(ST,'低');
ST:=COPY(ST,12,I-12);
VAL(ST,C,D);//C为不足中的分隔线

ST:=FSETUP.TreeView1.Items[0].ITEM[LISTS].ITEM[4].TEXT;
I:=INSTRL(ST,'低');
ST:=COPY(ST,12,I-12);
VAL(ST,E,F);//e为超过中的分隔线

ST:=CELLS[2,AROW];
VAL(ST,G,H);//G是剩余数量
//GG是要填入的数字

IF (B=0) AND (D=0) AND (F=0) THEN
BEGIN
if (GG<=C) and (ACOL=4) then
begin
if (h=0) and ((gg+g)=a) then
begin

canvas.brush.Color:=cLYELLOW;
canvas.Font.Color:=clred;
canvas.FillRect(rECT);
canvas.TextRect(rect,0,0,inttostr(i));
end;
end;



if (GG>=C) and (ACOL=4) then
begin
if (h=0) and ((gg+g)=a) then
begin

canvas.brush.Color:=clRED;
canvas.Font.Color:=clYELLOW;
canvas.FillRect(rect);
canvas.TextRect(rect,0,0,inttostr(i));
end;
end;

if (GG<=E) AND (ACOL=5) then
begin
if (h=0) and ((gg+a)=g) then
begin

canvas.brush.Color:=clYELLOW;
CANVAS.Font.Color:=CLRED;
canvas.FillRect(rect);
canvas.TextRect(rect,0,0,inttostr(i));
end;
end;
if (GG>=E) and (ACOL=5) then
begin
if (h=0) and ((gg+a)=g) then
begin

canvas.brush.Color:=CLGREEN;
CANVAS.Font.Color:=CLWHITE;
canvas.FillRect(rect);
canvas.TextRect(rect,0,0,inttostr(i));
end;
end;

END//END OF B=0 AND D=0 AND F=0
ELSE
BEGIN
//MESSAGEBOX(0,PCHAR('剩余数量一格所填不是数字,请改正!'),PCHAR('发现错误'),MB_OK);
END;//END OF ELSE BEGIN

END;//END OF IF ST=TT
INC(LISTS);
END;//END OF WHILE LISTS<LISTN

END;//END OF IF ST<>''


end;//end of n=0

end;//end of showme<>''
end;//end of with sender



if (sender is tstringgrid) then
with tstringgrid(sender) do
begin
ShowMe := Cells[ACol, ARow];
RectWidth := Rect.Right - Rect.Left;
if arow=0 then
begin
starthere:=rect.Left+(rectwidth-canvas.textwidth(cells[acol,arow]))div 2;
end
else
begin
StartHere := Rect.Left -2+
((RectWidth - Canvas.TextWidth(Cells[ACol, ARow]) ) );
end;
Canvas.FillRect(Rect);
Canvas.TextOut(StartHere, Rect.Top+2, Cells[ACol,ARow]);

end;//end if if sender is tstringgrid

end;
 
只能自己画了。
当然 EasyGrid 也可以,不过她还藏在深闺呢,总有一天会和大家见面的。
 
接受答案了.
 
你可根据该办法用delphi来实现
TStringGrid 是C++ Builder 提 供 给 用 户 的 一 种 字 符 网 格 控 件。 美 中 不 足 的 是, 它 没 有 提 供 分 别 修 改 各 单 元 字 体 颜 色、 大 小 的 方 法。 其 实 要 为TStringGrid 实 现 这 样 功 能, 只 需 在 程 序 中 稍 加 处 理 就 行 了。 方 法 是 自 定 义 一 个 二 维 数 组 cellbuf, 它 的 下 标 与 网 格 单 元 列 行 一 一 对 应, 用 于 存 放 各 网 格 单 元 的 颜 色、 文 字 等 信 息。
struct CellStru
{
AnsiString msg; // 文 字 信 息
TColor color; // 文 字 颜 色
};

CellStru cellbuf[MAXCOL][MAXROW];

初 始 化cellbuf 后, 再 在 字 符 网 格 控 件 StringGrid1 的OnDrawCell 响 应 事 件 中, 加 入 如 下 的 代 码 即 可。
void __fastcall TForm1::StringGrid1DrawCell (TObject *Sender, int Col,
int Row, TRect &Rect, TGridDrawState State)
{
StringGrid1- >Canvas- >Font- > Color=cellbuf[Col][Row].color;
StringGrid1- >Canvas- >TextOut(Rect.Left+3, Rect.Top+3,cellbuf[Col][Row].msg);

}
 

Similar threads

回复
0
查看
978
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
748
import
I
后退
顶部