【问题标题】:Delphi XE5 Firemonkey TTabItem and TEdit repaint coordinationDelphi XE5 Firemonkey TTabItem 和 TEdit 重绘协调
【发布时间】:2014-07-06 22:17:14
【问题描述】:

我创建了一个带有两个 TTabItem 的 TTabControl。在每个 TTabItem 上都有一个(或多个)TImageViewers 和几个 TEdits。当我点击 TImageViewer 时,会弹出一个模态屏幕,我设置了一些值,我想通过 TEdits 将这些值报告给用户。所以在从模态屏幕返回时, 我执行

editn.text := whateveritis;  

然后我说

editn.repaint;  

什么都没有发生。我说 TTabItem.repaint。没发生什么事。我单击另一个 TTabIem,然后返回到第一个 TabItem,瞧,Edit 控件包含正确的信息。所以我的 editn.text := 不管是什么必须工作(这是对 TEdit 的唯一写入),但我无法在不离开选项卡的情况下让闪烁控件显示结果。更改内容后如何让它重新显示?我是否需要编写一个只有一行的 OnChange 例程 self.repaint?看起来很难看,我希望有一种更全球化的方法。有什么建议吗?

鉴于最初的 cmets,让我提供更多细节。设置:在主屏幕中,放入 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,它们会重新绘制并且确实包含正确的字符,而这些字符只能从上面的代码中获得。结论:不知何故,编辑并没有独立重绘,但不清楚原因。

【问题讨论】:

  • 如果您设置 TEdit 的文本,它的外观将更新,无需手动重新绘制。我们将需要更多信息,尤其是调用模态屏幕并设置编辑文本的例程的完整代码。

标签: delphi firemonkey repaint


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多