为什么TStringGrid列标题单元格中的单元格属性会在加载网格时发生变化?

时间:2012-03-12 05:58:16

标签: lazarus tstringgrid text-rendering

我正在运行Lazarus v0.9.30(32位编译器)。

这个问题是我之前question的延伸。

前一个问题围绕如何将我在运行时加载的TGridColumns对象中的文本方向更改为标准TStringGrid。该解决方案涉及覆盖字符串网格的DrawCellText事件。

我的问题是这个。当我尝试加载TStringGrid时,我发现文本方向保持不变,但列单元格高度变回默认高度。

我用来加载网格的代码如下所示。

procedure TTmMainForm.vLoadWorldScoutGrid;
var
  aMember : TTmMember;
  anIndex1: integer;
  anIndex2: integer;
begin
  //Clear the string grid and set the row count to 1 to take into account the fixed row.
  SgWorldScout.Clear;
  SgWorldScout.RowCount := 1;

  for anIndex1 := 0 to Pred(FManager.Members.Count) do
  begin
    //Add a new row to the string grid.
    SgMembers.RowCount := SgMembers.RowCount + 1;

    //Get the TTmMember object from the collection.
    aMember := TTmMember(FManager.Members.Items[anIndex1]);

    //Populate the row cells in the string grid.
    SgMembers.Cells[0, SgMembers.RowCount - 1] := aMember.stMemberNumber;
    SgMembers.Cells[1, SgMembers.RowCount - 1] := aMember.stPatrol;
    SgMembers.Cells[2, SgMembers.RowCount - 1] := aMember.stSurname;
    SgMembers.Cells[3, SgMembers.RowCount - 1] := aMember.stFirstName;

    //Add the TTmMember object to every row cell.
    for anIndex2 := 0 to SgMembers.ColCount - 1 do
      SgMembers.Objects[anIndex2, SgMembers.RowCount - 1] := aMember;
  end; {for}}

  vSetWorldScoutGridPushbuttons;
end; 

我怀疑当我调用'SgWorldScout.Clear'时,字符串网格单元格的属性可能会被重置/修改,因为默认的DrawCellText事件被调用,这可以解释单元格高度的变化。不确定为什么文本方向也不会改变。有人能够解释DrawCellText事件的行为以及为什么我会看到这个吗?

1 个答案:

答案 0 :(得分:2)

您怀疑ClearRowCountColCount设置为0。然后,RowHeights也被清除也是合乎逻辑的,因为当RowCount设置为0时,没有高度存储。如果要清除并仅添加非固定行,则只需将RowCount设置为1而不清除整个网格。所以用这种方式修改你的代码:

procedure TTmMainForm.vLoadWorldScoutGrid;
var
  aMember : TTmMember;
  anIndex1: integer;
  anIndex2: integer;
begin
  // set the row count to 1 to keep the fixed row along with its settings
  SgWorldScout.RowCount := 1;

  for anIndex1 := 0 to Pred(FManager.Members.Count) do
  ...
end;