标签: delphi-2007

在另一个TForm中嵌入TForm时如何避免问题?

我经常将一个TForm后代嵌入另一个TForm后代,如下所示:

var
  Form1: TForm1;
  Form2: TForm2;
begin
  Form2.Parent      := Form1;
  Form2.BorderStyle := bsNone;
  Form2.Align       := alClient;
  Form2.Show;
end;
Run Code Online (Sandbox Code Playgroud)

通常这很好用,但有时Form2中的控件没有正确对齐.这类问题有一般的解决方法吗?

有人知道造成这种"错位"的原因吗?

我知道我可以TFrame用于这种工作,但我有很多库代码,我必须重写,我没有看到任何理由为什么TFormin TForm方法不起作用?

编辑:我已将组件识别TcxListView为罪魁祸首,我已向组件供应商(DevExpress)提交了错误报告:

http://www.devexpress.com/issue=B194161

编辑2: DevExpress的开发人员已经分析了这个问题并说它实际上是TGridPanelEmbarcadero组件中的缺陷:

http://qc.embarcadero.com/wc/qcmain.aspx?d=90324

delphi layout vcl delphi-2007 tframe

7
推荐指数
1
解决办法
2911
查看次数

如何在对象类型的过程参数中传递一个nil值

我想在声明为的参数中传递一个nil值 procedure of object

考虑这段代码

情况1

type
  TFooProc = procedure(Foo1, Foo2 : Integer) of object;


procedure DoSomething(Param1:Integer;Foo:TFooProc);overload;
var
  a, b : Integer;
begin
   a:=b*Param1;
   //If foo is assigned
   if @Foo<>nil then
    Foo(a, b);
end;

procedure DoSomething(Param1:Integer);overload;
begin      
  DoSomething(Param1,nil);//here the delphi compiler raise this message [DCC Error] E2250 There is no overloaded version of 'DoSomething' that can be called with these arguments
end;
Run Code Online (Sandbox Code Playgroud)

案例2

我发现,如果我声明TFooProcprocedure类型的代码被编译.(但在我的情况下,我需要一种procedure of object类型)

type
  TFooProc = procedure(Foo1, Foo2 : Integer);


procedure …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2007 delphi-xe

7
推荐指数
1
解决办法
2135
查看次数

Delphi中用于WideString的WrapText

Delphi有一个WrapText功能:

function WrapText(const Line, BreakStr: string; const BreakChars: TSysCharSet; MaxCol: Integer): string;
function WrapText(const Line: string; MaxCol: Integer): string;
Run Code Online (Sandbox Code Playgroud)

现在我需要一个处理WideStrings的版本:

function WrapTextW(const Line: WideString; MaxCol: Integer): WideString;
Run Code Online (Sandbox Code Playgroud)

是否有任何此类功能已写入某处?

警告:并非每个宽字符串字符都是2字节

这就是为什么我害怕写它

更新:占用超过2个字节的字符示例:

资本拉丁W与环和cedilla

  • 字节:57 00 66 03 27 03
  • 在Chrome 17中呈现: 在此输入图像描述
  • 在Internet Explorer 9中呈现: 在此输入图像描述
  • 使用Segoe UI在记事本中呈现: 在此输入图像描述
  • 使用Consolas在记事本中呈现: 在此输入图像描述
  • 在浏览器中以sans-serif字体呈现:W̧̊
  • 在浏览器中以monospaced字体呈现:W??

delphi localization internationalization delphi-2007

7
推荐指数
1
解决办法
351
查看次数

如何探究英特尔®高级矢量扩展的可用性?

如何使用Delphi 2007检查盒子是否支持AVX.

我的问题仅限于查询CPU中的支持(假设操作系统正常/带有SP1的Windows 7).

由Chris Lomont 撰写的题为"英特尔®高级矢量扩展简介 "的PDF文档解释了如何执行此操作,并提供了一个示例代码实现,但在c ++中.

它也可以在这个页面上找到.

delphi delphi-2007 avx basm

7
推荐指数
1
解决办法
1048
查看次数

如何在Virtualtreeview中保持编辑器的活力?

