gpt4 book ai didi

delphi - 为什么插入符号突然位于编辑字段的中心?

转载 作者:行者123 更新时间:2023-12-03 15:31:46 25 4
gpt4 key购买 nike

我在 Delphi 2006 登录表单上有一个“用户名”TEdit。当应用程序启动时,系统会要求用户输入用户名。由于某种原因,TEdit 获得焦点并且插入符号被放置在其水平中心。一旦输入任何内容,插入符号就会再次保持对齐,一切看起来都正常。

奇怪的是事情并不总是这样。这种行为是几年前突然开始的(我相信当时我们还在使用Delphi 6)。知道是什么原因造成的吗?

其他信息(已要求):

  • 这个问题很普遍:D2006 和 D6(我相信),同样多的计算机上有 5 或 6 个 Delphi 实例,所有应用程序都使用该登录表单。该效果仅限于表单,但不会发生在其他 TEdit 上。
  • TEdit 没有填充空格(首先这样做会很奇怪)。

  • 更多信息(11 月 13 日):
  • 插入符号没有完全居中,而是几乎居中。
  • 目前它似乎仅发生在 DLL 中。常规可执行文件中使用相同的登录对话框,并且不会显示那里的问题(尽管我相信它在某些时候确实如此)。
  • 编辑字段是密码编辑,OnChange 处理程序仅设置该表单的整数字段,该编辑字段上没有其他事件处理程序。
  • 我添加了另一个普通的 TEdit,它也是 ActiveControl,以便在表单显示时它具有焦点(就像密码编辑一样)。我还删除了默认文本“Edit1”。现在问题以同样的方式出现在该 TEdit 中。
  • 如果输入了一个字符或者我按 Tab 键浏览控件,“居中”插入符就会恢复正常 - 当我返回到 TEdit 时,它看起来正常。这与密码编辑相同。
  • 最佳答案

    我在 Delphi 2007 中也遇到了同样的问题,
    将 TEdit 放置在模态表单中,通过在网格中双击来调用。

    我做了一些测试,从 TSpeedButton 启动相同的表单。我注意到 TEdit 的问题仅在网格聚焦时出现。

    经过更多测试后,问题似乎是 VCL 中的错误
    在 TCustomGrid.paint 中,即使网格不在事件表单上,也会调用 SetCaretPos。

          ../..
    Focused := IsActiveControl;
    if Focused and (CurRow = Row) and (CurCol = Col) then
    begin
    SetCaretPos(Where.Left, Where.Top);
    Include(DrawState, gdFocused);
    end;
    ../..

    上面的代码来自Grids.pas中的TCustomGrid.paint在此代码中,如果网格是父窗体的“activeControl”,则 Focused 设置为 true,代码不考虑窗体是否处于事件状态。

    然后,如果需要重新绘制网格,则会使用网格坐标调用setCaretPos,从而导致问题中提到的错误。

    这个错误很难被注意到,因为大多数时候,插入符号只是从事件表单中消失,而不是在 TEdit 中间附近闪烁。

    重现错误的步骤:

    1. 启动新的 VCL 表单应用程序。
    2. 将 TStringGrid 添加到其中。
    3. 向应用添加第二个表单,其中仅包含一个 TEdit。
    4. 返回主窗体 (unit1) 并从网格 DblClick 事件中调用 form2.showmodal。

    就这样:您可以启动应用程序并双击网格单元格。如果将模态窗体拖离主窗体,则需要重新绘制网格,然后导致插入符号从模态窗体中消失(如果幸运的话,会出现在 TEdit 的中间)

    所以,我认为 Grids.pas 需要修复。

    在上面的 grid.pas 摘录中,我建议通过调用名为 IsFocusedControl 的新函数来替换函数 IsActiveControl 的调用:

    // new function introduced to fix a bug
    // this function is a duplicate of the function IsActiveControl
    // with a minor modification (see comment)
    function TCustomGrid.IsFocusedControl: Boolean;
    var
    H: Hwnd;
    ParentForm: TCustomForm;
    begin
    Result := False;
    ParentForm := GetParentForm(Self);
    if Assigned(ParentForm) then
    begin
    if (ParentForm.ActiveControl = Self) then
    //Result := True; // removed by DamienD
    Result := ParentForm.Active; // added by DamienD
    end
    else
    begin
    H := GetFocus;
    while IsWindow(H) and (Result = False) do
    begin
    if H = WindowHandle then
    Result := True
    else
    H := GetParent(H);
    end;
    end;
    end;

    这个修复(在 Delphi2007 中制作)对我来说效果很好,但没有保证。
    (另外,do not modify directly units of the VCL)。

    关于delphi - 为什么插入符号突然位于编辑字段的中心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/274009/

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