Protected Sub drp_usertype_SelectedIndexChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles drp_usertype.SelectedIndexChanged
End Sub
Run Code Online (Sandbox Code Playgroud)
在drp_usertype.SelectedINdexChanged下获取错误
它是一个下拉列表
如果我有一个TFunc<T: class>该类型的变量将允许我直接取消引用类成员.
即使班级完成也支持它.

但是,如果我有一个数组,TFunc<T>那么这不会编译.
为什么不?这是编译器错误还是有一些潜在的原因?
program Project33;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
type
TTestObject = class(TInterfacedObject, IInterface)
procedure Test;
end;
procedure TTestObject.Test;
begin
WriteLn('Test');
end;
procedure Test;
var
A: IInterface;
TestObject: array [0..4] of TFunc<TTestObject>;
SingleObject: TFunc<TTestObject>;
i: integer;
begin
for i:= 0 to 4 do begin
a:= TTestObject.Create;
TestObject[i]:= function: TTestObject
begin
Result:= a as TTestObject;
end;
TestObject[i].Test; //<<-- does not compile
SingleObject:= TestObject[i];
SingleObject.Test; // <<-- works.
end;
end;
begin
Test; ReadLn;
end.
Run Code Online (Sandbox Code Playgroud) 我的班级定义是:
TAnimal = class(TInterfacedObject)
public
constructor Create; overload;
constructor Create(param : string); overload;
end;
IAnimal = interface
procedure DoSomething;
end;
TDog = class(TAnimal, IAnimal)
public
procedure DoSomething;
end;
TCat = class(TAnimal, IAnimal)
public
procedure DoSomething;
end;
Run Code Online (Sandbox Code Playgroud)
示例代码:
procedure TForm1.DogButtonPressed(Sender: TObject);
var
myDog : TDog;
I : Integer;
begin
myDog := TDog.Create('123');
I := Length(myQueue);
SetLength(myQueue, I+1);
myQueue[I] := TDog; //Probably not the way to do it...??
end;
procedure TForm1.CatButtonPressed(Sender: TObject);
var
myCat : TCat;
I : Integer;
begin
myCat := …Run Code Online (Sandbox Code Playgroud) 我想使用TParallel.&For循环来计算例如1到100000之间的素数,并将所有这些素数保存在AList: TList<Integer>:
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
AList: TList<Integer>;
LoopResult: Tparallel.TLoopResult;
begin
AList:=TList<Integer>.Create;
TParallel.&For(1, 100000,
procedure(AIndex: Integer)
begin
if IsPrime(AIndex) then
begin
//add the prime number to AList
end;
end);
//show the list
for i := 0 to AList.Count-1 do
begin
Memo1.Lines.Add(IntToStr(AList[i]));
end;
end;
Run Code Online (Sandbox Code Playgroud)
计算可以并行执行而没有问题,但它TList是共享资源.如何以线程安全的方式将已确认的素数添加到列表中?
delphi parallel-processing multithreading delphi-10.1-berlin
以下代码最低限度地演示了该问题.在后台线程中,我创建一个有效的句柄数组并将其传递给,WaitForMultipleObjects并成功等待对象.
MsgWaitForMultipleObjects但是,当传递完全相同的数组时,函数调用failed(WAIT_FAILED)with ERROR_INVALID_HANDLE.
我究竟做错了什么?
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows, SyncObjs, Classes;
type
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
procedure TMyThread.Execute;
var
LEvent : TEvent;
LWaitHandles : TWOHandleArray;
LPWaitHandles : PWOHandleArray;
LWaitResult : Cardinal;
begin
LEvent := TEvent.Create;
LWaitHandles[0] := LEvent.Handle;
LPWaitHandles := @LWaitHandles;
while not Terminated do begin
{Works -> LWaitResult := WaitForMultipleObjects(1, LPWaitHandles, false, INFINITE);}
{Fails ->} LWaitResult := MsgWaitForMultipleObjects(1, LPWaitHandles, false, INFINITE, QS_ALLINPUT);
case LWaitResult of
WAIT_OBJECT_0: WriteLn('Event …Run Code Online (Sandbox Code Playgroud) 我开发了一个Microsoft Store应用程序,我想添加Toast通知.
该应用程序是使用Delphi 10.2.3开发的,我使用"桌面桥"技术将其转换为Microsoft Store的Appx包.Toast Notifications正常工作,直到我将应用程序打包到Appx包中(对于Store或Sideloading).
从appx和SideLoading运行时,Toast通知不起作用,我的应用程序未在Windows设置中列为通知发件人.我想必须有一些我需要定义的清单扩展.有一个(现已弃用)appxmanifest设置ToastCapable ="true",但我正在阅读Windows 10不再使用也不需要.
当我运行应用程序可执行文件时,我的Toast Notification工作得很好,但是当我从Appx包安装它时却没有.如何让Windows 10了解我的应用程序是Notification Sender?
我在Delphi 5中创建了一些函数,并且偶然地我尝试在不使用逗号分隔参数列表的情况下进行编译,而且奇怪的是,它完全正常地工作。
我尝试如下隔离问题:
program Project1;
{$APPTYPE CONSOLE}
procedure foo(i : integer; s : string; di : integer = -1);
begin
WriteLn(s);
end;
var
str: string;
int: integer;
begin
str := 'aaa';
int := 1000;
foo(int str int);
ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)
它可以编译,不会引发异常,并且参数表完全可以按预期达到功能。
我注意到的是,如果最后删除默认参数,它将开始引发编译错误 Not enough actual parameters
为什么德尔福会有这种行为?这是某种编译器错误还是怪异的机制?
我在用 delphi 编写的应用程序中有这个汇编器函数,它在 Windows 上运行良好。但我的要求是在 Linux 上执行它,因为我正在 Linux 上迁移我的应用程序。在 Linux 中编译此函数时出现错误:“不支持的语言功能:'ASM'”。
任何人都可以帮助或建议如何在 c++ 或 delphi 中实现它,以便它适用于 Linux。分享我的代码:
type
PVersionizedPointer = ^TVersionizedPointer;
TVersionizedPointer = packed record
Ver : NativeInt;
Ptr : Pointer;
end;
TVersionizedPointerStorage = array[0 .. 2 * sizeof(TVersionizedPointer) - 1] of byte;
function GetVersionizedPointer(var PointerStorage : TVersionizedPointerStorage) :
PVersionizedPointer; assembler;
const
vp_size = sizeof(TVersionizedPointer);
// Note: sizeof(any) inside asm is always $31
asm
{$ifdef CPUX86}
add EAX, vp_size - 1
and EAX, not(vp_size - 1)
{$endif}
{$ifdef CPUX64}
mov …Run Code Online (Sandbox Code Playgroud) 我的问题是关于调试内存泄漏,这似乎是一场噩梦.
在我的应用程序中有一个简单的类派生自TObject.该类的所有对象都存储在派生自TObjectList以下类的类的集合/列表中:
type
TOffer = class(TObject)
Item: string;
Price: string;
Id: string;
end;
TOffers = class(TObjectList<TOffer>)
protected
procedure SetOffer(I: Integer; AOffer: TOffer);
function GetOffer(I: Integer): TOffer;
public
property Offers[I: Integer]: TOffer read GetOffer write SetOffer
end;
Run Code Online (Sandbox Code Playgroud)
使用场景:
爬虫下载商品,解析商品并保存到对象集合.这种方法似乎很方便,因为我可以稍后引用这些对象(填充网格/列表,将它们写入文件等)
问题是正确处理对象以避免内存泄漏.该应用程序在启动时分配~4Mb内存,但在处理后~12k提供它吞噬32Mb.在过程完成后由未正确处理的对象/变量引起的泄漏.
ReportMemoryLeaksOnShutdown 显示可怕的数字,但关键是 - 我不知道在哪里看,以及如何正确调试该死的东西.
另一个例子是var MyString: string需要适当处置的变量!! 这对我来说很有见地:)我认为每个过程/函数都会自动管理超出范围的变量的垃圾收集.
商品列表由函数创建:
function GetOffersList: TOffers;
begin
Result := TOffers.Create;
while not rs.EOF do
begin
Offer := TOffer.Create;
try
// here come collected offer attributes as variables of …Run Code Online (Sandbox Code Playgroud) procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.close;
ADOQuery1.SQL.text:='insert into veresiye (product,price,piece,total)
VALUES (:par0,:par1,:par2,:par3)';
ADOQuery1.Parameters.ParamByName('par0').Value:=Edit1.Text;
ADOQuery1.Parameters.ParamByName('par1').Value:=Edit2.Text;
ADOQuery1.Parameters.ParamByName('par2').Value:=Edit3.Text;
ADOQuery1.Parameters.ParamByName('par3').Value:=Edit4.Text;
ADOQuery1.Open;
ADOQuery1.ExecSQL;
end;
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
Adoquery1:CommandText不返回结果集
为什么我会收到此错误以及如何解决?