gpt4 book ai didi

delphi - 在 StringGrid 中插入新行

转载 作者:行者123 更新时间:2023-12-02 14:33:14 26 4
gpt4 key购买 nike

我有一个 StringGrid,它能够使用 OnDraw 方法绘制新线。

它工作正常,但现在我希望用户可以使用键盘输入新行。目前,必须将多行文本复制粘贴到 StringGrid 中。

每次按下 VK_RETURN 时,StringGrid 都会离开​​编辑模式。我必须做什么才能避免这种情况?

对于新线路,我希望使用 Ctrl+Return,就像在 Skype 中一样。

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_RETURN) and (ssCtrl in Shift) then // Ctrl+Return = New Line
begin
// TODO: Do NOT cancel edit mode
// TODO: Insert #13#10 at current cursor position
end;
end;

最佳答案

TStringGrid 的内置单元格编辑器不支持多行文本(它是 TCustomMaskEdit 的后代,它是单行文本)。您将必须使用单独的 UI 控件,例如 TMemo ,用于编辑多行文本。有几种不同的方法可以实现这一点:

  1. 禁用网格的内置编辑器(从网格的 goEditing 属性中删除 Options 标志)并放置 TMemo附近TStringGrid 。当用户选择一个单元格(并且可以选择单击按钮/菜单)时,将其当前文本分配到备忘录中。如果用户进行任何更改(并且可以选择单击另一个按钮/菜单),请将新文本分配回单元格。

  2. 上述的变体:设计一个单独的 TForm有一个 TMemo和保存按钮。当用户选择一个单元格(或按下按钮/菜单)时,将该单元格的当前文本分配给表单的备忘录,然后通过调用其 ShowModal() 显示表单。方法。如果用户单击“保存”按钮,则通过设置其 ModalResult 来关闭表单。属性至mrOk 。如果ShowModal()返回mrOk ,将备忘录的当前文本分配给正在编辑的单元格,然后 Invalidate()网格触发重绘。如果ShowModal()返回任何其他内容,不执行任何操作。

  3. 上述内容的变体:启用网格的内置编辑器,并如上所述设计一个单独的表单,但然后配置 TStringGrid自动触发表单,而无需以任何方式更改 UI 的其余部分。

    1. TStringGrid 派生一个新类并让它覆盖虚拟 GetEditStyle()方法返回esEllipsis (默认返回 esSimple),并覆盖虚拟 CreateEditor()方法返回 TInplaceEditList 的新实例-派生类(默认返回 TInplaceEdit 对象)。这将导致单元格在编辑时显示按钮而不是编辑字段。

    2. 有你的TInplaceEditList -派生类拥有您的 Form 的一个实例,然后覆盖虚拟 UpdateContents()方法检索当前单元格文本并将其分配给表单的备忘录,并覆盖虚拟 DoEditButtonClick()方法以模态方式显示 Form 并响应 ShowModal() 的返回值相应地。

关于delphi - 在 StringGrid 中插入新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34667709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com