标签: delphi-2007

Delphi ClientDataset 只读

我目前正在测试:

  1. 指向 IB 数据库的 SQLConnection。
  2. 将 SQLConnection 字段设置为上述字段的 SQLDataset。
  3. 将 (2) 中的 SQLDataset 作为其 Dataset 字段值的 DatasetProvider。
  4. 一个 ClientDataset,其中 ProviderName 字段指向 (3) 中的提供者。

我使用以下方法(从 Alister Christie 借用)来获取数据...

function TForm1.GetCurrEmployee(const IEmployeeID: integer): OleVariant; 
const 
  SQLSELEMP = 'SELECT E.* FROM EMPLOYEE E WHERE E.EMPLOYEEID = %s'; 
begin 
  MainDM.SQLDataset1.CommandText := Format(SQLSELEMP, [Edit1.Text]); 
  Result := MainDM.DataSetProvider1.Data; 
end;
Run Code Online (Sandbox Code Playgroud)

它只用一条记录填充 DBGrid。但是,当我手动编辑记录时,单击发布,然后尝试提交更改,使用

MainDM.ClientDataset1.ApplyUpdates(0); // <<<<<< 
Run Code Online (Sandbox Code Playgroud)

它会爆炸,并显示消息“SQLDataset1:无法修改只读数据集”。

我检查了 Provider 和 ClientDataset 的 ReadOnly 属性,并且 SQL 没有连接。

什么可能导致错误?

delphi readonly delphi-2007

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

CTRL + 单击不起作用

代码浏览不适用于我的项目。我将搜索路径设置为我正在使用的所有源单元。我也删除了.local.identcache文件。我的项目编译没有问题。我该怎么做才能ctrl + click工作。

谢谢

ide delphi delphi-2007

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

检测Windows服务状态

当然,如何在Delphi 2007中检测Windows服务状态并更改其状态.

delphi operating-system windows-services delphi-2007

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

如何跨进程管理前台窗口?

我有两个项目作为单独的进程运行,但属于同一个应用程序:

  • 大师(包含TMasterMainFormTMasterModalForm)
  • 奴隶(包含TSlaveForm)

使用此应用程序的典型方法如下:

  1. 大师已经开始并展示了TMasterMainForm.
  2. 用户可以通过单击中的按钮来运行从站TMasterMainForm.
  3. Master启动Slave进程.
  4. 奴隶表明了TSlaveForm.
  5. 主站发送TForm.HandleTMasterMainForm为Slave.(通过IPC = WM_COPYDATA)

完成步骤5,以便当Slave关闭时,它可以将前景窗口设置回TMasterMainForm.这样做是为了改善用户体验.

在我们介绍之前,这很好用TMasterModalForm.

TMasterModalForm可以使用其他按钮开始TMasterMainForm.它是一个单独的窗口,但显示为模态,并具有TMasterMainForm显式弹出父级.

现在当TSlaveForm关闭时,Slave应用程序会调用SetForegroundWindow它的句柄TMasterMainForm,但这不再正确,因为它上面有一个模态form(TMasterModalForm).

所以问题是:

如何在这种非平凡的情况下管理前景窗口的设置?

PS:这是一个简化的描述,真正的应用程序也在做这个前景窗口的东西.

delphi ipc window delphi-2007 foreground

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

为什么我得到E2356属性访问器必须是实例字段或方法

编译本单元时:

unit Test;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    class var StartDate, EndDate: TDateTime;   // Line 12
    fTest: TNotifyEvent;
  public
    property OnTest: TNotifyEvent read fTest;  // Line 15.
  end;

implementation

{$R *.dfm}

end.
Run Code Online (Sandbox Code Playgroud)

我得到以下编译器错误:

[DCC错误] Test.pas(15):E2356属性访问器必须是实例字段或方法

但是,如果我在第12行发表评论,它就会很好地编译.有人可以解释原因吗?我需要将日期作为类变量来存储日期间隔.

delphi delphi-2007

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

TWebbrowser 大量内存泄漏:目前没有解决方案

我有一个应用程序,用于TWebbrowser定期导航到特定的 URL 并提取一些数据。该应用程序保持 24x7 全天候运行,并在页面中进行大量导航。

问题是TWebbrowser有一个众所周知的内存泄漏问题,每次导航到一个新页面时,应用程序使用的内存都会增加。一段时间后,我的应用程序可以轻松使用超过 2GB 的 RAM。在导航数百次之后,抛出一个'Out of memory'or'Out of system resources'异常,解决它的唯一方法是重新启动应用程序。

奇怪的是FASTMM从来没有显示这些泄漏。当我使用我的应用程序几分钟并关闭它时,没有任何报告。

多年来,我一直在寻找解决此问题的方法(实际上自 2007 年我编写应用程序的第一个版本以来)。有一些解决方法,但实际上,它们都不能解决问题。对我来说,唯一的解决方法是定期关闭和打开应用程序。

