Оценка исчезает после нажатия клавиши вниз - PullRequest
0 голосов
/ 02 апреля 2020

Я создал расширение в классе, чтобы установить тип столбца для сетки cxgrid dev express. Нет проблем с набором текста, но когда я нажимаю клавишу ниже, сетка просто исчезает. После исчезновения он появится только в том случае, если вы нажмете клавишу выше или ниже или наведете курсор на нее.

Код, приведенный ниже, выполняется дважды, причем столбцы 3 и 4 - это self.

    Self.PropertiesClassName := 'TcxMaskEditProperties';
    Self.PropertiesClass := TcxMaskEditProperties;
    with TcxMaskEditProperties(Self.Properties) do begin
      EditMask := '!90:00:00;1;_';//MASK_TIME;
      DisplayFormat := '!90:00:00;1;_';//MASK_TIME;
    end;

Экран исчезает и возвращается только после нажатия клавиши ниже или выше или перемещения мыши

1 Ответ

0 голосов
/ 05 апреля 2020

Я думаю, что ваша проблема вызвана тем, что вы не указали нам в своем вопросе. Причина, по которой я это говорю, заключается в том, что я создал минимальный, автономный проект - см. Ниже - который, похоже, не отражает проблему, которую вы показываете.

Как вы увидите, cxGrid подается из TClientDataSet, который создается и заполняется во время выполнения, поэтому ему не требуется внешний источник данных. Что еще более важно, cxGrid также создается и настраивается полностью в коде, поэтому ни один из его параметров не сохраняется в файле .DFM, и поэтому вы можете точно указать, какие свойства cxGrid и его компонентов будут изменены по умолчанию, как они были созданы. , ценности. Преимущество создания сетки таким образом состоит в том, что на ее поведение не влияют настройки свойств, скрытых на глубине в Инспекторе объектов.

Чтобы попробовать код

  1. создайте новый проект и отредактируйте его основную форму, как показано в коде

  2. , запустите программу и щелкните ячейку времени в первой строке в сетке

  3. измените значение в ячейке времени и

  4. нажмите кнопку Вниз .

На шаге 4 для меня происходит следующее: изменение ячейки времени сохраняется в наборе данных именно так, как и должно быть, и фокус перемещается на ячейку времени в ряду ниже, опять же, именно так, как и должно быть.

Итак, поскольку в моем коде нет ничего явно неправильного, тот факт, что вы получаете другой результат в вашем проекте, должен означать, что он вызван чем-то другим в вашем проекте. Конечно, если вы сможете найти способ изменить мой проект так, чтобы он вел себя неправильно, аналогично вашему, это могло бы привести к ошибке в коде Devex, которую, я думаю, они смогут найти и исправить.

Код

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Variants, cxGraphics, cxgrid, DB, DBClient, ExtCtrls, DBCtrls, StdCtrls,
  cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxStyles,
  cxCustomData, cxFilter, cxData, cxDataStorage, cxEdit, cxNavigator,
  cxDBData, cxGridLevel, cxClasses, cxGridCustomView,
  cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
  cxTextEdit, cxMaskEdit;


type
  TForm1 = class(TForm)
    CDS1: TClientDataSet;
    CDS1ID: TAutoIncField;
    DS1: TDataSource;
    DBNavigator1: TDBNavigator;
    CDS1Name: TStringField;
    CDS1Time: TTimeField;
    procedure FormCreate(Sender: TObject);
  public
    cxGrid : TcxGrid;
    cxLevel : TcxGridLevel;
    cxView : TcxGridDBTableView;
  end;

[...]

procedure TForm1.FormCreate(Sender: TObject);
var
  Col : TcxGridDBColumn;
begin
  //  Create the cxGrid, add a Level to it and then add a TcxGridDBTableView to that
  cxGrid := TcxGrid.Create(Self);
  cxGrid.Parent := Self;
  cxGrid.Width := 400;

  cxLevel := cxGrid.Levels.Add;
  cxLevel.Name := 'Firstlevel';

  cxView := cxGrid.CreateView(TcxGridDBTableView) as TcxGridDBTableView;
  cxView.Name := 'ATableView';

  cxView.DataController.KeyFieldNames := 'ID';

  cxLevel.GridView := cxView;

  cxView.DataController.DataSource := DS1;

  cxView.DataController.CreateAllItems;

  Col := TcxGridDBTableView(cxView).Columns[2];

{$define CustomTime}

{$ifdef CustomTime}
  Col.PropertiesClassName := 'TcxMaskEditProperties';
  Col.PropertiesClass := TcxMaskEditProperties;
  TcxMaskEditProperties(Col.Properties).EditMask := '!90:00:00;1;_';//MASK_TIME;
  TcxMaskEditProperties(Col.Properties).DisplayFormat := '!90:00:00;1;_';//MASK_TIME;
{$endif}

  ActiveControl := cxGrid;

  CDS1.IndexFieldNames := 'ID';
  CDS1.CreateDataSet;

  CDS1.InsertRecord([1, 'First', Frac(Now)]);
  CDS1.InsertRecord([2, 'Second', Frac(Now + 1/24)]);

  CDS1.First;

end;

end.
...