StringGrid 控件,某Cells[i,j] 中数据动态更新的同时,改变该字体颜色,如何“给人感觉闪一下”?(类似股票行情界面) (100分)

  • 主题发起人 主题发起人 eachbuilder
  • 开始时间 开始时间
E

eachbuilder

Unregistered / Unconfirmed
GUEST, unregistred user!
ListView控件,某SubItems中数据动态更新的同时,改变该SubItems字体颜色

现在改用 StringAlignGrid 控件:
我想要实现的是,比如:某 Cells[i,j] 原来的颜色是红色,当其数据更新后,立即由红色变为
蓝色,给人感觉闪一下,然后立即变为原来的红色。现在颜色改很方便,关键是如何“给人感觉闪一下”?
望哪位高手给看一下,最好给点代码。

 
要改变字体的颜色只能自己处理ListView的OnCustomDraw事件来自己画
查查以前的帖子就知道怎么做了
 
我想要实现的是,比如:某SubItems原来的颜色是红色,当其数据更新后,立即由红色变为
蓝色,给人感觉闪一下,然后立即变为原来的红色。望哪位高手给看一下,最好给点代码,
万分感谢,分不够的话,可以再加。
 
要么就连caption一块变一下,不然搞不定
 
to 完颜康:
连caption一块变,来点代码
 
我随便说说的,嘿嘿,
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
defaultdraw := True;
with Listview1.canvas do
begin
if cdsSelected in State then
font.color := clred
else
font.color := clblue
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ListView1.SetFocus;
ListView1.Selected := ListView1.Items[1];
ListView1.Selected.MakeVisible(false);
Application.ProcessMessages;
sleep(100);
ListView1.Selected := nil;
end;
期待比较好的方案
 
to 完颜康:
所有的数据全部是蓝色,怎么回事?|
还有,ListView的 OwnerDraw 是否需要打开,我一打开,
除了 Caption ,其他什么也没有。
我是这样做的:
程序初始化中用 StringList 填充所有行的 Caption,其他的都填充 0 ,
然后当数据来时,用 ListView.Items.SubItems[j]:='NewData' 赋值更新;
现在要实现的是,在同时,改变颜色(类似股票行情界面)。
 
在完颜康的基础上改的。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
ListView1: TListView;
procedure Button1Click(Sender: TObject);
procedure ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
procedure FormCreate(Sender: TObject);
private
index:integer;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin

index:=ListView1.Items[1].index;
ListView1.Refresh;
sleep(100);
index:=-1;
ListView1.Refresh;

end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin

defaultdraw := True;
with Listview1.canvas do
begin
if index = Item.index then
font.color := clblue
else
font.color := clred
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
index:=-1;
end;

end.
 
CustomDrawItem中还是像我那样写,在需要改颜色的地方这样写,试试

index:=ListView1.Items.index;
ListView.Items.SubItems[j]:='NewData';
ListView1.Refresh;
sleep(100);
index:=-1;
ListView1.Refresh;
 
颜色不能复位,屏幕抖的厉害,机器变慢,咋回事?能不能给一个完整的例程。
 
