标签: delphi-2007

Delphi 2007(或 2009)构建事件与构建配置相关吗?

是否可以仅为 Delphi 2007 中的特定构建配置添加构建事件?

我使用 2007 年,但也对您在 2009 年可以做什么感兴趣。

干杯萨姆

delphi delphi-2007

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

Delphi/Borland Pascal STR 程序如何轮转

Borland Pascal 7 和 Delphi 2007 都得到了过程 STR,它接受一个数字、一个长度和一个精度,并将其转换为这样的字符串:

str(9.234:5:1, s); // -> s = '  9.2'
Run Code Online (Sandbox Code Playgroud)

如果舍入是非歧义的,一切都很好,但如果不是(0.5 -> 向上或向下?),则存在问题:它似乎取决于 BP 中的浮点数据类型,但在 Delphi 2007 中显然是一致的:

BP:

var
  e: extended;
  d: double;
begin
  d := 2.15;
  e := 2.15;
  str(d:5:1, s); { -> s = '  2.1' }
  str(e:5:1, s); { -> s = '  2.2' }
  { but: }
  d := 2.25
  e := 2.25
  str(d:5:1, s); { -> s = '  2.3' }
  str(e:5:1, s); { -> s = ' …
Run Code Online (Sandbox Code Playgroud)

delphi pascal rounding delphi-2007

5
推荐指数
1
解决办法
1927
查看次数

接口方法作为事件处理程序

是否可以在 Delphi 2007 中使用接口方法作为事件处理程序?简单版本不起作用:

type
  TMyEvent = procedure of object;

  IMyInterface = interface
    procedure Handler;
  end;

  TMyClass = class(TInterfacedObject, IMyInterface)
  public
    procedure Handler;
  end;

var
  ev: TMyEvent;
  obj: TMyClass;
  intf: IMyInterface;
begin
  obj := TMyClass.Create;
  intf := obj;
  ev := obj.Handler; // compiles
  ev := intf.Handler; // <== Error E2010 (incompatible types)
end.
Run Code Online (Sandbox Code Playgroud)

将错误添加@Addr更改为 E2036(需要变量)。

更新:这个

procedure IntRefToMethPtr(const IntRef; var MethPtr; MethNo: Integer);
type
  TVtable = array[0..999] of Pointer;
  PVtable = ^TVtable;
  PPVtable = ^PVtable; …
Run Code Online (Sandbox Code Playgroud)

delphi interface event-handling delphi-2007

5
推荐指数
1
解决办法
1580
查看次数

使用 Native Client 10 将 TDateTime 字段插入 SQL 2008 DB

我们有一个用 Delphi 2007 编写的遗留应用程序,并且仍在使用 BDE(是的,它需要切换到 ADO,但有超过 500K 行,这是一项艰巨的工作)。它使用 SQL SERVER ODBC 连接连接到 SQL Server 2008 DB。我正在尝试切换到 SQL Server Native Client 10.0,并且遇到了一个有趣的问题。当尝试将记录插入包含日期时间字段的表时,我们收到以下错误:

Project DateTimeParamTest.exe raised exception class EDBEngineError with message 'General SQL error.
[Microsoft][SQL Server Native Client 10.0]Datetime field overflow. Fractional second precision exceeds the scale specified in
the parameter binding.'.
Run Code Online (Sandbox Code Playgroud)

在进行一些研究时,我看到了有关 TParameter 对象的 NumericScale、Precision 和 Size 参数的评论。TADOQuery会自动将参数分别设置为3、23、16,插入没有问题。如果我在 TQuery 对象上将参数设置为相同,则会收到与上面相同的错误。

有谁有这方面的经验并知道简单的解决方法吗?我为任何想尝试的人创建了以下示例代码。您只需要更改连接和 SQL 代码。

日期时间参数测试_Main.dfm:

object Form10: TForm10
  Left = 0
  Top = 0
  Caption = 'Form10'
  ClientHeight = 111
  ClientWidth = …
Run Code Online (Sandbox Code Playgroud)

delphi bde delphi-2007 sql-server-2008 sql-server-native-client

5
推荐指数
1
解决办法
2964
查看次数

Delphi 2007:GlobalMemoryStatus 获取总 RAM

我需要使用 Delphi 2007 获取系统的总物理内存。在 4GB 或更大的系统上使用 GlobalMemoryStatus 似乎会给我带来错误。在 Delphi 2007 中,GlobalMemoryStatusEx 不存在,因此我手动将函数调用添加到我的程序中。它在我的 Windows 7 x64 上正确返回内存 (8GB),但在 Vista x32 系统上它仍然返回错误值(在此系统上应为 4GB,但返回 2.9GB)。知道我可能做错了什么吗?GlobalMemoryStatusEx 可以在旧操作系统上运行吗?

type
  DWORDLONG = UInt64;

  PMemoryStatusEx = ^TMemoryStatusEx;
  TMemoryStatusEx = packed record
    dwLength: DWORD;
    dwMemoryLoad: DWORD;
    ullTotalPhys: DWORDLONG;
    ullAvailPhys: DWORDLONG;
    ullTotalPageFile: DWORDLONG;
    ullAvailPageFile: DWORDLONG;
    ullTotalVirtual: DWORDLONG;
    ullAvailVirtual: DWORDLONG;
    ullAvailExtendedVirtual: DWORDLONG;
  end;

function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): BOOL; stdcall; external kernel32;

