继续这个主题:
我已经写了有下拉菜单是一个通用的代码的任何 TControl,但由于某种原因,剂量按预期工作不是TPanel:
var
TickCountMenuClosed: Cardinal = 0;
LastPopupControl: TControl;
type
TDropDownMenuHandler = class
public
class procedure MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
end;
TControlAccess = class(TControl);
class procedure TDropDownMenuHandler.MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if LastPopupControl <> Sender then Exit;
if (Button = mbLeft) and not ((TickCountMenuClosed + 100) < GetTickCount) then
begin
if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
ReleaseCapture;
// SetCapture(0);
if Sender …Run Code Online (Sandbox Code Playgroud) 如何使我的非模态表单始终位于我的主表单之上?
我试过了:
procedure TForm3.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WndParent := Application.MainForm.Handle;
end;
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常.这是正确的方法吗?
我应该用WM_WINDOWPOSCHANGED;吗?(我没见过CM_WINDOWPOSCHANGED或类似)
TGraphicControl是否会被通知此消息(它没有Handle)?什么是正确的方法?
谢谢.
接受答案后只是一个问题:
OnResize即使只有控制位置的顶部/左侧发生了变化,奇怪地或者可能有意地触发:即使没有进行实际的调整并且控制被移动,在调用之后立即调用
Delphi 7 Resize中.
这是设计的吗?TControl.SetBoundsPerform(WM_WINDOWPOSCHANGED)
在XP上,如果我想在以下位置查看XML,这段代码运行正常TWebBrowser:
uses ComObj, MSHTML, ActiveX;
procedure DocumentFromString(ABrowser: TWebBrowser; const HTMLString: wideString);
var
v: OleVariant;
HTMLDocument: IHTMLDocument2;
begin
if not Assigned(ABrowser.Document) then
begin
ABrowser.Navigate('about:blank');
while ABrowser.ReadyState <> READYSTATE_COMPLETE do
begin
Application.ProcessMessages;
Sleep(0);
end;
end;
HTMLDocument := ABrowser.Document as IHTMLDocument2;
v := VarArrayCreate([0, 0], varVariant);
v[0] := HTMLString;
HTMLDocument.Write(PSafeArray(TVarData(v).VArray));
HTMLDocument.Close;
end;
procedure WebBrowserXML(ABrowser: TWebBrowser; const XmlString: WideString);
var
xml, xsl: OleVariant;
HTMLString: WideString;
begin
xml := CreateOleObject('Msxml2.DOMDocument');
xml.async := False;
xml.loadXML(XmlString);
// Assert(xml.parseError.errorCode = 0);
xsl := CreateOleObject('Msxml2.DOMDocument');
xsl.validateOnParse := …Run Code Online (Sandbox Code Playgroud) 我想将整个 TMenuItem 及其子项克隆到另一个 TPopupMenu。这是一个很好的代码:
function CloneMenuItem(SourceItem: TMenuItem): TMenuItem;
var
I: Integer;
Begin
with SourceItem do
Begin
Result := NewItem(Caption, Shortcut, Checked, Enabled, OnClick, HelpContext, Name + 'Copy');
for I := 0 To Count - 1 do
Result.Add(CloneMenuItem(Items[I]));
end;
end;
Run Code Online (Sandbox Code Playgroud)
以下工作正常(b1 是一个带有子菜单的 PopupMenu1.TMenuItem):
PopupMenu2.Items.Add(CloneMenuItem(b1));
Run Code Online (Sandbox Code Playgroud)
问题是如果 SourceItem 是根项目,我无法克隆整个TPopupMenu。例如:
PopupMenu2.Items.Add(CloneMenuItem(PopupMenu1.Items));
Run Code Online (Sandbox Code Playgroud)
行不通。我只能看到1 项,就好像它是一个分隔符。
我需要实现控件的TList后代+额外的对象.
就像是:
List.Add(AControl, AObject)
Run Code Online (Sandbox Code Playgroud)
因此,名单将同时举行 AControl, AObject
使用Delphi 7执行此操作的最佳方法是什么?