我已经测试了该SetProcessWorkingSetSize方法,但它只是暂时缩小了应用程序使用的内存。几秒钟后,该应用程序再次使用大量内存。

我也试过EmbeddedWB,但随着它的下降TWebbrowser,它受到同样问题的困扰。

顺便说一句,我不能使用像 那样简单的组件IdHTTP,因为我需要在访问的网站中进行一些 JavaScript 操作。

有谁知道这个问题是否真的有解决方案?

delphi memory-leaks delphi-2007 twebbrowser

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

当主窗体最小化/阻止自动恢复时隐藏fsStayOnTop窗体

我有一个主要表格和状态表格,类似于这里提出问题.但是,我的状态窗口的FormStyle是fsStayOnTop,当我尝试在状态窗口显示时最小化主窗体时会导致一些奇怪的行为.

当我最小化主窗体时,两个窗体都按预期隐藏,但是当状态窗体完成其最小化时完成其任务时,主窗体自动恢复自身并且其最小化按钮不再起作用(但最大化/恢复/关闭所有还在工作).使最小化功能再次起作用的唯一方法是重新启动应用程序.如果我将FormStyle设置为其他任何东西,一切正常,但我的应用程序要求状态窗体在可见时保持在顶部.

有没有理由为什么主窗体会自动恢复?有没有办法来解决这个问题?

procedure ButtonClick(sender:TObject);
begin
  //Gather some data

  ShowStatusWindow; // sets status window to visible, does its work, 
                    // then sets invisible. (Usually visible for about 10 seconds)

  //Gather more data

  Windows.SendMessage(self.Handle, WM_SETREDRAW, 0, 0); //Freeze the main form for 
                                                        //flickerless drawing
  // Handle everything that would cause a redraw
  Windows.SendMessage(self.Handle, WM_SETREDRAW, 1, 0);  // thaw form
  RedrawWindow(self.Handle, 0, 0, RDW_ERASE or RDW_FRAME or RDW_INVALIDATE or RDW_ALLCHILDREN);
end;
Run Code Online (Sandbox Code Playgroud)

windows delphi delphi-2007

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

是否可以在Delphi 2007中创建退出功能?

我正在使用Delphi 2007,并且想知道以下是否可行,如果不是,那么它可能在另一个版本的Delphi中.

我的代码目前看起来像,doo1但我想拥有的是类似的东西doo3.

我已经制作doo2并且它有效但我更喜欢exitIfFalse在一个地方使用该功能而不是在许多地方作为子程序.

function foo(const bar: Word): boolean;
begin
  Result:= bar = 42;
end;

function doo1: integer;
begin
  if not foo(42) then begin
    Result:= 1;
    exit;
  end;
  if not foo(8) then begin
    Result:= 2;
    exit;
  end;
  Result:= 0;
end;

function doo2: integer;
  Procedure exitIfFalse(const AResult: boolean; const AResultCode: integer);
  begin
    if not AResult then begin
      Result:= AResultCode;
      Abort;
    end;
  end;
begin
  Result:= -1;
  try
    exitIfFalse(foo(42), 1);
    exitIfFalse(foo(8), 2);
    Result:= 0;
  except …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2007

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

函数应该返回记录还是指针?

假设我有一个"重"记录,例如包含多个动态值数组.我这样声明:

PMyHugeRecord^ = TMyHugeRecord;
TMyHugeRecord = record
  AFirstArray: TSingleDynArray;
  // many many others
  ...  
  ALastArray: TSingleDynArray;
end;
Run Code Online (Sandbox Code Playgroud)

处理发生在函数中,是否应该将函数的结果键入为指针,还是可以返回记录变量?

function MyFunctionWhichCalculates: TMyHugeRecord;
// or
function MyFunctionWhichCalculates: PMyHugeRecord;
Run Code Online (Sandbox Code Playgroud)

我的意思是在性能方面,尤其是避免堆栈溢出.换句话说,函数是通过引用还是通过值返回结果?

delphi delphi-2007

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

如何比较事件及其避免E2035和E2036的相应程序?

我正在尝试检查是否TNotifyEvent已经为某个特定事件分配了一个事件()procedure(Sender: TObject) of object.

这是我的示例代码:

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if(Button1.OnClick = Button1Click) then
  begin
    //...
  end;
end;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我收到以下错误消息:

[DCC错误] Unit1.pas(28):E2035实际参数不足

所以,我尝试过如下:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if(@Button1.OnClick = @Button1Click) then
  begin
    //...
  end;
end;
Run Code Online (Sandbox Code Playgroud)

在编译时,错误更改为:

[DCC错误] Unit1.pas(28):E2036需要变量

我如何检查是否Button1.OnClick指向Button1Click

delphi events compiler-errors delphi-2007

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