如何使用线程使timer控件事件同步?(200分)

  • 主题发起人 主题发起人 xkonline
  • 开始时间 开始时间
X

xkonline

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个窗体中,放入了 DataSource1、Table1,并用 Timer1控制TTS对象读出数据庫
中的内容,但为什么我的程序在显示单词和朗读单词上不同步,这是怎么回事?
朗读快,显示单词慢。怎么解决?
源码如下:
unit Unit4;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, StdCtrls, ExtCtrls,VTxtAuto_TLB;
type
TForm4 = class(TForm)
DataSource1: TDataSource;
Table1: TTable;
Edit1: TEdit;
Timer1: TTimer;
Label1: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form4: TForm4;
tt:tbookmark;
TTS:IVTxtAuto;
implementation
{$R *.DFM}

procedure TForm4.Timer1Timer(Sender: TObject);
var mark:tbookmark;
begin
Table1.DisableConstraints;//切断Table1与其他数据浏览部件的联系
if table1.eof then
table1.First else
Table1.Next;
Edit1.Clear;//先清除原来的单词
Edit1.text :=Table1.FieldByName('Word').asstring;//显示单词
label1.caption :=Table1.FieldByName('Word').asstring+Table1.FieldByName('Jieshi').asstring;//显示单词、音标
if edit1.text<>'' then
TTS.Speak(Edit1.text,vtxtst_READING);
Table1.EnableConstraints;
//恢复Table1与其他数据浏览部件的联系
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
TTS:=CoVtxtAuto_.Create;
// 建立对象
TTS.register('project1','project1');//用Register 方法注册
end;

end.
 
你Table1.DisableConstraints;//切断Table1与其他数据浏览部件的联系
把这句话去掉试一下.
 
不!
Edit1.text:=.....之后,立即加一行
Edit1.Update;
更新显示内容
 
另外 Edit1.Update 改为 Application.ProcessMessages 也可以,但是由于处理了消息
可能出现重复点击button的问题,需要更多的处理
 
当然,Edit1.Update;
替换为
Edit1.Repaint;
或者替换为
Edit1.Refresh;
都是可以的。(只需要使用其中一种)
 
后退
顶部