请教delphi中用canvas画图后的刷新问题?(100分)

L

lycok

Unregistered / Unconfirmed
GUEST, unregistred user!
比如我在按钮事件中有一语句 form1.Canvas.TextOut(300,400,'ABCD');
运行后窗体上(300,400)处会出现ABCD,但是窗体最小化或被别的窗体挡住后,再还原,
ABCD就没了,我知道在form的onpaint事件中写那语句就不会出现这样的问题,但关键是
上面那个语句只能写在按钮的点击事件中,这个问题改怎么解决呢?

 
用FORM中的REPAINT方法
 
位置和要显示的文本放在全局变量中。

显示程序放在 Onpaint 事件中处理。
按钮点击,只改改变位置和文本,然后刷新。

如果仅仅是显示字符,用 TLabel
 
这也是一个悬而未决的问题,前面我举的只是个例子,真正的情况时,窗体上有一个表格stringgrid
,要在数据库中去对应的字段状态来对表格相应的方格画上一个标记,如果我在form得onpaint事件或
表格的ondrawcell实践中重画表格的话,那就会完全把数据库占死了,别的什么也干不了,现在我就
想知道,画在stringgrid上的标记怎样才能不被擦掉???
 
你可以这样啊,把画标记的代码独立成一个过程,然后在paint事件中根据标志来调用.
需要画时置标志为真,不需要时置为假.
 
但是要实时的判断标志是什么状态得不停地读数据库,这个频率需要控制,如果有paint事件,那么
会对数据库的占用太大
 
那就直接在stringgrid的对应单元格中放一个image吧
 
那就直接在stringgrid的对应单元格中放一个image吧
-----------------------------------------------------
可是这样的话,image不会随stringgrid的滚动条一起滚动呀

 
在stringgrid的单元格自画事件中画呢?
 
自画事件我试过,因为stringgrid得ondrawcell事件是在不停的画表格,而我的程序是每画次表格前
必须先读数据库,这个画的频率需要控制,如果像ondrawcell那样不停的重画,会完全占用了数据库
占用了全部的系统资源。我只想知道画在stringgrid上的图怎样不会被擦掉
 
那你这个程序设计得有问题。
如果每次重画前都要访问数据库,请问:如此频繁的从数据库里取得的图像数据是不是都是一样的呢?
如果是一样的,那么只需读一次(一般是按钮事件或者定时事件中),然后在ondrawcell事件中重画
就ok了。
如果数据库中的图像数据也在频繁的变化,那么就只有定时的读取一次(比如在另一个线程中)。
反正ondrawcell事件中,代码越少越快,越快越好。
 
关键是不要直接在form.canvas上面画图,这样子因为所有的控件的重绘都会和
form.canvas发生联系,自然就会产生不好的影响了。

你可以在一开始就放一个Image到form上,把Image的属性设为占满form的整个
client区域。之后将以前需要在form.canvas上画的部分全都改成image.canvas就好了。
 
用计算字段。
 
你还不如在StringGrid上加两列,一列隐藏用来记载你数据库的字段,一列用来画标记。
当数据库字段改变时,更改Grid的内容,然后在Grid地DrawCell事件里根据前面一列画
就行了
 
顶部