Delphi XE5 Firemonkey TTabItem和TEdit重新协调

时间:2014-07-06 22:17:15

标签: delphi firemonkey repaint

我用两个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,他们会重新绘制并包含正确的字符,这些字符只能来自上面的代码。结论:不知何故,编辑不是独立重新绘制,但目前尚不清楚原因。

1 个答案:

答案 0 :(得分:-1)

知道了。 imageviewer的画布,imageviewer中位图的画布以及父窗体的画布都在起作用。必须确保画布是正确的。一旦场景在imageviewer.bitmap和其他所有内容之间解开,编辑就会像预期的那样工作。