小编J..*_*...的帖子

Handles子句需要在包含类型或其基类型之一中定义的WithEvents变量

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下获取错误

它是一个下拉列表

vb.net asp.net

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

为什么TFunc <T>正确,但TFunc <T>的数组[0..1]不是?

如果我有一个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)

delphi generics

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

从类数组创建实例

我的班级定义是:

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)

arrays delphi oop polymorphism delphi-10-seattle

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

TParallel.For:在TParallel.For循环中计算值时,将值存储在TList中

我想使用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

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

WaitForMultipleObjects工作,MsgWaitForMultipleObjects失败 - 为什么?

以下代码最低限度地演示了该问题.在后台线程中,我创建一个有效的句柄数组并将其传递给,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)

delphi winapi multithreading delphi-10-seattle

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

当应用程序打包到Appx包中时,Toast Notifications不起作用

我开发了一个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 toast desktop-bridge delphi-10.2-tokyo

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

为什么在Delphi中不用逗号分隔参数就可以调用函数?

我在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 delphi-5

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

将在 Windows 上运行的 Delphi 中的汇编程序函数转换为 Delphi/c++ 以在 Linux 上执行

我在用 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)

c++ linux delphi assembly

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

Delphi app中的内存泄漏.如何正确处理对象和字符串?

我的问题是关于调试内存泄漏,这似乎是一场噩梦.
在我的应用程序中有一个简单的类派生自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)

delphi memory-leaks garbage resource-disposal

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

Adoquery1:CommandText不返回结果集

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不返回结果集

为什么我会收到此错误以及如何解决?

sql delphi

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