Части формы не отображаются, когда отображается значение 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

Так что, если у вас есть предложения, я буду очень благодарен.

0 ответов

Другие вопросы по тегам