小编Vla*_*lad的帖子

任何TControl的下拉菜单

继续这个主题:

TButton的下拉菜单

我已经写了有下拉菜单是一个通用的代码的任何 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)

delphi delphi-7 drop-down-menu

6
推荐指数
1
解决办法
1052
查看次数

如何使我的表格始终在我的主要表格上?

如何使我的非模态表单始终位于我的主表单之上?

我试过了:

procedure TForm3.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.WndParent := Application.MainForm.Handle;
end;
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常.这是正确的方法吗?

delphi delphi-7

4
推荐指数
1
解决办法
612
查看次数

如何实现自定义TGraphicControl.OnResize?

我应该用WM_WINDOWPOSCHANGED;吗?(我没见过CM_WINDOWPOSCHANGED或类似)

TGraphicControl是否会被通知此消息(它没有Handle)?什么是正确的方法?

谢谢.


接受答案后只是一个问题:

OnResize即使只有控制位置的顶部/左侧发生了变化,奇怪地或者可能有意地触发:即使没有进行实际的调整并且控制被移动,在调用之后立即调用
Delphi 7 Resize中. 这是设计的吗?TControl.SetBoundsPerform(WM_WINDOWPOSCHANGED)

delphi delphi-7

4
推荐指数
1
解决办法
870
查看次数

使用TWebBrowser在Vista上查看类似于IE的XML

在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)

xml delphi xslt internet-explorer twebbrowser

4
推荐指数
1
解决办法
994
查看次数

如何克隆 TPopupMenu 的菜单项?

我想将整个 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 项,就好像它是一个分隔符。

delphi delphi-7

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

如何在最小化时隐藏我的表单?

除了我的主要表单,我需要我的表单通知我的主表单并隐藏我最小化它们(而不是最小化到桌面窗口).

如何才能做到这一点?

我的表单是这样创建的:如何使我的表单始终位于我的主要表单之上?

delphi delphi-7

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

TList后代与另一个对象?

我需要实现控件的TList后代+额外的对象.
就像是:

List.Add(AControl, AObject)
Run Code Online (Sandbox Code Playgroud)

因此,名单将同时举行 AControl, AObject

使用Delphi 7执行此操作的最佳方法是什么?

delphi delphi-7

-2
推荐指数
1
解决办法
429
查看次数