小编X-R*_*Ray的帖子

如何防止屏幕在平板电脑上自动旋转?

在下面的链接中,Microsoft描述了两种限制平板电脑上应用程序屏幕旋转的方法.

http://msdn.microsoft.com/en-ca/library/windows/apps/hh700342.aspx

发生的事情是德尔福的(XE3)TRibbon不能很好地处理旋转.它往往会挂起来.

正如所料,MS网站描述了如何从MS开发产品中做到这一点.我不知道如何在我的Delphi项目中做到这一点.

方法1:

将此添加到您的appxmanifest文件:

<InitialRotationPreference>
    <Rotation Preference="landscape"/>
    <Rotation Preference="landscapeFlipped"/>
</InitialRotationPreference>
Run Code Online (Sandbox Code Playgroud)

我还没有找到appxmanifest应该成为应用程序的一部分,所以我可以在delphi中执行此操作.

方法2:

用代码调用它:

 Windows.Graphics.Display.DisplayProperties.AutoRotationPreferences =
            Windows.Graphics.Display.DisplayOrientations.Landscape;
Run Code Online (Sandbox Code Playgroud)

要将其迁移到delphi,我需要知道API DLL信息,以便我可以做类似的事情.

有任何想法吗?

是否有一个COM对象或DLL可以让我们访问它?

delphi ribbon tablet screen-rotation

5
推荐指数
1
解决办法
3166
查看次数

为什么不收集TInterfacedObject垃圾的后代?

我有一个基于TInterfacedObject的类.我将它添加到TTreeNode的Data属性.

TFacilityTreeItem=class(TInterfacedObject)
private
  m_guidItem:TGUID;
  m_SomeOtherNode:TTreeNode;
public
end;
Run Code Online (Sandbox Code Playgroud)

我创建了这个对象的许多实例,并假设因为它们被引用计数,我不需要释放它们.那会很方便.

但是,在检查时,我打开了ReportMemoryLeaksOnShutdown,发现它们毕竟没有被释放.

这些对象是在放置在主窗体上的框架中创建的.在主窗体的FormClose中,我清除树节点,以便释放每个对象.

发生了什么?

谢谢您的帮助!

delphi reference-counting tinterfacedobject

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

比较GUID所以我可以按GUID排序

什么是对GUID列表进行排序的一种不错的快速方法(如TGuid).我以为我只是使用SysUtils.CompareMem(P1,P2:指针;长度:整数):布尔值; 直到我意识到它返回布尔值.

我希望与CompareText()或CompareValue()类似的东西返回整数,以便它可以用于排序比较.

我想没有多少人愿意对GUID进行排序......任何想法?

我想我可以调用对TGuid记录的内容进行一些级联调用CompareValue().我的直觉告诉我必须有更好的方法!

谢谢!

delphi sorting guid

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

在TIdCmdTCPServer的基本使用方面需要帮助

我正在使用在delphi XE中使用TIdCmdTCPServer的概念验证应用程序。

我的代码似乎有问题,因为只有第一个命令有效。如果我重复相同的命令,它将“超时”。请参阅下面的客户端代码清单。

这是我的命令处理程序:

procedure TForm1.IdCmdTCPServer1CommandHandlersGetDateTimeCommand(ASender: TIdCommand);
begin
  ASender.Reply.SetReply(200, 'OK!');
  ASender.Reply.Text.Add(DateTimeToStr(Now));
  ASender.SendReply;  // I expect this must be redundant
end;
Run Code Online (Sandbox Code Playgroud)

这是服务器组件(这里没什么特别的;我设置端口号并创建了命令处理程序):

object IdCmdTCPServer1: TIdCmdTCPServer
  Bindings = <>
  DefaultPort = 7000
  CommandHandlers = <
    item
      CmdDelimiter = ' '
      Command = 'GetDateTime'
      Disconnect = False
      Name = 'TIdCommandHandler0'
      NormalReply.Code = '200'
      ParamDelimiter = ' '
      ParseParams = True
      Tag = 0
      OnCommand = IdCmdTCPServer1CommandHandlersGetDateTimeCommand
    end
  ExceptionReply.Code = '500'
  ExceptionReply.Text.Strings = (
    'Unknown Internal Error')
  Greeting.Code = '200'
  Greeting.Text.Strings = (
    'Welcome') …