function getmemorysize:word;
var
  memory: TMemoryStatusEx;
begin
  FillChar(memory, SizeOf(memory), 0);
  memory.dwLength := SizeOf(memory);
  GlobalMemoryStatusEx(memory);
  result:=memory.ullTotalPhys div (1024*1024);
end;
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2007

5
推荐指数
1
解决办法
1893
查看次数

如何在TListView中检测CheckBox上的单击

所以基本上当用户点击复选框时,我想在我的列表中添加该项,我尝试使用OnChange事件,但这对我不起作用,因为即使没有点击Checkbox也会被触发.

我的代码简单明了

procedure LvUserChange(Sender: TObject; Item: TListItem;Change: TItemChange);
 var
 objUser : TUsers;
begin
   if not assigned(objListOfChangedUsers) then
   objListOfChangedUsers := TObjectList.Create;

   objUser := Item.Data;
   objListOfChangedUsers.Add(objUser);
end;
Run Code Online (Sandbox Code Playgroud)

我希望只有在ListView中单击复选框时才会触发此代码

delphi delphi-2007 tlistview

5
推荐指数
1
解决办法
1628
查看次数

在Delphi中为表单上的大量控件切换控件类型(但不是名称)

我需要将表单上特定类型的每个控件切换为不同的类型,同时保持与每个控件关联的名称和代码.

例如,假设我需要将十几个或更多TEdit字段切换到TSpinEdits.如何以最小的努力在Delphi 2007中做到这一点?

delphi delphi-2007

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

在TFrame里面的EventHandler?

我有一个TForm(TVehicleEditForm)里面有3个相同的TFrames(TVehicleUnitFrame).

这个想法是框架的每个实例都通过框架eventhandler内部处理自己的事件.问题是eventhandler没有调用.

我试图eventhandler通过覆盖Create方法在框架内分配by代码,但在这种情况下也不会调用处理程序.

但是如果我eventhandler从表单中指定框架外部它可以正常工作.像这样:

fraVehicleUnitFrame1.cmdNewOwner.OnClick := fraVehicleUnitFrame1.cmdNewOwnerClick;
fraVehicleUnitFrame2.cmdNewOwner.OnClick := fraVehicleUnitFrame2.cmdNewOwnerClick;
fraVehicleUnitFrame3.cmdNewOwner.OnClick := fraVehicleUnitFrame3.cmdNewOwnerClick;
Run Code Online (Sandbox Code Playgroud)

这只适用于一个按钮!因为我在框架内有许多组件,这将导致许多分配...当这应该直接在对象检查器中完成时,相当丑陋的代码.

我正在使用D2007.对原因有什么看法?

关心罗兰

delphi event-handling delphi-2007 tframe

4
推荐指数
1
解决办法
2096
查看次数

try/except似乎没有捕获异常 - Delphi Service Application

我有一个用Delphi 2007编写的服务,我正在尝试捕获任何未知的异常.为on异常分配方法似乎不起作用('Forms.Application.OnException:= UnknownApplicationException')."UnknownApplicationException"似乎没有被调用 - 我将此归因于应用程序中没有表单的事实,因此该方法实际上从未被分配.除此之外,我还尝试在计时器上创建一个异常(在注释掉'Forms.Application.OnException:= UnknownApplicationException'后,它不会干扰).在服务启动后60秒,计时器会触发:

procedure TProcessScheduler.Timer1Timer(Sender: TObject);    
begin    
  try    
    Raise Exception.Create('THIS GIG SUCKS');    
  except     
    LogEvent(Name,rsUNKNOWN_EXCEPTION,EVENTLOG_AUDIT_FAILURE,0);    
    ExitCode:=-1;    
    Halt;    
  end;     
end;
Run Code Online (Sandbox Code Playgroud)

似乎永远不会捕获异常 - 服务启动并且在此计时器触发后60秒后,我听到Windows错误声音但没有看到任何错误对话框 - 也许这可能是由于应用程序是服务的事实?永远不会调用'Halt'并且应用程序继续运行(我假设它等待某人在它创建的不可见错误对话框上单击ok).有什么想法为什么"除外"下的代码没有被调用?提前致谢!KP

delphi exception-handling delphi-2007

4
推荐指数
1
解决办法
2520
查看次数

将变量值存储在TStringList的object属性中

我需要在a中存储一个变量值TStringList,到目前为止我试试这个

var
 list : TStringList;
 v   : OleVariant;

  List..AddObject('Item1',v);
Run Code Online (Sandbox Code Playgroud)

要么

  List..AddObject('Item1',TObject(v));
Run Code Online (Sandbox Code Playgroud)

但在这两种情况下代码都不能编译,因为类型转换无效或类型不兼容.

所以问题是,我如何在TStringlist中存储变量值?

delphi delphi-2007

4
推荐指数
1
解决办法
1784
查看次数