小编Rob*_*ank的帖子

返回先前位置时如何避免 TDbgrid 滚动

在下面的代码中,我们对某些选定的行进行一些操作(不是删除)。

然而,有时,完成后,顶部选定的行会滚动,使其显示在网格下方 1/2 处。有没有办法避免这种滚动?(如果我的遍历下面选定行的代码由于某些不相关的原因不正确,我欢迎更正。)

  Function TForm.DoSomethingToSelectedRows;
  var
    KeyAtStart: Integer;
  begin
    Result := TRUE;
    KeyAtStart := DataSet.FieldByName('Key').AsInteger;
    DataSet.DisableControls;
    DataSet.First;
    try
      while Result AND (NOT DataSet.EOF) do  DataSet
        begin
          if DBGrid1.SelectedRows.CurrentRowSelected then
            Result := ... do something ...
          fMPODataTls.GetDS.Next;
        end;
    finally
      DataSet.Locate('Key', KeyAtStart, []);    // re-position where we started
      DataSet.EnableControls;
    end;
  end;
Run Code Online (Sandbox Code Playgroud)

delphi

5
推荐指数
1
解决办法
5173
查看次数

在Thread中使用EnterCriticalSection来更新VCL标签

我是线程的新手.我正在使用第三方库,它使用的线程有时会调用我提供的程序.

当线程调用时,如何从我的过程更新TLabel.Caption?

如果我在其他地方调用了InitializeCriticalSection,那就像它一样简单

  EnterCriticalSection(CritSect);
  GlobalVariable := 'New TLabel.Caption';
  LeaveCriticalSection(CritSect);
Run Code Online (Sandbox Code Playgroud)

然后在我的主线程中:

  EnterCriticalSection(CritSect);
    Label1.Caption:= GlobalVariable;
  LeaveCriticalSection(CritSect);
Run Code Online (Sandbox Code Playgroud)

但是,如何获取要调用的主线程代码?线程可以使用SendMessage吗?或者是否有一些更好/更简单的方法(.OnIdle可以检查线程设置的标志?)

谢谢.

delphi vcl synchronization thread-safety

4
推荐指数
2
解决办法
5272
查看次数

如何转换Big Endian以及如何翻转最高位?

我正在使用TStream来读取二进制数据(感谢这篇文章:如何使用TFileStream将2D矩阵读入动态数组?).

我的下一个问题是数据是Big Endian.从我的阅读来看,Swap()方法似乎已被弃用.我如何交换下面的类型?

 16-bit two's complement binary integer
 32-bit two's complement binary integer
 64-bit two's complement binary integer
 IEEE single precision floating-point - Are IEEE affected by Big Endian?
Run Code Online (Sandbox Code Playgroud)

最后,由于数据是无符号的,因此该数据集的创建者已将无符号值存储为有符号整数(不包括IEEE).他们指示只需要添加一个偏移量(2 ^ 15,2 ^ 31和2 ^ 63)来恢复无符号数据.但是,他们注意到,翻转最重要的位是最快的方法.如何有效地翻转16,32或64位整数的最高位?

因此,如果磁盘上的数据(16位)是"85 FB" - 读取数据和交换和位翻转后所需的结果将是1531.

有没有办法完成与泛型的交换和位翻转,所以它适合上面链接的通用答案?

是的,孩子们,这就是NASA,ESO和所有专业天文学家存储科学天文数据的方式.这个FITS标准被一些人认为是其扩散和灵活性中有史以来最成功的标准之一!

delphi

4
推荐指数
1
解决办法
6261
查看次数

显示Delphi 2010或Delphi 7程序的单元依赖性的工具

我们试图解开100个单位的毛球,去掉一些.

如果有工具可以向我们展示明确使用单位X的单位,那将会很有帮助.

Penganza似乎没有这样做的报告.(虽然它有很多其他有用的报告.)

任何人都可以建议一个工具或策略这样做,除了隐藏单位x,然后反复击中F9 ...

delphi refactoring coding-style

4
推荐指数
2
解决办法
4102
查看次数

通过删除RTTI缩小exe

在这个问题(链接)中,据说下面的行(在每个单元中)将删除尽可能多的RTTI:

    {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} 
Run Code Online (Sandbox Code Playgroud)

该帖子没有提及它的Delphi版本,但我假设是D2010.但是,当我包含上面的行时,我收到此错误:

    DCC Fatal Error: E2158 System unit out of date or corrupted: 
    missing TVisibilityClasses.
Run Code Online (Sandbox Code Playgroud)

我正在使用D2010的"库存"版本,并且从未做过任何我知道会改变默认安装或库的内容.

有什么建议?TIA

相关问题:链接.

delphi rtti

4
推荐指数
1
解决办法
1915
查看次数

TMemIniFile是线程安全的吗?

用户正在收到间歇性错误"无法创建文件"C:...\Filename.ini".无法对打开了用户映射部分的文件执行请求的操作."