Run Code Online (Sandbox Code Playgroud)

delphi indy

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

Delphi 6使用构造函数创建新表单

我是Delphi的新手,并且在动态创建新表单时遇到问题.我想用我制作的gui中的元素属性创建新表单.这是我想要动态创建的表单:

unit AddEmployeeF;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TAddEmployee = class(TForm)
    GroupBox1: TGroupBox;
    AddName: TLabel;
    AddDept: TLabel;
    AddPhone: TLabel;
    AddExtension: TLabel;
    AddDetails: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    procedure CancelButtonClick(Sender: TObject);
 private
    { Private declarations }
  public
    constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override;
  end;
var
  AddEmployee: TAddEmployee;

implementation

{$R *.dfm}
      constructor TAddEmployee.CreateNew(AOwner: TComponent; Dummy: Integer = 0; Detail : String); …
Run Code Online (Sandbox Code Playgroud)

delphi

4
推荐指数
2
解决办法
7784
查看次数

TPath.GetTempFileName回复"目录名无效"

TPath.GetTempFileName(包装WinAPI GetTempFileName)从登录到域的用户运行的应用程序调用时回复"目录名无效".

如果他们使用不使用域的登录,它可以工作.

有问题的客户在另一个国家,我也不熟悉如何更改域控制器的配置以避免此问题.

我假设由于我的应用程序是无法正常工作的应用程序,我应该以不同的方式获取临时文件名.

"以管理员身份运行"并没有帮助.

我指示他们确保他们完全控制TEMP和TMP系统环境变量中提到的文件夹,显然他们这样做但它仍然给出了相同的错误.

我的应用程序作为Win32 Delphi桌面应用程序,但由于Windows是错误的来源,我认为这些信息的用处有限.

Windows 10是操作系统.

windows delphi temp

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

需要帮助对JCL的TEvaluator进行有趣的调用

我正在使用JCL的表达评估员TEvaluator(由barry kelly捐赠的奇妙创作).(谢谢你!)

背景

我使用了AddFunc方法.

function MyFunc:double;
begin
  // calculations here
  Result:=1;  
end;
Run Code Online (Sandbox Code Playgroud)

您可以使用AddFunc方法使该函数可用:

  AddFunc('MyFunc', MyFunc);
Run Code Online (Sandbox Code Playgroud)

这是问题......

我需要在一个对象上调用一个方法而不是一个独立的例程.

原因是我有一个提供值的对象列表.

说我们有一个车辆对象列表.每个对象都有一个权重函数.我希望能够使每个对象的重量可用于公式中.

一个愚蠢的例子,但很容易解释:

type
  TVehicle=class
  private
  public
    function Weight:double;
  end;

function StrangeCalculation:double;
var
  vehicle:TVehicle;
begin
  for iVehicle = 0 to Count - 1 do
    begin
      vehicle:=GetVehicle(iVehicle);
      // E2250 There is no overloaded version of 'AddFunc' that can be called with these arguments
      eval.AddFunc(vehicle.Name, vehicle.Weight);
    end;

  Result:=eval.Evaluate('JeepTJWeight + FordF150Weight * 2');
end;
Run Code Online (Sandbox Code Playgroud)

我的选择:

  1. AddVar()或AddConst() - 但这不是很好,因为如果值不可用,我需要能够引发异常.

  2. 具有独立函数的AddFunc().不能这样做,因为变量的名称(和数量)在运行时才是未知的.

  3. 如果找不到变量,则修改对象以添加回调.我实际上已经完成了这个,但需要编辑源代码的副本以回复它以实现此目的.

  4. 创建一个能够使用方法函数的AddFunc().

