标签: delphi-xe2

在对象中重新获得Classed TObjectList

我创建了一个名为TRecord的类来存储数据.我创建了另一个包含TRecord类作为对象列表的类.我使用TRecord在对象列表中添加记录,然后在完成后将其设置为父类TTableStore.FManyrecords.

我可以检索列表,COUNT显示相同数量的记录,但它不会让我检索每个单独的记录.

问题是我无法访问记录程序/方法甚至定义记录的检索.查看最后一行伪代码:

TRecord = class(TObject)
  private
    FDescription : Variant;
    FDirectDeposit : Double;
  public
    function  GetDescription : Variant;
    function  GetDirectDeposit : Double;
    procedure SetDescription(Value: Variant; DoValidation: Boolean = True);
    procedure SetDirect(Value: Double; DoValidation: Boolean = True);
end;

TTableStore = class(TObject)
  private
    FManyRecords : TObjectList ;
    FTitle2 : Variant;
    FNormalEarn : Double;
  public
    function  GetTitle2 : String;
    function  GetNormalEarn : Double;
    function GetManyRecords: TObjectList;
    procedure SetManyRecords(Value: TObjectList; DoValidation: Boolean = True);
    procedure SetTitle2(Value: String; DoValidation: Boolean = True);
    procedure SetNormalEarn(Value: Double; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe2

0
推荐指数
1
解决办法
504
查看次数

检查组合在Delphi中是否具有选定值

检查组合在Delphi中是否具有选定值的最佳方法是哪种?

delphi delphi-xe2

0
推荐指数
1
解决办法
1989
查看次数

OpenPictureDialog创建了13个线程,但在Delphi中销毁时不会销毁所有线程

我注意到TOpenPictureDialog的奇怪行为.

在创建和执行TOpenPictureDialog时,会创建13个线程,当对话框被销毁时,根据Windows活动监视器,线程仍然存在,除了1个线程消失.

为什么会这样?

我使用的代码如下:

 var opd: TOpenPictureDialog;
begin
  opd := TOpenPictureDialog.Create(self);
  opd.Execute;
  if opd.FileName = '' then exit;
  opd.Free;
begin;
Run Code Online (Sandbox Code Playgroud)

我在Windows 8.1中使用Delphi XE2

delphi multithreading dialog destruction delphi-xe2

0
推荐指数
1
解决办法
102
查看次数

将PAnsiChar分配给(unicode-)字符串的正确方法是什么?

我有一个DLL函数,返回一个指向ANSI文本(PAnsiChar)的指针.我想将它分配给(unicode-)字符串(这是Delphi XE2.).以下编译,但我得到一个警告"W1057隐式字符串从'AnsiChar'转换为'字符串'":

function TProj4.pj_strerrno(_ErrorCode: Integer): string;
var
  Err: PAnsiChar;
begin
  Err := Fpj_strerrno(_ErrorCode);
  Result := Err;
end;
Run Code Online (Sandbox Code Playgroud)

编辑:有问题的文本是英文错误信息,因此这里不太可能有任何转换问题.

我现在很想明确地将Err明确强制转换成这样的字符串......

Result := String(Err);
Run Code Online (Sandbox Code Playgroud)

..摆脱警告.这可能会出错吗?我宁愿使用临时的AnsiString变量吗?

var
  s: AnsiString;
[...]
s := Err;
Result := String(s);
Run Code Online (Sandbox Code Playgroud)

如果是,为什么?

或者我应该明确说明,代码首先将PAnsiChar转换为AnsiString,然后将AnsiString转换为String?

Result := String(AnsiString(Err));
Run Code Online (Sandbox Code Playgroud)

当然,我可以使它成为一个功能:

function PAnsicharToString(_a: PAnsiChar): string;
begin
   // one of the above conversion codes goes here
end;
Run Code Online (Sandbox Code Playgroud)

所有这些选项都可以编译,但它们会起作用吗 这里最好的做法是什么?

加分:理想情况下,代码应该与Delphi 2007和更新版本一起编译和使用.

delphi unicode delphi-2007 pchar delphi-xe2

0
推荐指数
1
解决办法
2499
查看次数

Delphi:如果应用程序为nil,则如何获取Application.MainForm(在dll中)

我需要应用程序的主要形式执行ClientToParent()和不成功,因为我在一个DLL并且Application变量是nil.我感谢任何人的帮助.

windows delphi delphi-xe2

0
推荐指数
1
解决办法
746
查看次数

使用CreateOleObject('Outlook.Application')导致以管理员身份运行时出现"服务器执行失败"错误

这是一个Delphi XE2应用程序.很简单.只需调用CreateOleObject('Outlook.Application')并将结果分配给Variant.

如果程序以管理员身份运行,则会因"服务器执行失败"而失败,但它运行正常,如果我以登录用户身份运行(没有提升权限),我可以返回版本号.

为什么是这样?以管理员身份运行会阻止它创建对象的内容是什么?

delphi outlook delphi-xe2

0
推荐指数
1
解决办法
2295
查看次数

Eof没有触发

我有一个函数,我从数据库中获取数据,我的测试数据集返回6500行(我从SQLText变量中提取格式化的SQL语句并将其作为测试运行),但是当我运行以下代码时,Eof永远不会触发,我已经看到导入了超过10万行.

ADOQuery := TADOQuery.Create(nil);
ADOQuery.ConnectionString := CONNECT_STRING;

// Build SQL Query 
SQLText :=   Format( 'Select  Temp.Serial, Temp.QCSample , Temp.Scrap , Temp.StationID , Temp.Defect , Temp.AddData , Temp2.Serial as Parent_Serial ' +
      'from TAB_ELEMENT as Temp ' + 

      'left join TAB_ELEMENT as Temp2 on  Temp.Parent_Id = Temp2.Element_Id ' + 
      'where Temp.Batch_ID = %d    and Temp.StationID = 0 ',[iSearchID]);

ADOQuery.SQL.Clear;   // Clear query of garbage values
ADOQuery.SQL.Text := SQLText; // Add query text to query module
ADOQuery.Open; 

// Handle Results
iIndexPos := …
Run Code Online (Sandbox Code Playgroud)

sql-server delphi delphi-xe2

0
推荐指数
1
解决办法
175
查看次数

如何用TSpeedButton替换TDBNavigator?

我做了:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  DataTable.qOrders.Next;
end;
Run Code Online (Sandbox Code Playgroud)

它的工作原理,但问题是当我点击按钮到达最后一条记录时,按钮没有被禁用,就像在a TDBNavigator.

我是如何进行TSpeedButton禁用并自动启用的TDBNavigator

delphi delphi-7 delphi-2010 delphi-xe2 delphi-10.2-tokyo

0
推荐指数
1
解决办法
128
查看次数

如何在Delphi中使用WriteProcessMemory

我无法编译此代码.我可以帮忙吗?谢谢.

procedure ChangeOutsideDateTime(h: HWND; dt: TDateTime);
var
  st: TSystemTime;
  pst: Pointer;
  hDTP: Cardinal;
  hProc: THandle;
  dwWrote: DWORD;
begin
  DateTimeToSystemTime(dt, st);
  pst:= VirtualAllocEx(h, nil, SizeOf(st), MEM_COMMIT, 0);
  if pst <> nil then begin
    if GetWindowThreadProcessId(h, hDTP) > 0 then begin
      hProc:= OpenProcess(PROCESS_VM_OPERATION, false, hDTP);
      if WriteProcessMemory(hProc, pst, @st, SizeOf(st), dwWrote) > 0 then begin
        SendMessage(h, DTM_SETSYSTEMTIME, GDT_VALID, hDTP);
        CloseHandle(hProc);
      end;
    end;
    VirtualFreeEx(h, pst, 0, MEM_RELEASE);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

它显示"实际和正式var参数的类型必须相同"在使用"WriteProcessMemory"的行.

delphi delphi-xe2

0
推荐指数
1
解决办法
994
查看次数

无法访问受保护的符号?

我越来越

无法访问受保护的符号TParent.Test

用于以下代码:

在Unit1:

TParent = class
protected
  function Test: TParent;
end;

implementation

function TParent.Test: TParent;
begin
  Result := Self
end;
Run Code Online (Sandbox Code Playgroud)

在第2单元:

uses Unit1;

type

TChild = class(TParent)
end;

implementation

var c: TChild;
begin
  c := TChild.Create;
  c.Test.Test
end;
Run Code Online (Sandbox Code Playgroud)

TChild不应该可以访问返回值吗?

c.Test;
c.Test
Run Code Online (Sandbox Code Playgroud)

当然是有效的.

delphi protected delphi-xe2

0
推荐指数
1
解决办法
461
查看次数