我无法找到有关此错误的更多信息,这有助于了解正在发生的事情.

TMemIniFile是线程安全的吗?

delphi

4
推荐指数
2
解决办法
1814
查看次数

使用单个键快速移动IDE以搜索单个字符(类似vi)

我最近开始在IDE中使用Ctrl-LeftArrow和Ctrl-RightArrow来移动一行源代码(或者,就此而言,在任何Windows输入屏幕中).(当然,Ctrl-Shift-LeftArrow会突出显示文字.也非常有帮助.)

我很高兴看到它节省了我的时间,因为我不需要伸手去抓鼠标.

这需要一些练习(以及学习你的CTRL和箭头键所在的位置,所以可以点击它们而不向下看),但是如果你不使用这种方法来移动Windows文档,我建议你尝试一下!

现在,作为进一步的加速,我想跳到单个特定角色的下一个实例.

很多年前,我简单地使用了"vi"编辑器,我记得,在这个编辑器中键入一个小写字母g然后单个字符跳转到该字符.并且大写字母G在搜索的前一个单个字符上进行了"再次搜索"(如^ L).当然vi是模式化的,所以这个命令是可用的.在IDE中,它必须是一个控制字符.

我认为这将真正加快我周围的IDE我的源代码运动.

我从来没有做过很多可用于增强IDE的工具(这里是Delphi 10).我可以使用哪些工具以及将其添加到IDE有多难?

是否有任何第三方IDE加载项提供此类功能?

TIA

delphi delphi-2010

4
推荐指数
1
解决办法
673
查看次数

如何避免StringGrid中的"Open IME"弹出窗口?

在StringGrid中,有时当我右键单击时,我会在下面看到不需要的菜单.这是一个Windows弹出窗口吗?

弹出屏幕截图

如何防止这个弹出窗口出现而不是我自己?

我在我的选项中有goAlwaysShowEditor.

我已将StringGrid.PopupMenu设置为我的弹出窗口.

我已设置StringGrid.OnMouseDown以显示我的弹出窗口,如果它是右键单击.

delphi ime

4
推荐指数
2
解决办法
2035
查看次数

失去焦点时保持InPlaceEditor高亮显示

当网格失去焦点到另一个非模态形式时,Delphi XE2中是否有一种方法可以在StringGrid中保留InPlaceEditor的高亮?

我当前的StringGrid选项是:

在此输入图像描述

如果没有,我原本希望在失去焦点后使用下面的代码来保留当前单元格的一个亮点,但是当它们不再是当前单元格时,它会有一些问题,使单元格突出显示.

我是否需要在下面的代码中添加"else"以将颜色更改回非选定单元格上的原始颜色?有什么警告吗?

  procedure TForm1.sgMultiDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);    
  begin
    if (ACol = sgMulti.Col) and (ARow = sgMulti.Row) then
    begin
      sgMulti.Canvas.Brush.Color := clYellow;
      sgMulti.Canvas.FillRect(Rect);  
      sgMulti.Canvas.TextRect(Rect, Rect.Left, Rect.Top, sgMulti.Cells[ACol, ARow]); 
      if gdFocused in State then
        sgMulti.Canvas.DrawFocusRect(Rect); user
    end;
  end; { sgMultiDrawCell}
Run Code Online (Sandbox Code Playgroud)

编辑:下面的屏幕截图阐明了它今天的表现.我想当前的细胞,当失去焦点时,比底部屏幕捕获更清晰

在此输入图像描述

delphi

4
推荐指数
1
解决办法
1935
查看次数

TStrings与TCheckListBox中的TStringList

在Delphi 7中,我使用的是TCheckListBox.我希望它使用TStringList而不是TStrings,因此我可以将Duplicates设置为dupIgnore,并将Sorted设置为TRUE.

我可以这样做:

Form1 = class(TObject
    CheckListBox1: TCheckListBox;  // created by the IDE
end;

procedure TForm1.FormCreate
begin
   CheckListBox1.Items.Free;
   CheckListBox1.Items := TStringList.Create;
   CheckListBox1.Items.Sorted := TRUE;
   CheckListBox1.Items.Duplicates := dupIgnore;
end;
Run Code Online (Sandbox Code Playgroud)

这样安全吗?有任何警告或建议吗?

编辑:删除了MyStringList的声明,并将.Items添加到最后两个赋值行.

编辑2:尝试编译上面的内容,看起来我必须像这样抛出最后两行:

        TStringList(CheckListBox1.Items).Sorted := TRUE;
        TStringList(CheckListBox1.Items).Duplicates := dupIgnore;
Run Code Online (Sandbox Code Playgroud)

虽然我可以让它运行,但我问这个问题,因为只是让它运行并不意味着它总会运行或安全.

delphi delphi-7

3
推荐指数
1
解决办法
1016
查看次数