Delphi TTrackBar 有两个事件用于跟踪更改:
变化时
追踪中
但他们俩都做同样的事情。例如:
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
ShowMessage(TrackBar1.Value.ToString);
end;
Run Code Online (Sandbox Code Playgroud)
任何小的变化都会显示10消息。
如何检测手机上的最后更改?所有跟踪之后都必须发生更改吗?
我正在尝试使用 IMAP 检索所有未读电子邮件,并且我似乎可以连接并找到那些未读邮件(例如,我可以看到 SearchResult 返回与我的 3 个当前未读邮件相对应的 3 个项目),但是 IMAP .Retrieve 调用总是返回 false,不检索它们中的任何一个。
您是否看到我的代码中必须缺少什么?
procedure TForm1.btnUnreadMessagesClick(Sender: TObject);
var i: integer;
SearchInfo: array of TIdIMAP4SearchRec;
MSG: TIdMessage;
begin
Memo1.Lines.Clear;
IMAP.Host := 'outlook.office365.com';
IMAP.Port := 993;
IMAP.Username := 'xxxxx@acme.com';
IMAP.Password := 'xxxxx';
SSL.Host := IMAP.Host;
SSL.Port := IMAP.Port;
SSL.Destination := SSL.Host + ':' + IntToStr(SSL.Port);
SSL.MaxLineLength := MaxInt;
IMAP.IOHandler := SSL;
IMAP.UseTLS := utUseImplicitTLS;
IMAP.Connect;
IMAP.SelectMailBox('INBOX');
SetLength(SearchInfo, 1);
SearchInfo[0].SearchKey := skUnseen;
IMAP.UIDSearchMailBox(SearchInfo);
for i := 0 to High(IMAP.MailBox.SearchResult) do begin
MSG := …Run Code Online (Sandbox Code Playgroud) 我已经制作了一个 IdFTP 从我的 FTP 服务器下载文件,但是当我尝试将其设为线程时,它卡在 Android 操作系统中的“正在解析主机名...”中。
没有线程(工作正常):
uses ..., IdFTPCommon;
var
RecordDownload: TMemoryStream;
uses System.IOUtils;
procedure TForm1.Button1Click(Sender: TObject);
begin
IdFTP1.Host := 'motoristaajudante.ddns.net';
IdFTP1.Port := 2121;
IdFTP1.DataPortMin := 50100;
IdFTP1.DataPortMax := 51100;
IdFTP1.Username := 'anonymous';
IdFTP1.TransferType := IdFTPCommon.TIdFTPTransferType.ftBinary;
IdFTP1.Passive := True;
try
IdFTP1.Connect();
IdFTP1.Get('00001.m4a',TPath.GetDocumentsPath + PathDelim + '00001.m4a',True,False);
except
IdFTP1.Disconnect;
end;
end;
procedure TForm1.IdFTP1AfterGet(ASender: TObject; AStream: TStream);
begin
IdFTP1.Disconnect;
end;
procedure TForm1.IdFTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
if FileExists(TPath.GetDocumentsPath + PathDelim + '00001.m4a') then
begin
ShowMessage('Downloaded!');
end;
end;
Run Code Online (Sandbox Code Playgroud)
我按照这个解决方案编写的线程代码:
uses …Run Code Online (Sandbox Code Playgroud) 我想每当 ListView 中的选定项目发生变化时运行一个过程。显而易见的选择是 OnSelectItem,但当用户从一个选定项目移动到另一个选定项目(使用鼠标或箭头键)时,它会被调用两次。同样,在项目之间移动时,OnChange 会被调用三次。
在这些条件下是否存在仅生成一次的事件?OnClick 生成一次,但不包括使用箭头键等在项目之间移动。
我对Delphi中的泛型仍然有些模糊,但已经广泛使用TObjectList<>.现在我有一种情况,我有一个具有这样一个私有字段的基类,但需要为任意类创建,也从另一个基类继承.
为了澄清,我有两个基类:
type
TItem = class;
TItems = class;
TItemClass = class of TItem;
TItem = class(TPersistent)
private
FSomeStuffForAllIneritedClasses: TSomeStuff;
end;
TItems = class(TPersistent)
private
FItems: TObjectList<TItem>;
FItemClass: TItemClass;
public
constructor Create(AItemClass: TItemClass);
destructor Destroy; override;
function Add: TItem;
...
end;
Run Code Online (Sandbox Code Playgroud)
然后,这对类进一步继承到更具体的类中.我想要为所有这些对象列表共享对象列表,而每个对象列表在内部实际上保持不同的类型.
type
TSomeItem = class(TItem)
private
FSomeOtherStuff: TSomeOtherStuff;
...
end;
TSomeItems = class(TItems)
public
function Add: TSomeItem; //Calls inherited, similar to a TCollection
procedure DoSomethingOnlyThisClassShouldDo;
...
end;
Run Code Online (Sandbox Code Playgroud)
现在的问题是创建实际的对象列表.我试着这样做:
constructor TItems.Create(AItemClass: TItemClass);
begin
inherited Create;
FItemClass:= AItemClass;
FItems:= …Run Code Online (Sandbox Code Playgroud) 在阅读了Embarcadero关于程序类型和匿名方法的文档以及David Heffernan对此问题的解释后,我仍然不太明白为什么编译器禁止初始化函数的常量引用数组,如下例中的C_BAR.
program MyProgram;
{$APPTYPE CONSOLE}
{$R *.res}
type
TFoo = function: Integer;
TBar = reference to function: Integer;
function FooBar: Integer;
begin
Result := 42;
end;
const
// This works
C_FOO: array[0..0] of TFoo = (FooBar);
// These lines do not compile
// C_BAR: array[0..0] of TBar = (FooBar); // TBar incompatible with Integer
// C_BAR: array[0..0] of TBar = (@FooBar); // TBar incompatible with Pointer
var
Foo: array[0..0] of TFoo; …Run Code Online (Sandbox Code Playgroud) 我正在调查不断增长的活动 TCP 连接。
似乎TIdTCPClient.Disconnect没有关闭连接。
这是一个示例项目
program Project2;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
IdTCPClient;
var
FClient: TIdTCPClient;
begin
try
FClient := TIdTCPClient.Create();
FClient.Connect('LOCALHOST', 6379);
FClient.Disconnect;
FClient.Free;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Run Code Online (Sandbox Code Playgroud)
多次打开此控制台应用程序会导致连接增加
netstat -na | find "6379"
Run Code Online (Sandbox Code Playgroud)
旁注:我在柏林 10、Windows 7 上(但在 Windows 10 上是一样的)
我有一个Checkbox1,我想自定义,当用户点击复选框的标题(文本)时,它不会改变它的状态(选中/取消选中),但只有当它点击实际的复选框时才会这样做.
这是当前代码,包含2个全局变量,一个表示何时跳过更改状态,另一个表示记住当前状态并确保它在OnClick之后保持不变 - 因为当流程处于OnClick时状态已经更改:
var
gSkipClick:boolean = false;
gPrevState:boolean;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
// Make sure previous state is assigned when Skip
if gSkipClick then
Checkbox1.Checked := gPrevState;
end;
procedure TForm1.CheckBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if (x > 12) then
begin
// Click outside checkbox square
gSkipClick := True; // skip Click
gPrevState := CheckBox1.Checked; // save current state
end
else
gSkipClick := False; // enable Click
end;
Run Code Online (Sandbox Code Playgroud)
现在我想用TCheckBox中的2个新属性来替换全局变量:
TCheckBox = class(Vcl.StdCtrls.TCustomCheckBox)
private
FSkipStateChange:Boolean;
FPrevState:Boolean; …Run Code Online (Sandbox Code Playgroud) 该TWebBrowser文件中提到,
注意:TWebBrowser是一个移动组件.它不能在FireMonkey桌面应用程序中使用.
为什么这个限制?在Windows上TWebBrowser默认为Internet Explorer并且工作正常.维基是错的吗?
我有一个旧的申请.它具有存储在其数据中的本地化格式的日期.此字符串仅用于显示,因此可以将其置于本地化表单中.现在我们需要将它重用为TDateTime.这似乎很简单:因为我们从DateToStr获取了字符串,我们将使用StrToDate将其转换回来.所以我写了一个小的控制台程序来验证它:
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
var
S:String;
D: TDateTime;
begin
S := DateToStr(Now);
Writeln(S);
D := StrToDate(S); //! throws an EConvertError
Readln;
end.
Run Code Online (Sandbox Code Playgroud)
它抛出一个EConvertError:Project Project1.exe引发异常类EConvertError,消息为''28.9. 2017'不是有效日期'.这是不正确的,异常提到的日期是有效的!它刚刚通过DateToStr生成.这对我来说完全没有意义.这可能是Windows 10中的错误吗?
delphi ×10
indy ×3
android ×1
firemonkey ×1
ftp ×1
generics ×1
imap ×1
inheritance ×1
tcheckbox ×1
tcp ×1
twebbrowser ×1
vcl ×1
windows ×1