我的节目处于发布后的状态,所以请耐心等待。
我的程序基于办公室数据管理系统(面向车辆维护)的不同功能的不同页面的多种布局。这些功能的一个主要类别显然是数据输入。我使用不同的风格来适应不同的观众。
事实证明,其中一个接口具有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:我试图使网格不可见,然后在代码末尾可见。现在网格的一些单元格随机显示。
因此,如果您有任何建议,我将非常感激。