我用两个TTabItem创建了一个TTabControl。在每个TTabItem上有一个(或多个)TImageViewers和几个TEdits。当我点击TImageViewer时,弹出一个模态屏幕,我设置了一些值,我想通过TEdits向用户报告这些值。所以从Modal屏幕返回时, 我执行
editn.text := whateveritis;
然后我说
editn.repaint;
什么都没发生。我说TTabItem.repaint。什么都没发生。我点击另一个TTabIem,然后回到第一个TabItem,瞧,编辑控件包含正确的信息。所以我的editn.text:= anyitis必须工作(这是对TEdit的唯一写入),但我无法获得blinkin'控制显示结果而不脱离标签。一改变内容,如何让它重新显示?我是否需要编写一行OnChange例程self.repaint?看起来很难看,我希望这是一个更全球化的方法。建议?
根据最初的评论,让我提供更多细节。设置:在主屏幕中,放入tabcontrol,然后在tabcontrol中放入2个tabitems。在tabitem1中,放入一个timageviewer和4个tedits(加上其他东西,可能无关紧要)。图像被放入图像查看器(并正确显示)。 onclick事件激活以下内容(省略号删除不相关的代码):
procedure TSCKMain.ImageViewer1Click(Sender: TObject);
var
lochold, scrollhold : tpoint;
backfromwavform : tmodalresult;
begin
lochold.X := mouseloccallback.x;
lochold.Y := mouseloccallback.y;
scrollhold.X := round(imageviewer1.ViewportPosition.X);
scrollhold.Y := round(imageviewer1.ViewportPosition.Y);
…
repeat backfromwavform := Wavform.Showmodal until backfromwavform<>mrnone;
case backfromwavform of
mrOK : begin {blue end}
Specsingle.BlueEnd.X := lochold.X;
Specsingle.BlueEnd.y := lochold.y;
edit13.Text := inttostr(Specsingle.BlueEnd.X);
Edit14.Text := inttostr(Specsingle.BlueEnd.y);
PublicWindowFlag := 'RePlot';
end;
mrContinue : begin {red end}
Specsingle.RedEnd.X := lochold.X;
Specsingle.RedEnd.y := lochold.y;
edit15.Text := inttostr(Specsingle.RedEnd.X);
Edit16.Text := inttostr(Specsingle.RedEnd.y);
PublicWindowFlag := 'RePlot';
end;
…
end;
if PublicWindowFlag<>'Cancel' then
if PublicWindowFlag='RePlot' then
begin
specsingle.RegenImage;
end
else
showmessage('Single image semaphore error. Debug.');
Imageviewer1.scrollto(scrollhold.X-Imageviewer1.viewportposition.X, scrollhold.y-Imageviewer1.ViewportPosition.Y);
end;
模态屏幕正确地发回mrContinue或mrOK,并执行相应的案例。但是,edit13,edit14,edit15和edit16不会更改其内容。但是,如果我点击Tabitem2并返回Tabitem1,他们会重新绘制并包含正确的字符,这些字符只能来自上面的代码。结论:不知何故,编辑不是独立重新绘制,但目前尚不清楚原因。
答案 0 :(得分:-1)
知道了。 imageviewer的画布,imageviewer中位图的画布以及父窗体的画布都在起作用。必须确保画布是正确的。一旦场景在imageviewer.bitmap和其他所有内容之间解开,编辑就会像预期的那样工作。