当可见设置为true时,表单的某些部分不会显示

时间:2013-08-19 08:51:48

标签: delphi delphi-xe3 firemonkey-fm2

我的节目处于发布后的状态,所以请耐心等待。

方案

我的程序基于办公室数据管理系统(面向车辆维护)的不同功能的不同页面的多种布局。这些功能的一个主要类别显然是数据输入。我使用不同的风格来适应不同的观众。

事实证明,其中一个接口具有excel样式网格和3个用于打印/保存/重置功能的按钮。我使用FastReports进行表单打印。

我正在为网格列开发一个自定义类,使它们能够容纳预定义的控件列表而不是动态的单元格,但是现在我只是在代码中创建了所需的控件子控件。

该页面有3个部分(布局);

  • 最上面一个是一种特定于所有页面的目的(添加/修改/添加部分)选择器,在不需要的地方可能不可见。

  • 中间版本是一个控件,用于接收要修改的表单的收据,其信息嵌入其他表格等。它主要在每个页面上,但不是全部。

  • 最后一个页面的内容是网格和前面提到的3个按钮。

代码

这是一段代码,用于显示其中一个有问题的页面。它在完成所有数据处理并且服务器正常转换时执行。

图例

  • AState :状态机状态变量;表示所显示页面的当前状态。

  • AMode :状态机状态枚举器;表示整个应用程序的模式,例如预订(数据输入)等我已经跳过了涉及此问题的代码,因为在AState过渡期间它会被跳过,以便发生此问题。

  • fMode :与上述内容相同,但它是表单的主要字段。

  • UI_CA_Controls1 :包含预订模式的目的选择器(组合列表框)的布局。

  • EV_Mode :为方便起见的变量;它存储目的选择器的项目索引。

  • UI_CA_Grid :UI_CA_Content中包含的布局本身包含UI_CA_FieldGrid(TGrid)。

  • fEditColumn :网格的第二列有TEdits。

  • fGridDataset :网格关联的TStringList。

//

procedure TUI.SetFormState ( AState : Byte; AMode : TMode = UIM_Unselected );
var
  EV_Mode, I : Byte;

begin


  // ---------------------------------------------------------------------------

  fFormState          := AState;

  // The children of the grid cells

  fCalEdit1.Parent    := nil; // Calender Edits
  fCalEdit2.Parent    := nil;
  fVehicleClass.Parent := nil; // Combo List Boxes
  fEmployee1.Parent   := nil;
  fEmployee2.Parent   := nil;
  fEmployee3.Parent   := nil;
  fEmployee4.Parent   := nil;

  // ---------------------------------------------------------------------------

  if AState = 0 then
  begin

    for I := 0 to 20 do
      DPCM.fGridDataset.Strings [I] := ''; // The Grid Associated TStringList

    UI_CA_ReceiptNo.ReadOnly  := False;
    UI_CA_ReceiptNo.Text      := '';

  end;

  // ---------------------------------------------------------------------------

  UI_CA_Content.BeginUpdate;

  case fMode of

    // Skipped unrelated modes

    UIM_Booking :
    begin

      UI_CA_Controls1.Visible := True;
      EV_Mode := UI_CA_EV_ModeSelect.ItemIndex;

      // -----------------------------------------------------------------------

      if fFormState = 0 then
      begin

        // Skipped handling of other EV_Mode values

        if EV_Mode < 7 then
        begin

          UI_CA_ReceiptControl.Visible  := True;
          UI_CA_Content.Visible         := False;

        end;

      end

      // -----------------------------------------------------------------------

      else if fFormState = 1 then // The problematic area
      begin

        if ( EV_Mode = 3 ) or ( EV_Mode = 4 ) then
        begin

          UI_CA_FieldGrid.RowCount := 6;
          UI_CA_Grid.Height        := 160;

          fCalEdit1.Parent        := fEditColumn.CellControlByRow ( 0 );
          fCalEdit1.Date          := Date;
          fCalEdit2.Parent        := nil;
          fVehicleClass.Parent    := fEditColumn.CellControlByRow ( 2 );
          fVehicleClass.ItemIndex := 0;

        end;

        UI_CA_Content.Visible := True;

      end;

    end;

    // -------------------------------------------------------------------------

  end;

  // ---------------------------------------------------------------------------
  // Workaround 1

  if UI_CA_Content.Visible then
  begin

    UI_CA_FieldGrid.UpdateColumns;
    UI_CA_Content.EndUpdate;
    UI_CA_FieldGrid.SetFocus;
    UI_CA_C2_Reset.SetFocus;
    UI_CA_C2_Print.SetFocus;
    UI_CA_C2_Save.SetFocus; 
    UI_CA_FieldGrid.SetFocus;

  end
  else UI_CA_Content.EndUpdate; 

end;

问题

问题在于,无论何时显示收据部分,内容部分都不会在现场显示。行为是这样的,当我将鼠标悬停在那些孩子控制的地方时,它们会显示3个按钮,但是当我点击它时会显示网格。

问题出现了,UI代码没有任何变化,这让我困扰了3天。我只对网络侧的协议和数据处理进行了优化(独立数据模块)。

序列

  • 用户想要修改已预订车辆的数据。

  • 用户输入预订收据号码。 (AState = 0,AMode = UIM_Booking)

  • 客户端查询服务器和服务器回复完整数据集(如果存在)。

  • 客户端获取数据并将其复制到Grid关联的TStringlist和子字段的字符串中。

  • 客户端不会显示包含数据和3个按钮的网格。 (AState = 1,AMode = UIM_Booking)

到目前为止我尝试了什么

  • 使用了BeginUpdate / EndUpdate,这使得对齐工件更糟糕。

  • 在网格和按钮上使用了SetFocus,导致其中一些按钮随机显示,有时完整显示但不是每次都显示。

  • 使用的Application.ProcessMessages没有任何变化,而UI线程有时会卡在其中永远不会返回。在一个单独的线程中使用它,每秒调用它一次,没有任何变化。

  • 为方法使用了一个单独的线程,但问题更多。

  • 回溯跟踪并恢复旧的工作代码,没有任何变化(让我非常生气)。

  • 更新1:我试图使网格不可见,然后在代码末尾可见。现在网格的一些单元格随机显示。

解决方法1

  • 当为每个方法调用SetFocus方法时,可以显示网格和按钮。
  • 按钮的调用顺序不稳定。就像我必须首先调用reset然后打印并保存SetFocus方法一样,否则只显示其中一个。
  • 有一个分裂的第二次重新调整故障,显示控件调整大小,但我认为这是可以忽略的。

解决方法2

因此,如果您有任何建议,我将非常感激。

0 个答案:

没有答案