Части формы не отображаются, когда отображается значение true
Моя программа находится в состоянии после релиза, поэтому, пожалуйста, потерпите меня.
сценарий
Моя программа основана на нескольких макетах для разных страниц с различными функциями для офисной системы управления данными (ориентированной на обслуживание автомобиля). Основная категория этих функций, очевидно, ввод данных. Я использовал разные стили для разных аудиторий.
Приступая к делу, один из интерфейсов имеет сетки в стиле Excel и 3 кнопки для функций печати / сохранения / сброса. Я использую FastReports для печати форм.
Я разрабатываю пользовательский класс для столбцов сетки, чтобы они могли разместить предопределенный список элементов управления вместо их ячеек на лету, но сейчас я просто сделал необходимые элементы управления дочерними для ячеек в коде.
На странице есть 3 раздела (макеты);
Верхний является своего рода целевым селектором (Add/Modify/Add Partial), специфичным для всех страниц, и может не отображаться там, где не требуется.
Средний - это элемент управления для получения квитанций об изменяемых формах, их информации, встроенной в другие и т. Д. В основном на каждой странице, но не на всех.
Последний содержит содержимое страницы, которое представляет собой сетку и 3 кнопки, как упоминалось ранее.
Код
Это фрагмент кода для отображения одной из проблемных страниц. Он выполняется, когда вся обработка данных была выполнена, и сервер подтвердил переход.
легенда
AState: переменная состояния конечного автомата; Указывает текущее состояние отображаемой страницы.
AMode: State State State Enumerator; Обозначает режим приложения в целом, например "Бронирование" ("Ввод данных") и т. Д. Я пропустил код, связанный с этим, так как он пропускается во время перехода 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 кнопки они должны отображаться, а сетка отображается только при нажатии на нее.
Проблема возникла сама по себе, без изменений в коде пользовательского интерфейса, что ставило меня в тупик в течение 3 дней. Я только оптимизировал протокол и обработку данных на стороне сети (отдельный модуль данных).
Последовательность
Пользователь хочет изменить данные уже забронированного автомобиля.
Пользователь вводит квитанцию бронирования №. ( AState = 0, AMode = UIM_Booking)
Клиентский запрос - это сервер, а сервер отвечает полным набором данных, если он существует.
Клиент берет данные и копирует их в строки связанного с Grid TStringlist и дочерних полей.
Клиент не отображает сетку с данными и 3 кнопками. ( AState = 1, AMode = UIM_Booking)
Что я пробовал до сих пор
Использовал BeginUpdate/EndUpdate, что усугубляло артефакты выравнивания.
Использовал SetFocus на сетке и кнопки, которые приводили к случайному отображению некоторых из них и иногда к полному отображению, но не каждый раз.
Используются Application.ProcessMessages без изменений, а поток пользовательского интерфейса иногда просто застревает в нем, чтобы никогда не возвращаться. Использовал его в отдельном потоке, вызывая его каждую секунду без изменений.
Использовал отдельный поток для метода с еще большим количеством проблем.
Назад отследил и восстановил старый рабочий код без изменений (меня очень разозлило).
Обновление 1: я попытался сделать сетку невидимой, а затем видимой в конце кода. Теперь некоторые ячейки сетки отображаются случайным образом.
Обходной путь 1
- Сетка и кнопки могут отображаться при вызове метода SetFocus для каждого из них.
- Порядок звонков для кнопок ошибочный. Как будто мне сначала нужно было вызвать метод reset, а затем распечатать и сохранить метод SetFocus, в противном случае отображался только один из них.
- Существует небольшая ошибка перестройки, которая показывает изменение размеров элементов управления, но я думаю, что это игнорируется.
Обходной путь 2
- У очереди перекрасить, а не сразу. У него нет никаких предостережений, но главное в том, что между каждым перекрашиванием есть задержка. Ссылка: /questions/21810648/elementyi-upravleniya-firemonkey-ne-animiruyutsya-plavno/21810654#21810654
Так что, если у вас есть предложения, я буду очень благодарен.