【问题标题】:TStringGrid how to deselect cell text or move cursorTStringGrid如何取消选择单元格文本或移动光标
【发布时间】: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


【解决方案1】:

按照 SilverWarrior 的建议,我找到了一个具有多行单元格属性的字符串网格。 Torry 的 Delphi Pages(免费软件)提供的 ZColorStringGrid v.0.3 解决了我的问题,并且仍然保持项目和数量一致。所以谢谢你的灵感。没有人回答我的实际问题,我有点失望 - 这在未来会很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2014-07-17
    • 2011-07-22
    相关资源
    最近更新 更多