有没有在Delphi 7内置函数返回一个TSize
从给定cx
和cy
参数?
一些类似的功能Rect()
和Point()
等...
我知道写我自己很简单(虽然它Size
已经是一个别名,TSize
所以我不能说出我的功能Size
).但我想知道RTL中是否有内置函数.
我注意到在Delphi 7中,Point
/ Rect
/ Bounds
(etc)之类的函数Classes
在系统Types
单元中和系统单元中都被声明和实现.
这有什么理由吗?对于较新的Delphi版本也是如此吗?
(我的猜测是,可以在需要时使用Types
单位来避免Classes
开销)
我对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
.
来自这个 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) 我有一个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) 我在我的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)
而后来我有几个SELECT
和UPDATE
基于@t
ID的,例如:
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
/ UPDATE
statements中的持久性吗?如果是,它应该是群集还是非群集?我的建议选项是什么?
编辑:数据库中的所有表都有uniqueidentifier
(ID)列作为主键NONCLUSTERED
EDIT2:奇怪(或没有)当我尝试使用PRIMARY KEY NONCLUSTERED
表变量时,当使用连接的SELECT时,我在执行计划中看到有一个Table Scan
on @t
.但是当我省略时NONCLUSTERED
有一个Clustered Index Scan
.
我认为是:
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) 我有这个代码:
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'
我需要索引是字符串.是否可以使用index
with字符串值?
我有一个将Header.Column设置为taLeftJustify
(默认)的VirtualStringTree .
有没有办法设置该列的单元格/节点,taRightJustify
以便节点将向右对齐,但标题列文本将向左对齐?
这是我想要的结果(在第1栏):
我使用的是相当旧的VT版本4.5.5
我有这个处理列表中项目的代码:
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) delphi ×7
delphi-7 ×5
c# ×2
collections ×1
concurrency ×1
dll ×1
linq ×1
primary-key ×1
sql-server ×1