我正在尝试基于VirtualTreeView构建一个简单的2列网格"属性编辑器".

(我想模仿在Delphi的IDE对象检查器上看到的外观和用户体验)


该组件几乎可以工作,可以处理多个编辑器, 但我面临一个恼人的错误:

当我单击一个新节点(一个新行)时,无论我点击了哪一列,都会选择该节点并显示编辑器.这是预期的和好的.

然后,当我单击同一行的第一列时,我希望看到我的编辑器内容得到验证,编辑器保持焦点(就像在delphi的对象检查器中一样).

但编辑器内容已经过验证,然后消失,整个节点(行)被选中.编辑器将不会返回(即使我单击第二列),直到我选择另一个节点并单击以前选择的节点.

编辑:添加了关于我的代码的插图和精度.

问题的插图

关于代码: 我没有在这里插入代码,因为我使用(作为起点)与高级演示(属性页面)上的代码完全相同的代码


我尝试并发现了什么:

这里找到的2003年编译的高级演示(属性树页面)似乎与我对组件(以及虚拟树视图)的期望一样.

但是当我编译这个相同的演示时(我尝试使用版本4.5.2,4.8.7甚至5.0.0来自谷歌代码的当前主干,在delphi 2007和2009上),错误再次出现!

我首先想到2003年和更新版本之间有一个记录在案的重大变化,但我找不到任何东西.我也玩过所有可用的选项试图解决这个问题,但没有成功.

我仍然不知道这个问题是来自新的delphi RTL还是虚拟视图中的重大变化(bug?).

所以我的问题:

  • 编译高级演示时遇到同样的问题吗?
  • 代码中的任何提示或解决方法来解决我的问题?

作为旁注,我今天下午几乎放弃了virtualtreeview,我想尝试另一个组件的解决方案......我发现这个有趣的问题,并决定尝试berg的组件,但在阅读建议时在购买过程中停止了他们的主页(见我对相关问题的评论)

delphi delphi-2009 delphi-2007 virtualtreeview

7
推荐指数
1
解决办法
2171
查看次数

Delphi Now()函数返回错误的值

我有基于DirectX的应用程序.最近我发现Now()函数在从我的图形引擎的主循环中调用时返回错误的值.它在引擎初始化之前调用一个值,在启动图形时在我的应用程序中调用时给出不同的值(通常在2-3分钟后退或向前).

我发现该Now()函数是Windows API GetLocalTime()函数的包装器.任何人都可以指出什么会影响这个函数的返回值?我timeGetTime()在我的应用程序的主循环中大量使用函数,它可能是问题的根源吗?另外我需要CheckSyncronize()在主循环中使用函数...

