我目前正在测试:
我使用以下方法(从 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 没有连接。
什么可能导致错误?
代码浏览不适用于我的项目。我将搜索路径设置为我正在使用的所有源单元。我也删除了.local和.identcache文件。我的项目编译没有问题。我该怎么做才能ctrl + click工作。
谢谢
当然,如何在Delphi 2007中检测Windows服务状态并更改其状态.
我有两个项目作为单独的进程运行,但属于同一个应用程序:
TMasterMainForm和TMasterModalForm)TSlaveForm)使用此应用程序的典型方法如下:
TMasterMainForm.TMasterMainForm.TSlaveForm.TForm.Handle的TMasterMainForm为Slave.(通过IPC = WM_COPYDATA)完成步骤5,以便当Slave关闭时,它可以将前景窗口设置回TMasterMainForm.这样做是为了改善用户体验.
在我们介绍之前,这很好用TMasterModalForm.
TMasterModalForm可以使用其他按钮开始TMasterMainForm.它是一个单独的窗口,但显示为模态,并具有TMasterMainForm显式弹出父级.
现在当TSlaveForm关闭时,Slave应用程序会调用SetForegroundWindow它的句柄TMasterMainForm,但这不再正确,因为它上面有一个模态form(TMasterModalForm).
所以问题是:
如何在这种非平凡的情况下管理前景窗口的设置?
PS:这是一个简化的描述,真正的应用程序也在做这个前景窗口的东西.
编译本单元时:
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行发表评论,它就会很好地编译.有人可以解释原因吗?我需要将日期作为类变量来存储日期间隔.
我有一个应用程序,用于TWebbrowser定期导航到特定的 URL 并提取一些数据。该应用程序保持 24x7 全天候运行,并在页面中进行大量导航。
问题是TWebbrowser有一个众所周知的内存泄漏问题,每次导航到一个新页面时,应用程序使用的内存都会增加。一段时间后,我的应用程序可以轻松使用超过 2GB 的 RAM。在导航数百次之后,抛出一个'Out of memory'or'Out of system resources'异常,解决它的唯一方法是重新启动应用程序。
奇怪的是FASTMM从来没有显示这些泄漏。当我使用我的应用程序几分钟并关闭它时,没有任何报告。
多年来,我一直在寻找解决此问题的方法(实际上自 2007 年我编写应用程序的第一个版本以来)。有一些解决方法,但实际上,它们都不能解决问题。对我来说,唯一的解决方法是定期关闭和打开应用程序。
我已经测试了该SetProcessWorkingSetSize方法,但它只是暂时缩小了应用程序使用的内存。几秒钟后,该应用程序再次使用大量内存。
我也试过EmbeddedWB,但随着它的下降TWebbrowser,它受到同样问题的困扰。
顺便说一句,我不能使用像 那样简单的组件IdHTTP,因为我需要在访问的网站中进行一些 JavaScript 操作。
有谁知道这个问题是否真的有解决方案?
我有一个主要表格和状态表格,类似于这里提出的问题.但是,我的状态窗口的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) 我正在使用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) 假设我有一个"重"记录,例如包含多个动态值数组.我这样声明:
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)
我的意思是在性能方面,尤其是避免堆栈溢出.换句话说,函数是通过引用还是通过值返回结果?
我正在尝试检查是否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 ×10
delphi-2007 ×10
events ×1
foreground ×1
ide ×1
ipc ×1
memory-leaks ×1
readonly ×1
twebbrowser ×1
window ×1
windows ×1