嘿嘿,一开始我真的是随便说说的,后来就被点名了:(,只好硬着头皮...
这个方法比较不好的,他每次要重画整个listview,因该想法子只画改动的那一行比较好
你出现的问题是不是 你win98+D5丫?嘿嘿,资源浪费殆尽,,,,传说是win的bug
 
现在改用 StringAlignGrid 控件:
我想要实现的是,比如:某 Cells[i,j] 原来的颜色是红色,当其数据更新后,立即由红色变为
蓝色,给人感觉闪一下,然后立即变为原来的红色。现在颜色改很方便,关键是如何“给人感觉闪一下”?
望哪位高手给看一下,最好给点代码。
 
x:=integer;
改为蓝色
for i:=0 to 1000000 do x:=x+1; //根据闪动时间的需要可调整循环次数。
改为红色;
 
to HunterTeam:
你的意思是用延时技术,可我的程序对实时性要求很高(类似股票行情程序),是否还有
其它妙计,望高手指点,谢谢!
 
还有,如果有很多Cells[i,j] 数据同时更新的话,应该能看到很多数据在闪烁,如果用
HunterTeam 的循环技术对每一个 Cells[i,j] 延时的话,实时性就不能保证,望高手指点,
最好给点具体代码,万分感谢!!
 
应该不难吧!

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;

type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TEdit;
procedure Edit1Change(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
private
{ Private declarations }
public
Start:Boolean;
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit1Change(Sender: TObject);
begin
Start:=True;
//开始改变.
StringGrid1.Cells[1,1]:=Edit1.Text;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
StringGrid1.Canvas.Font.Color:=StringGrid1.Font.Color;
if (ACol = 1) and (ARow=1) then//如果是第一格.
begin
if Start then//如果开始改变.
begin
StringGrid1.Canvas.Brush.Color:=clRed;//改成红色.
StringGrid1.Canvas.FillRect(Rect);//填充
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);
//输出文字.
Start:=False;
//改变成红色完成.
Sleep(50);
//等50ms
StringGrid1.Invalidate;
//再画一次以恢复颜色.
end
else
begin
//恢复颜色画一次.
StringGrid1.Canvas.Brush.Color:=StringGrid1.Color;
if gdSelected in State then
begin
StringGrid1.Canvas.Brush.Color:=clHighlight;
StringGrid1.Canvas.Font.Color:=clHighlightText;
end;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);
end;
end else
begin
//其他格子.
if gdSelected in State then
begin
StringGrid1.Canvas.Brush.Color:=clHighlight;
StringGrid1.Canvas.Font.Color:=clHighlightText;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);
end else if gdFixed in State then
begin
StringGrid1.Canvas.Brush.Color:=clBtnFace;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);
end else
begin
StringGrid1.Canvas.Brush.Color:=StringGrid1.Color;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);
end;
end;
end;

end.

 
ListView 在拖动列的时候,其 Index 是不变的,而 StringGrid 的 Index 却随着拖动的
位置而变化,有没有什么方法可以让 StringGrid 像 ListView 一样。
比如:在某一个事件中一直向 StringGrid.Cells[1, 1] 发数据,使其更新。但是,当我
拖动列1(抬头:大小)到列2(抬头:日期)后面的时候,原来列1的数据(大小)跑到列2的抬头
(日期)所在的列中去了,造成数据错位。另外,在StringGrid.Cells[1, 1] 中可不可以由抬头得
出其所在的列号,而不是固定的[1, 1]。
 
StringGrid数据错位的问题解决了,在OnColumnMoved中处理。
To aizb:
只能改变一个格子,我要实现的是,哪个格子(事先不知道)数据更新就改变该格子,望
再帮我看一看,非常感谢!
另外,我想定义10个格子(任意格子),当10个格子数据都更新(更新一个改变一个颜色)后,
再同时变回各自原来的颜色,如何实现?
 
procedure TMainForm.StrGrid_TransDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
var Area:TRect;
begin
StrGrid_Trans.Canvas.Font.Assign
(StrGrid_Trans.Font);
with StrGrid_Trans,StrGrid_Trans.Canvas do
begin
FillRect(Rect);
Area:= Rect;
InflateRect(Area, -2, -2);
if (ACol<1) or (ARow=0) then
DrawText(Handle, PChar(Cells[ACol, ARow]),Length(Cells[ACol, ARow]), Area, DT_CENTER)//居中
else
DrawText(Handle, PChar(Cells[ACol, ARow]),Length(Cells[ACol, ARow]), Area, DT_RIGHT);//右对齐
end;
end;

procedure TMainForm.StrGrid_RecvDrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
var Area:TRect;
begin
StrGrid_Recv.Canvas.Font.Assign
(StrGrid_Recv.Font);
with StrGrid_Recv,StrGrid_Recv.Canvas do
begin
FillRect(Rect);
Area:= Rect;
InflateRect(Area, -2, -2);
if (ACol<1) or (ARow=0) then
DrawText(Handle, PChar(Cells[ACol, ARow]),Length(Cells[ACol, ARow]), Area, DT_CENTER)//居中
else
DrawText(Handle, PChar(Cells[ACol, ARow]),Length(Cells[ACol, ARow]), Area, DT_RIGHT);//右对齐
end;

end;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
I
回复
0
查看
748
import
I
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部