选项#3实际上已构建,但额外的AddFunc会更好.麻烦的是我不知道提供什么方法​​原型.我认为TMethod会是方式,但我的知识在这里太有限了...这是我的尝试不成功但我仍然得到"E2250在eval.AddFunc中没有可以使用这些参数调用'AddFunc'的重载版本" ()像以前一样打电话.

TFloat64MethodFunc = function(c:pointer): …
Run Code Online (Sandbox Code Playgroud)

delphi jedi-code-library

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

Application.ProcessMessages 挂起?

我的单线程 delphi 2009 应用程序(尚未完成)已经开始出现 Application.ProcessMessages 挂起的问题。我的应用程序有一个 TTimer 对象,它每 100 毫秒触发一次以轮询外部设备。我使用 Application.ProcessMessages 在发生变化时更新屏幕,以便应用程序仍然响应。

其中之一是在网格 OnMouseDown 事件中。在那里,它有一个基本上挂起的 Application.ProcessMessages。删除它没有问题,只是我很快发现了另一个也阻塞的 Application.ProcessMessages。

我认为可能发生在我身上的事情是 TTimer 处于我目前正在调试的应用程序模式下可能需要很长时间才能完成。我已阻止 TTimer.OnTimer 事件处理程序重新输入相同的代码(见下文):

procedure TfrmMeas.tmrCheckTimer(Sender: TObject);
begin
  if m_CheckTimerBusy then
    exit;

  m_CheckTimerBusy:=true;
  try
    PollForAndShowMeasurements;
  finally
    m_CheckTimerBusy:=false;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

在哪些地方调用 Application.ProcessMessages 是不好的做法?OnPaint 例程会让人想起毫无意义的东西。

任何一般建议?

我很惊讶地看到在开发过程中出现这种问题!

delphi vcl delphi-2009

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

如何在代码中使用 [Setup] 部分中的值?

如何在代码中使用 [Setup] 部分中的值?

我怀疑我使用该工具的方式不正确;也许我应该以完全不同的方式来做这件事。

[Setup]
MyValue=some value

[code]

function InitializeSetup(): Boolean;
begin
  // blank
  MsgBox(GetEnv('MyValue'), mbError, MB_OK);

  // no expansion occurs
  MsgBox(ExpandConstant('MyValue'), mbError, MB_OK);

  // unknown constant "MyValue".
  MsgBox(ExpandConstant('{MyValue}'), mbError, MB_OK);

  Result := true;
end;
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助!

inno-setup

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

Delphi Win32 TXMLDocument 无法从线程实例化和使用?

我一直在使用 IndyTIdTCPServer对象并TXMLDocumentTIdTCPServer.OnExecute活动期间实例化对象实例。xml.Active我发现当设置为 true时出现异常非常令人惊讶:

未安装 Microsoft MSXML

procedure TForm4.tcpRXExecute(AContext: TIdContext);
var
  sResponseXML : string;
  xml:IXMLDocument;
begin
  // get message from client
  sResponseXML := AContext.Connection.IOHandler.ReadLn;

  xml:=TXMLDocument.Create(nil);
  
  // error here:  "Microsoft MSXML is not installed"
  xml.Active:=true;

  xml.Encoding:='UTF-8';

  xml.LoadFromXML(sResponseXML);

  // use the xml document
  
  //AContext.Connection.IOHandler.WriteLn('... message sent from server :)');
end;
Run Code Online (Sandbox Code Playgroud)

更深入地观察,我发现发生异常的原因TMSXMLDOMDocumentFactory.TryCoCreateInstance()是无法创建正确的文档对象实例,尽管GuidList从主线程接收到了与应用程序其他部分中接收到的相同的实例。我不明白为什么如果从组件的线程调用该对象则不会实例化。

以下是应实例化对象的 Embarcadero 代码:

class function TMSXMLDOMDocumentFactory.TryCoCreateInstance(const GuidList: array of TGUID): IUnknown;
var
  I: Integer;
  Status: HResult;
begin
  for I := …
Run Code Online (Sandbox Code Playgroud)

delphi indy txmldocument win32com indy10

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