小编zig*_*zig的帖子

内置功能构建TSize?

有没有在Delphi 7内置函数返回一个TSize从给定cxcy参数?

一些类似的功能Rect()Point()等...

我知道写我自己很简单(虽然它Size已经是一个别名,TSize所以我不能说出我的功能Size).但我想知道RTL中是否有内置函数.

delphi delphi-7

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

为什么在类和类型单元中都声明了像"Point"/"Rect"/"Bounds"(等)这样的函数?

我注意到在Delphi 7中,Point/ Rect/ Bounds(etc)之类的函数Classes在系统Types单元中和系统单元中都被声明和实现.

这有什么理由吗?对于较新的Delphi版本也是如此吗?

(我的猜测是,可以在需要时使用Types单位来避免Classes开销)

delphi delphi-7

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

如何在Delphi ASM中返回var参数

我对ASM知之甚少,所以如果这是一个愚蠢的问题,请原谅我.

我有这个功能:

function SwapDWord(const AValue: DWORD): DWORD;
asm
  BSWAP EAX
end;
Run Code Online (Sandbox Code Playgroud)

我如何将其转换为ASM中的过程:

procedure SwapDWordVar(var AValue: DWORD);
asm
  // ???
end;
Run Code Online (Sandbox Code Playgroud)

我不想用AValue := SwapDWord(AValue);我能用的.我想在ASM中这样做.

我通过查看system.pas尝试了很多愚蠢的事情,并试图了解使用哪个寄存器.但没有任何效果.它总是返回原来的AValue.

delphi delphi-7

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

如何合并被拆分为具有奇数和偶数索引的 2 个数组的数组?

来自这个 Q: 如何将一个数组拆分为 2 个分别具有奇数和偶数索引的数组?

我使用此方法将数组拆分为 2 个数组,分别具有奇数和偶数索引:

int[] a = new int[] { 1, 3, 7, 8 };

int[] aEven = a.Where((x, i) => i % 2 == 0).ToArray();
int[] aOdd = a.Where((x, i) => i % 2 != 0).ToArray();
Run Code Online (Sandbox Code Playgroud)

这导致 2 个数组:

aEven : {1, 7}
aOdd  : {3, 8}
Run Code Online (Sandbox Code Playgroud)

如何以优雅的方式将aEven/合并aOdd回与原始a数组相同的位置?

注意:我不会更改aEven/aOdd数组,并且保证两个数组的长度相同。

我需要从aEven/aOdd输入的输出是:

{ 1, 3, 7, 8 };
Run Code Online (Sandbox Code Playgroud)

c# linq collections

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

动态初始化并仅按需要从TThread调用LoadLibrary一次

我有一个Delphi DLL,需要从我的主UI应用程序或工作线程调用.

每次调用DLL时我都不想调用LoadLibrary/FreeLibrary.但是,我也不想在我的应用程序初始化部分加载它.因为在应用程序的生命周期中我可能根本不使用DLL.

所以我需要的是初始化和加载DLL的第一个调用者(线程或主UI).DLL将在完成部分中卸载.我意识到我需要一些同步.所以我使用了一个关键部分,但我似乎无法使它工作.

只有一个线程应该尝试并加载DLL.如果失败,其他线程不应该再次尝试加载DLL.

同步未按预期工作!
有人可以建议为什么?

MCVE:

program Project1;
{$APPTYPE CONSOLE}
uses
  Windows,
  SysUtils,
  Classes;

const
  MyDLL = 'MyDLL.dll';

type
  TDLLProcessProc = function(A: Integer): Integer; stdcall;

var
  DLLProc: TDLLProcessProc = nil;
  DLLModule: HMODULE = 0;
  DLLInitialized: Boolean = False;
  DLLInitialized_OK: Boolean = False;
  CS: TRTLCriticalSection;

procedure InitDLLByFirstCall;
begin
  if DLLModule = 0 then
  begin
    if DLLInitialized then Exit;
    EnterCriticalSection(CS);
    try
      if DLLInitialized then Exit;
      DLLInitialized := True;
      DLLModule := LoadLibrary(MyDLL);
      if DLLModule = …
Run Code Online (Sandbox Code Playgroud)

delphi dll multithreading synchronization delphi-7

2
推荐指数
1
解决办法
371
查看次数

使用表变量上的主键来提高搜索性能

我在我的SP中使用了这个表变量:

DECLARE @t TABLE(ID uniqueidentifier)
Run Code Online (Sandbox Code Playgroud)

然后我插入一些数据(我稍后使用):

INSERT INTO @t(ID)
SELECT ID FROM Categories WHERE ...
Run Code Online (Sandbox Code Playgroud)

而后来我有几个SELECTUPDATE基于@tID的,例如:

SELECT * FROM Categories A INNER JOIN @t T ON A.ID = T.ID

etc..
Run Code Online (Sandbox Code Playgroud)

我应该声明ID uniqueidentifier PRIMARY KEY增加SELECT/ UPDATEstatements中的持久性吗?如果是,它应该是群集还是非群集?我的建议选项是什么?

编辑:数据库中的所有表都有uniqueidentifier(ID)列作为主键NONCLUSTERED

EDIT2:奇怪(或没有)当我尝试使用PRIMARY KEY NONCLUSTERED表变量时,当使用连接的SELECT时,我在执行计划中看到有一个Table Scanon @t.但是当我省略时NONCLUSTERED有一个Clustered Index Scan.

sql-server primary-key table-variable

2
推荐指数
1
解决办法
1705
查看次数

与 pascal IO Append(F) 等效的 TFileStream 是什么?

我认为是:

FS := TFileStream.Create(FileName, fmOpenReadWrite);
FS.Seek(0, soFromEnd); 
Run Code Online (Sandbox Code Playgroud)

那是对的吗?打开模式是否正确或者可能fmOpenWrite或需要添加fmShareDenyNone

PS:对于Rewrite(F)我用过的FS := TFileStream.Create(FileName, fmCreate);


根据@David 的评论,我最终使用了THandleStream

procedure LOG(const FileName: string; S: string);
const
  FILE_APPEND_DATA = 4;
  OPEN_ALWAYS = 4;
var
  Handle: THandle;
  Stream: THandleStream;
begin
  Handle := CreateFile(PChar(FileName),
    FILE_APPEND_DATA, // Append data to the end of file
    0, nil,
    OPEN_ALWAYS, // If the specified file exists, the function succeeds and the last-error code is set to ERROR_ALREADY_EXISTS (183).
                 // If the specified file does …
Run Code Online (Sandbox Code Playgroud)

delphi

2
推荐指数
1
解决办法
1478
查看次数

如何使用字符串索引的属性?

我有这个代码:

type
  TMyClass = class
    private
      procedure SetKeyValue(const Key: WideString; Value: Widestring);
      function GetKeyValue(const Key: WideString): WideString;
    public
      // this works
      property KeyValue[const Index: WideString] : WideString read GetKeyValue write SetKeyValue;

      // this does not compile
      // [Error]: Incompatible types: 'String' and 'Integer'
      property Speed: WideString index 'SPEED' read GetKeyValue write SetKeyValue;
  end;
Run Code Online (Sandbox Code Playgroud)

Speed属性给我错误:

不兼容的类型:'String'和'Integer'

我需要索引是字符串.是否可以使用indexwith字符串值?

delphi delphi-7

2
推荐指数
1
解决办法
837
查看次数

TVirtualStringTree - 设置列单元/节点对齐

我有一个将Header.Column设置为taLeftJustify(默认)的VirtualStringTree .

有没有办法设置该列的单元格/节点,taRightJustify以便节点将向右对齐,但标题列文本将向左对齐?

这是我想要的结果(在第1栏):

在此输入图像描述

我使用的是相当旧的VT版本4.5.5

delphi virtualtreeview tvirtualstringtree

2
推荐指数
1
解决办法
456
查看次数

使用 ConcurrentBag 的 Parallel ForEach 无法按预期工作

我有这个处理列表中项目的代码:

    static readonly object _Lock = new object();

    public class Item
    {
        public string Name;
        public string ID;
    }

    static void Main(string[] args)
    {
        var items = new List<Item>
        {
            new Item { Name = "One", ID = "123" },
            new Item { Name = "Two", ID = "234" },
            new Item { Name = "Three", ID = "123" }
        };

        var itemsProcess = new ConcurrentBag<Item>();
        Parallel.ForEach(items, (item) =>
        {
            Item itemProcess = null;
            // lock (_Lock)
            {
                itemProcess = …
Run Code Online (Sandbox Code Playgroud)

c# parallel-processing concurrency parallel.foreach

2
推荐指数
1
解决办法
307
查看次数