有任何想法吗?我的线索...... :(

主循环的代码:

    procedure Td2dCore.System_Run;
    var
        l_Msg: TMsg;
        l_Point: TPoint;
        l_Rect : TRect;
        l_Finish: Boolean;
    begin
        if f_WHandle = 0 then
        begin
            System_Log('Engine was not started!');
            Exit;
        end;

        if not Assigned(f_OnFrame) then
        begin
            System_Log('Frame function is not assigned!');
            Exit;
        end;

        // MAIN LOOP
        l_Finish := False;
        while not l_Finish do
        begin
            // dispatch messages
            if PeekMessage(l_Msg, 0, 0, 0, PM_REMOVE) then
            begin
                if l_Msg.message = WM_QUIT then …
Run Code Online (Sandbox Code Playgroud)

delphi datetime delphi-2007

7
推荐指数
1
解决办法
3842
查看次数

如何确定用户帐户是否是AD组的(间接)成员?

如何确定用户帐户是否是AD组的成员,尤其是当用户不是该组的直接成员时

一个例子:

  • user1是group1的成员
  • group1是group2的成员
  • (虚构)函数调用的结果IsUserMemberOf('user1', 'group2')应为TRUE

对于.NET,有一个解决方案:

static bool IsUserMemberOf(string userName, string groupName)
{
    using (var ctx = new PrincipalContext(ContextType.Domain))
    using (var groupPrincipal = GroupPrincipal.FindByIdentity(ctx, groupName))
    using (var userPrincipal = UserPrincipal.FindByIdentity(ctx, userName))
    {
        return userPrincipal.IsMemberOf(groupPrincipal);
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎么能用Delphi(Delphi-2007)做到这一点?

解:

我接受了Remko的答案,但由于他的代码在Delphi-2007(某些String/WideString问题)下不起作用,这里是我正在运行的D2007版本:

unit Unit1;

interface

uses  // Jedi ApiLib
  SysUtils, Classes, Windows, JwaActiveDs, JwaAdsTlb, JwaNative, JwaWinNT, JwaWinBase,
  JwaNtSecApi, JwaNtStatus,  JwaWinType;    

type
  // Some Helper Types
  TSidArray = array of PSID;
  PSidArray = ^TSidArray;

  TAdsValueArray = array[0..ANYSIZE_ARRAY-1] of ADSVALUE;
  PAdsValueArray …
Run Code Online (Sandbox Code Playgroud)

delphi active-directory delphi-2007

7
推荐指数
1
解决办法
2440
查看次数

要安装哪些更新才能访问最新版本的Delphi 2007?

在我的注册用户下载页面中有一些Delphi 2007补丁.(如果您有多个注册版本,此页面非常笨拙.)我不再记得安装最新版Delphi 2007的正确组合是什么.

是否有适用于所有补丁的ISO,或者推荐使用最新完整补丁的Delphi 2007的方法是什么?唯一的ISO似乎是CodeGear RAD Studio 2007 ISO(2007年12月),我认为这不是最新的完全修补版本,因为2007年12月标签.

似乎正确的组合是:

delphi delphi-2007

7
推荐指数
1
解决办法
2028
查看次数

保持beforepost事件中的值到afterpost事件

我正在为Delphi 2007编写这个问题,但我很确定这是所有语言中的常见问题.

所以,我有一个项目,我需要保存关于某些字段的旧值和新值的信息(在我正在使用的数据集的BeforePost事件中给出)并在AfterPost事件中使用它们.

目前,我一直在使用全局变量,但在项目中已经有很多这样的变量,在管理文档和/或注释时,这成为一个真正的问题.

基本上,我问是否有更好的方法(在Delphi 2007或一般情况下)保持数据集的BeforePost事件的信息并将它们返回到AfterPost事件中.

delphi events delphi-2007

7
推荐指数
1
解决办法
921
查看次数

我可以将扩展记录的方法分配给Delphi中的事件吗?

给出以下记录类型:

type
  TMyRecord = record
  private
    procedure SomeMethod(_Sender: TObject);
  end;
Run Code Online (Sandbox Code Playgroud)

应该可以将此方法指定为事件处理程序吗?

var
  MyRecord: TMyRecord;
begin
  Button1.OnClick := MyRecord.SomeMethod;
end;
Run Code Online (Sandbox Code Playgroud)

在Delphi 2007中,我在分配后得到内部编译器错误C1264.

我不确定Record方法的内部结构是否满足分配给事件指针的要求.

编辑:正如David Heffernan所指出的,这是Delhpi 2007中的编译器错误.我最终使用了以下解决方法:

type
  TMyRecord = record
  private
    procedure SomeMethod(_Sender: TObject);
    function GenerateNotifyEvent(_CodePtr: pointer): TNotifyEvent;
  end;

function TMyRecord.GenerateNotifyEvent(_CodePtr: pointer): TNotifyEvent;
var
  Method: TMethod;
begin
  Method.Data := @Self;
  Method.Code := _CodePtr;
  Result := TNotifyEvent(Method);
end;

var
  MyRecord: TMyRecord;
begin
  Button1.OnClick := MyRecord.GenerateNotifyEvent(@TMyRecord.SomeMethod);
end;
Run Code Online (Sandbox Code Playgroud)

不像简单的任务那么好,但足够好.我只是希望我可以简单地更新到更新版本的Delphi,其中修复了该错误.

delphi delphi-2007

7
推荐指数
1
解决办法
306
查看次数