我正在使用Zarko Gajic将更多(自定义)数据存储到树视图的树节点中为每个节点项添加其他字符串,但我发现如果我的应用程序已经闲置了很长时间,那么我拥有的值存储在自定义树节点中的节点消失.
这就是我昨天离开时的定制treenode

这就是今天早上的样子(注意fMyProperty值现在为空)

我已经确认我的计算机从未休眠或睡眠,但系统会在锁定1分钟后关闭显示器以节省电量.然而,计算机需要闲置一段时间才能发生此问题.它在夜间闲置时最明显,但如果只闲置30分钟则不太可能发生.
我能想到的唯一可能导致这种情况的是操作系统将应用程序内存交换到磁盘,当您重新激活计算机时,它会被换回内存.正如您所看到的,FItemId正在发生变化,因此它似乎正在"重建"Treeview,从而失去与自定义Tree节点的关联.
我用一个非常简单的应用程序重现了这个问题,其代码如下.
我知道我可以使用另一种方法来存储额外的数据,通过使用Treenode中的数据字段,但是能够这样做会很好,因为我不必担心在删除节点时释放额外的内存块.
我该怎么做才能防止这种数据丢失?
unit Test04Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls;
type
TMyTreeNode = class(TTreeNode)
private
fMyProperty : string;
public
property MyProperty : string read fMyProperty write fMyProperty;
end;
TForm1 = class(TForm)
TreeView1: TTreeView;
StatusBar1: TStatusBar;
procedure FormCreate(Sender: TObject);
procedure TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
private
fTreeView1_Selected: TMyTreeNode;
property TreeView1_Selected : TMyTreeNode read fTreeView1_Selected;
{ Private declarations }
public
{ …Run Code Online (Sandbox Code Playgroud) 我在这里找到了类似的问题,但它与我想要做的事情无关.我已经在互联网上做了很多研究,我已经确定Delphi正在按设计或预期工作,如果时间为零则省略时间.我有一个应用程序在列表视图中显示日期和时间,当时间是午夜时,它不显示00:00:00,因此使结果看起来不均匀且不合适.
我已经解决了这个仍然是locale独立的方式是添加一个微秒的时间,请参阅示例代码:
program Test11;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, Winapi.Windows;
begin
try
Writeln(DateTimeToStr(44167, TFormatSettings.Create(GetThreadLocale)));
Writeln(DateTimeToStr(44167.00000001, TFormatSettings.Create(GetThreadLocale)));
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Run Code Online (Sandbox Code Playgroud)
以后的输出:
02/12/2020
02/12/2020 00:00:00
Run Code Online (Sandbox Code Playgroud)
问题是 - 是否有更好的,更编程的正确方法来实现这一目标?
运行Delphi XE6
我已经介绍了TObjectList,我想利用它,除了我似乎无法从Embarcadero的网站获取示例代码为我工作.这是我的代码:
unit Test03Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
{ Declare a new object type. }
TNewObject = class
private
FName: String;
public
constructor Create(const AName: String);
destructor Destroy(); override;
end;
{ TNewObject }
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor TNewObject.Create(const AName: String);
begin
FName := AName;
end; …Run Code Online (Sandbox Code Playgroud) 我已经做了大量的搜索,并在Stackoverflow上找到了一些有用的提示,以获取用户名和计算机名称 - 我甚至发现了 Norrit在Delphipages上发布的一些代码,正是我需要它做的 - 除了在Win64目标平台下运行时,获取全名不起作用 - 它返回一个空字符串.它在运行Win32版本时返回全名.
GetCurrentUser和GetDomainServerName函数在Win32和Win64中都有效.
谷歌搜索"delphi netusergetinfo"会带来很多超过10年的结果 - 甚至在Delphi使用Win64之前.它还提出了一个专家交流答案,链接到一些我在上面的一些lanman示例代码,所以我有点卡在那里.
有没有人知道我必须做什么改变才能让GetDomainFullName在Win64下运行 - 或者是否有人可以使用替代代码来获取当前登录用户的全名?
链接腐烂时,如下所示的完整代码.
unit NetAPI32;
interface
uses
Windows, SysUtils;
function GetCurrentUser(): String;
function GetDomainServerName(): String;
function GetDomainFullName(ServerName, UserName: String): String;
implementation
function NetUserGetInfo(ServerName, UserName: PWideChar; Level: DWORD; var Buffer: Pointer): DWORD; stdcall; external 'netapi32.dll' name 'NetUserGetInfo';
function NetApiBufferFree(Buffer: pointer): DWORD; stdcall; external 'netapi32.dll' name 'NetApiBufferFree';
function NetWkstaUserGetInfo(ServerName: PWideChar; Level: DWORD; var Buffer: Pointer): Longint; stdcall; external 'netapi32.dll' name 'NetWkstaUserGetInfo'; …Run Code Online (Sandbox Code Playgroud) 我有一个动态网页,其中的内容可能包含 1 到 10 个链接,在文本框中提供,类似于以下内容:
<input size="50" id="link" value="http://Something.Something" type="text">
<input size="50" id="link" value="http://SomethingElse.Something" type="text">
Run Code Online (Sandbox Code Playgroud)
我需要 javascript 才能读取所有链接,并能够操作数据(存储在数组中,输出到屏幕等)
我知道我可以使用以下方法读取单个 ID
var link = document.getElementById('link');
Run Code Online (Sandbox Code Playgroud)
哪个将返回第一个匹配项 - 但是,我如何执行循环或获取所有链接的所有值,请记住无法事先确定链接数量?
PS 我试过使用 getElementsByTagName('input') 但是页面上有更多的输入,这意味着它得到的结果比我想要的要多。