【发布时间】:2022-06-12 14:45:30
【问题描述】:
您好,我正在使用 TStringGrid 构建一个发票项目来输入数据(我正在使用网格来保持各个项目及其金额对齐)。由于最终报告的大小,我将每行长度限制为 47 个字符,之后下一行将收到 onKeyUp 事件。 这很容易做到
procedure TForm1.ngridKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
s, s2:string;
p, l:Integer;
begin
if Length(ngrid.Cells[ngrid.col,ngrid.row]) =47 then
ngrid.Row:=ngrid.Row+1;
end;
但我不想拆分一个单词,所以我找到最后一个空格,将单元格文本修剪到该点并将剩余部分放在下一行
procedure TForm1.ngridKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
s, s2:string;
p, l:Integer;
begin
if Length(ngrid.Cells[ngrid.col,ngrid.row]) =47 then
begin
s:= ngrid.Cells[ngrid.col,ngrid.row];
l:= Length(s);
p:=LastDelimiter(' ',s);
s2:=RightStr(s,l-p);
ngrid.Cells[ngrid.col,ngrid.row]:=LeftStr(s,p);
ngrid.Row:=ngrid.Row+1;
ngrid.cells[ngrid.col,ngrid.row]:=s2;
end;
end;
这行得通
但必须选择新单元格中的文本,因为键入的下一个字符会清除该单元格。像这样
如何停止选中单元格文本或将光标移到末尾?
【问题讨论】:
-
您处理问题的方法有几个缺陷。第一个缺陷是您根据字符串字符数决定何时进入下一行,但您没有使用字符宽度不同的字体。例如,包含 47 个
I字符的字符串的宽度远小于包含 47 个W字符的文本。此外,一旦文本已经被拆分为多个单元格,当用户开始删除文本时,如何处理?特别是如果用户开始更改第一个单元格中的文本。 -
您是否考虑过启用字符串网格单元格以显示拆分为多行的文本,就像 How to put CR/LF into a TStringgrid cell? 中显示的那样?
-
TStringGrid 可能不是解决此问题的最佳方法。例如,持有 TMemo 控件的 TFlowPanel 或类似的容器设置可能更合适。
标签: delphi