标签: delphi-10.1-berlin

Delphi TTrackBar 没有完整事件

Delphi TTrackBar 有两个事件用于跟踪更改:

  1. 变化时

  2. 追踪中

但他们俩都做同样的事情。例如:

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  ShowMessage(TrackBar1.Value.ToString);
end;
Run Code Online (Sandbox Code Playgroud)

任何小的变化都会显示10消息。

如何检测手机上的最后更改?所有跟踪之后都必须发生更改吗?

delphi firemonkey delphi-10-seattle delphi-10.1-berlin

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

我无法使用 TIdIMAP4 仅检索未读消息

我正在尝试使用 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)

delphi imap indy delphi-10.1-berlin

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

正确进行线程 FTP 下载 (Indy/Android)

我已经制作了一个 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)

delphi ftp android indy delphi-10.1-berlin

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

当 ListView 所选项目发生更改时调用什么事件?

我想每当 ListView 中的选定项目发生变化时运行一个过程。显而易见的选择是 OnSelectItem,但当用户从一个选定项目移动到另一个选定项目(使用鼠标或箭头键)时,它会被调用两次。同样,在项目之间移动时,OnChange 会被调用三次

在这些条件下是否存在仅生成一次的事件?OnClick 生成一次,但不包括使用箭头键等在项目之间移动。

delphi vcl delphi-10.1-berlin

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

如何将TObjectList用于任意类类型?

我对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)

delphi generics inheritance delphi-10.1-berlin

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

是否可以初始化函数的常量引用数组?

在阅读了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)

delphi delphi-10.1-berlin

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

Delphi:TIdTCPClient 断开连接不要关闭连接

我正在调查不断增长的活动 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 上是一样的)

delphi tcp indy delphi-10.1-berlin

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

如何用TCheckBox中的属性替换全局变量?

我有一个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)

delphi tcheckbox delphi-10.1-berlin

0
推荐指数
1
解决办法
139
查看次数

为什么FMX.TWebBrowser不能在DelphiDocs的桌面应用程序中使用?

TWebBrowser文件中提到,

注意:TWebBrowser是一个移动组件.它不能在FireMonkey桌面应用程序中使用.

为什么这个限制?在Windows上TWebBrowser默认为Internet Explorer并且工作正常.维基是错的吗?

delphi twebbrowser delphi-10.1-berlin

0
推荐指数
1
解决办法
416
查看次数

StrToDate无法转换从DateToStr获得的值

我有一个旧的申请.它具有存储在其数据中的本地化格式的日期.此字符串仅用于显示,因此可以将其置于本地化表单中.现在我们需要将它重用为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中的错误吗?

windows delphi delphi-10.1-berlin

0
推荐指数
1
解决办法
223
查看次数