TStringGrid
具有填充不存在的单元格的功能,即超出ColCount * RowCount
的单元格。因此,在填写字符串网格之前不需要计算单词数。
然后,一个简单直接的方法如下:
procedure TForm1.Button1Click(Sender: TObject);
var
WordCount: Integer;
WordStart: Integer;
S: String;
I: Integer;
begin
WordCount := 0;
WordStart := 1;
S := Memo.Text + ' ';
for I := 1 to Length(S) do
if S[I] = ' ' then
begin
if WordStart <> I then
begin
Grid.Cells[WordCount mod Grid.ColCount, WordCount div Grid.ColCount] :=
Copy(S, WordStart, I - WordStart);
Inc(WordCount);
end;
WordStart := I + 1;
end;
Grid.RowCount := ((WordCount - 1) div Grid.ColCount) + 1;
end;
注意:为了避免因添加' '
而导致文本的额外内存分配,请在循环结束后将最后一个单词添加到网格中。
附加功能:
为了能够调整列数,可以将字符串网格子类化,然后所有单元格都会自动重新排列:
type
TStringGrid = class(Grids.TStringGrid)
protected
procedure SizeChanged(OldColCount, OldRowCount: Integer); override;
end;
TForm1 = class(TForm)
...
procedure TStringGrid.SizeChanged(OldColCount, OldRowCount: Integer);
var
I: Integer;
begin
if OldColCount < ColCount then
begin
for I := 0 to OldColCount * OldRowCount - 1 do
Cells[I mod ColCount, I div ColCount] :=
Cells[I mod OldColCount, I div OldColCount];
end
else if OldColCount > ColCount then
begin
for I := OldColCount * OldRowCount - 1 downto 0 do
Cells[I mod ColCount, I div ColCount] :=
Cells[I mod OldColCount, I div OldColCount];
end;
if OldColCount <> OldRowCount then
for I := OldColCount * OldRowCount to ColCount * RowCount - 1 do
Cells[I mod ColCount, I div ColCount] := '';
end;
EDIT
控件是否公开有关文本换行的信息。如果您无法要求控件告诉您它如何换行文本,那么您基本上就没有办法了。 - David Heffernan