Как связать объект с объектом TGridColumns

Я использую Лазарус 0.9.30.

У меня есть стандартный TStringGrid в форме и есть функция, которая динамически добавляет к нему объекты TGridColumns во время выполнения. У меня есть коллекция объектов, которые содержат все атрибуты каждого столбца (которые я считываю из файла во время выполнения), и я хочу связать каждый объект с соответствующим заголовком столбца.

Я пробовал приведенный ниже код, но во время выполнения, когда я пытаюсь получить доступ к объекту за объектом заголовка столбца, я получаю возвращенный нулевой объект. Я подозреваю, что причина этого заключается в том, что ячейка сетки (которая содержит заголовок столбца) пуста, и вы не можете связать объекты с пустыми ячейками сетки.

type
  TTmColumnTitles = class(TTmCollection)
  public
    constructor Create;
    destructor  Destroy; override;

    function  stGetHint(anIndex : integer) : string;
  end;

type
  TTmColumnTitle = class(TTmObject)
  private
    FCaption         : string;
    FCellWidth       : integer;
    FCellHeight      : integer;
    FFontOrientation : integer;
    FLayout          : TTextLayout;
    FAlignment       : TAlignment;
    FHint            : string;

    procedure vInitialise;

  public
    property stCaption        : string      read FCaption         write FCaption;
    property iCellWidth       : integer     read FCellWidth       write FCellWidth;
    property iCellHeight      : integer     read FCellHeight      write FCellHeight;
    property iFontOrientation : integer     read FFontOrientation write FFontOrientation;
    property Layout           : TTextLayout read FLayout          write FLayout;
    property Alignment        : TAlignment  read FAlignment       write FAlignment;
    property stHint           : string      read FHint            write FHint;

    constructor Create;
    destructor  Destroy; override;
  end;

procedure TTmMainForm.vLoadGridColumnTitles
  (
  aGrid       : TStringGrid;
  aCollection : TTmColumnTitles
  );
var
  GridColumn   : TGridColumn;
  aColumnTitle : TTmColumnTitle; //Just a pointer!
  anIndex1     : integer;
  anIndex2     : integer;
begin
  for anIndex1 := 0 to aCollection.Count - 1 do
    begin
      aColumnTitle := TTmColumnTitle(aCollection.Items[anIndex1]);

      GridColumn := aGrid.Columns.Add;
      GridColumn.Width := aColumnTitle.iCellWidth;
      GridColumn.Title.Font.Orientation := aColumnTitle.iFontOrientation;
      GridColumn.Title.Layout           := aColumnTitle.Layout;
      GridColumn.Title.Alignment        := aColumnTitle.Alignment;
      GridColumn.Title.Caption          := aColumnTitle.stCaption;

      aGrid.RowHeights[0] := aColumnTitle.iCellHeight;
      aGrid.Objects[anIndex1, 0] := aColumnTitle;
    end; {for}
end;

person user1174918    schedule 26.02.2012    source источник
comment
Привет, 1) не могли бы вы добавить объявление TTmColumnTitle и TTmColumnTitles, пожалуйста 2) вы уверены, где вы храните объект, в строку с самым высоким индексом?   -  person TLama    schedule 27.02.2012
comment
Я понял это из вашего комментария. Вы были правы, возникла проблема с индексом, который я использовал для присвоения объекта столбцу в строке. Я обновил пример кода с примером, который работает.   -  person user1174918    schedule 27.02.2012


Ответы (1)


Просто присвоить объект свойству Objects недостаточно. Вы должны сами нарисовать заголовок из этого объекта в обработчике событий OnDrawCell или также назначить свойство Cells.

и вы не можете связать объекты с пустыми ячейками сетки

Да, ты можешь. Строка и объект одной ячейки «работают» независимо друг от друга.

Так должно быть:

  for anIndex2 := 0 to aGrid.ColCount - 1 do 
  begin
    aColumnTitle := aCollection.Items[anIndex2];   // Is aCollection.Count in sync
                                                   // with aGrid.ColCount??
    aGrid.Cells[anIndex2, 0] := aColumnTitle.Caption;    
    aGrid.Objects[anIndex2, 0] := aColumnTitle;
  end;
person NGLN    schedule 27.02.2012
comment
Я думаю, что OP уже doing that, однако точка зрения о событии рисования верна. Мне также кажется, что объекты хранятся не в той строке. - person TLama; 27.02.2012
comment
Есть свойство TStringGrid.Columns, коллекция TGridColumn, которая имеет Title.Caption, поэтому нет необходимости (и, вероятно, это даже не сработает) использовать TStringGrid.Cells для заголовка. Реализация Lazarus далека от Delphi. - person TLama; 27.02.2012
comment
Ах, прости: Лазарь! Я такой глупый! - person NGLN; 27.02.2012
comment
Здравствуйте, @NGLN..... вы правы, присваивание объектов строке фактически не отображает GridColumn.Title.Caption. У меня есть обработчик событий OnDrawCell, который делает это. Вы и TLama были правы, указав, что индексы в моем втором цикле for использовались неправильно. На самом деле я полностью удалил второй цикл for и добавил строку кода aGrid.Objects[anIndex1, 0] := aColumnTitle; предложенный вами NGL для первого цикла for в примере кода (я обновил исходный пример кода). - person user1174918; 27.02.2012
comment
Я удалил «вводящий в заблуждение» тег Delphi. - person user1174918; 27.02.2012