我经常将一个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组件中的缺陷:
我想在声明为的参数中传递一个nil值 procedure of object
考虑这段代码
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)
我发现,如果我声明TFooProc的procedure类型的代码被编译.(但在我的情况下,我需要一种procedure of object类型)
type
TFooProc = procedure(Foo1, Foo2 : Integer);
procedure …Run Code Online (Sandbox Code Playgroud) 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 2007检查盒子是否支持AVX.
我的问题仅限于查询CPU中的支持(假设操作系统正常/带有SP1的Windows 7).
由Chris Lomont 撰写的题为"英特尔®高级矢量扩展简介 "的PDF文档解释了如何执行此操作,并提供了一个示例代码实现,但在c ++中.
它也可以在这个页面上找到.
我正在尝试基于VirtualTreeView构建一个简单的2列网格"属性编辑器".
(我想模仿在Delphi的IDE对象检查器上看到的外观和用户体验)
该组件几乎可以工作,可以处理多个编辑器, 但我面临一个恼人的错误:
当我单击一个新节点(一个新行)时,无论我点击了哪一列,都会选择该节点并显示编辑器.这是预期的和好的.
然后,当我单击同一行的第一列时,我希望看到我的编辑器内容得到验证,编辑器保持焦点(就像在delphi的对象检查器中一样).
但编辑器内容已经过验证,然后消失,整个节点(行)被选中.编辑器将不会返回(即使我单击第二列),直到我选择另一个节点并单击以前选择的节点.
编辑:添加了关于我的代码的插图和精度.

关于代码: 我没有在这里插入代码,因为我使用(作为起点)与高级演示(属性页面)上的代码完全相同的代码
我尝试并发现了什么:
在这里找到的2003年编译的高级演示(属性树页面)似乎与我对组件(以及虚拟树视图)的期望一样.
但是当我编译这个相同的演示时(我尝试使用版本4.5.2,4.8.7甚至5.0.0来自谷歌代码的当前主干,在delphi 2007和2009上),错误再次出现!
我首先想到2003年和更新版本之间有一个记录在案的重大变化,但我找不到任何东西.我也玩过所有可用的选项试图解决这个问题,但没有成功.
我仍然不知道这个问题是来自新的delphi RTL还是虚拟视图中的重大变化(bug?).
所以我的问题:
作为旁注,我今天下午几乎放弃了virtualtreeview,我想尝试另一个组件的解决方案......我发现这个有趣的问题,并决定尝试berg的组件,但在阅读建议时在购买过程中停止了他们的主页(见我对相关问题的评论)
我有基于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) 如何确定用户帐户是否是AD组的成员,尤其是当用户不是该组的直接成员时
一个例子:
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 2007补丁.(如果您有多个注册版本,此页面非常笨拙.)我不再记得安装最新版Delphi 2007的正确组合是什么.
是否有适用于所有补丁的ISO,或者推荐使用最新完整补丁的Delphi 2007的方法是什么?唯一的ISO似乎是CodeGear RAD Studio 2007 ISO(2007年12月),我认为这不是最新的完全修补版本,因为2007年12月标签.
似乎正确的组合是:
我正在为Delphi 2007编写这个问题,但我很确定这是所有语言中的常见问题.
所以,我有一个项目,我需要保存关于某些字段的旧值和新值的信息(在我正在使用的数据集的BeforePost事件中给出)并在AfterPost事件中使用它们.
目前,我一直在使用全局变量,但在项目中已经有很多这样的变量,在管理文档和/或注释时,这成为一个真正的问题.
基本上,我问是否有更好的方法(在Delphi 2007或一般情况下)保持数据集的BeforePost事件的信息并将它们返回到AfterPost事件中.
给出以下记录类型:
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 ×10
delphi-2007 ×10
avx ×1
basm ×1
datetime ×1
delphi-2009 ×1
delphi-xe ×1
events ×1
layout ×1
localization ×1
tframe ×1
vcl ×1