Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > FireMonkey 2.0 TGrid


Автор: vivien 10.3.2014, 17:19
Здравствуйте уважаемые форумчане!
Есть такая проблема, в FireMonkey (Delphi XE 4) есть объект TGrid, его столбцы могут быть различных типов, но особенно интересует TCheckColumn. Ранее, в XE 2, у TColumn был метод CellControlByRow, и работала такая конструкция:

Код

   var tc : TTextCell;
   ...
   tc := columns[col].CellControlByRow(row) as TTextCell;
    if assigned(tc) then tc.Text := 'текст';


Таким образом можно было сделать текст у чекбокса в столбце. В XE 4 этого метода нет, я обошел это таким образом:

Код

(TFmxObject(Grid1.Columns[col].Controls.Items[row]) as TCheckCell).Text


Но тут нарисовалась другая проблема, при прокрутке Grid все нормально перерисовывается, но стоит только кликнуть по ячейке в столбце, который типа TCheckColumn, как отрисовка этого столбца сбивается,  например щелкнув на первом элементе, и прокрутив вниз, а потом вернувшись назад, я наблюдаю смещение на 2 строки ниже, текста, который я назначил для чекбокса этой ячейки. 
Т.к. я только начинаю копаться с этим объектом в FireMonkey, прошу не судить строго, если какую-то очевидную вещь я не до понял. Пока я отрабатываю только событие OnGetValue, в нем такой код для назначение заголовков чекбоксов ячеек (само состояние чекбокса через объект Value я пока не трогую, хотелось бы разобраться так сказать с его заголовком) :

Код

procedure TForm1.Grid1GetValue(Sender: TObject; const Col, Row: Integer;  var Value: TValue);
var _row: integer;
begin
  _row:=Row-Grid1.TopRow; // т.к. в Columns[Col].Controls содержатся (?) объекты только для видимых строк столбца, 
                                             // а Row - это абсолютный индекс строки в таблице, то считаем относительный, для того чтобы в ячейку чекбокса,
                                             // для которой нет данных из массива, занести пустую строку
  case Сol of
    0:begin
        if (Row<Length(array_test)) and (Grid1.TopRow<Length(array_test)) then    // если строка для прорисовки, входит в диапазон массива, назначаем чекбоксу текст                    
          (TFmxObject(Grid1.Columns[Col].Controls.Items[Row]) as TCheckCell).Text:=array_test[Row]  
        else // иначе текст пустой
          (TFmxObject(Grid1.Columns[Col].Controls.Items[_row]) as TCheckCell).Text:='';
      end;
  end;
end;


array_test - массив строк, инициализируется при создании формы, заполняет Grid по событию OnGetValue

В общем я не понимаю где проблема :(. Заранее спасибо за помощь. 

Автор: Akella 10.3.2014, 17:33

 ! 
Akella
Используй кнопку КОД

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)