小编Raf*_*ssi的帖子

Delphi indy 调用php脚本

我的服务器中有一个 php 脚本,它非常简单,因为他只有一个任务:将两个数据存储在 sql 数据库中。

http://mydomain.it/test.php?id=285&numero=504;
Run Code Online (Sandbox Code Playgroud)

如果你在浏览器中打开这个 url,你将在 sql 表中添加一行,如下所示

在此处输入图片说明

我也希望能够使用 firemonkey 将数据存储在数据库中,并且我在我的应用程序中放置了两个 TEdit 和一个 TButton。单击此代码执行的按钮:

var url: string;
 H: TIdHttp;
 SS: TStringStream;
begin
 url := 'http://mydomain.it/test.php?id='+IntToStr(a)+'&numero='+IntToStr(b);
 H := TIdHttp.Create(nil);
 try
  SS := TStringStream.Create;
  try

   try
    H.Post(url, SS);
   except
    on E:Exception do
    ShowMessage(e.Message);
   end;

  finally
   SS.Free;
  end;
 finally 
  H.Free;
 end;
Run Code Online (Sandbox Code Playgroud)

上面的代码运行得非常好,因为运行只需要 1 秒,而且我正在捕获异常(仅用于调试目的)。我有两个主要问题:

  1. 这是我第一次使用 indy,据我所知,这是做我需要的好方法。我不确定我是否将 放在try-except正确的位置;是吗?

  2. 如果互联网连接很慢怎么办?我应该使用类似下面的代码吗?

代码

var process: array of ITask;
begin

 SetLength(process, 1);

 process[0] := TTask.Create(
  procedure
   var url: string;
    H: TIdHttp;
    SS: TStringStream;
   begin …
Run Code Online (Sandbox Code Playgroud)

delphi indy

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

Delphi接口和类变量类型

我已经读过,接口对于解码代码是一件好事,Nick Hodges已经写了很好的章节.读我已经生成了这段代码:

//interfaces
type
 ILocalization = interface
  ['{1D144BCE-7D79-4672-8FB5-235422F712EE}']
  function localize(const aWordId: string): string;
 end;

type
 IActions = interface
  ['{31E8B24F-0B17-41BC-A9E4-F93A8E7F6ECF}']
  procedure addWord(const aIndex, aWord: string);
  procedure removeWord(const aIndex: string);
 end;

//implementation
type
 TLocalization = class sealed (TInterfacedObject, ILocalization, IActions)
  private
   FTranslationList: TDictionary<string, string>;
  public
   constructor Create;
   destructor Destroy; override;
   //interface implementations
   function localize(const aWordId: string): string;
   procedure addWord(const aIndex, aWord: string);
   procedure removeWord(const aIndex: string);
 end;
Run Code Online (Sandbox Code Playgroud)

我打算用这个类本地化(翻译)我的delphi android应用程序.


当我要创建一个类的实例时,我会执行以下操作.

var
 Italiano: TLocalization;
begin
 Italiano := TLocalization.Create;
end;
Run Code Online (Sandbox Code Playgroud)

既然TLocalization应该继承AddRef并且Release I最终不会尝试这个,但即使Italiano是类类型而不是接口类型,这是否会发生? …

delphi

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

Delphi启动后将线程设置为nil

今天我错过了一课,我发现了一段我无法理解的奇怪的代码.这是班级:

type
 TMemoMessageThread = class(TThread)
  strict private
   FMemo: TMemo;
   FMemoMessage: string;
  protected
   procedure Execute; override;
  public
   constructor Create(aMemo: TMemo);
   property MemoMessage: string read FMemoMessage write FMemoMessage;
 end;
Run Code Online (Sandbox Code Playgroud)

在这里,我创建了一个从TThread下降的类,因为我想模拟一个繁重的计算.看看非常简单的UI.

在此输入图像描述

单击Button2"创建暂停",创建一个Suspended线程,然后按此线程Button3.这是代码:

constructor TMemoMessageThread.Create(aMemo: TMemo);
begin

 if (aMemo = nil) then
  raise Exception.Create('tMemo non valid!!!');

 inherited Create(True);
 FreeOnTerminate := True;
 FMemo := aMemo;

end;

procedure TMemoMessageThread.Execute;
begin

 Synchronize(procedure
             begin
              FMemo.Lines.Add('... process in parallel thread ...');
             end);

 Sleep(7000); //simulate something heavy to compute

 Synchronize(procedure
             begin
              FMemo.Lines.Add(FMemoMessage + '. Done! :)'); …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading

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

Delphi队列和同步参数

我发布了一个让我对多线程感到困惑的问题,我没有在网上找到答案.让我们说我创造了类似的东西TTest = class(TThread),所以你可以想象我有一个执行.在里面我可以打电话:

Synchronize(procedure
            begin
             //code
            end);


Queue(procedure
            begin
             //code
            end);
Run Code Online (Sandbox Code Playgroud)

根据我的理解,上面的代码应该在匿名方法之前有另一个隐藏参数,Self.假设现在我不在派生类(如TTest)中,而且我处于按钮单击事件中.我可以这样称呼:

TTask.Run(
    procedure
    begin

      TThread.Queue(nil,
        procedure
        begin
          testB.Text := 'Please wait...';
        end;

        TThread.Queue(nil,
        procedure
        begin
          testB.Text := 'Please wait MORE...';
        end;

      end);
Run Code Online (Sandbox Code Playgroud)

在这里我使用nil作为参数因为(如果我是正确的)如果我调用了TThread.CurrentThread,当一个Queue完成时,另一个因为RemoveQueuedEvents()而被删除.

所以我真正的问题是:我如何确定何时通过nilTThread.CurrentThread

  • 我已经明白,在TThread的派生类中,如上面的TTest,我可以用匿名方法调用Queue/Sync,因为Self它来拯救.

  • 如果我必须在TTask.Run中调用队列或同步,我确定我必须使用nil参数吗?

我是这类新手,所以我发现这很难,我想理解这个概念,否则我会创建破碎的应用程序.我看到Nick Hodges在他的书中使用的是nil和CurrentThread,但我无法理解为什么.

delphi multithreading

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

Delphi在函数中分配通用值

由于Delphi(遗憾地)不支持可空类型,我想尝试自己实现它们.这是我到目前为止所写的:

unit Nullable;

interface

uses
 System.SysUtils, Generics.Collections;

type
 Nullable<T> = class
  private
   FValue: T;
   FHasValue: boolean;
   function getValue: T;
   procedure setValue(const val: T);
  public
   constructor Create(value: T);
   procedure setNull;
   property value: T read getValue write setValue;
   property hasValue: boolean read FHasValue;
 end;

implementation

{ Nullable<T> }

constructor Nullable<T>.Create(value: T);
begin
 Fvalue := value;
 FHasValue := true;
end;

procedure Nullable<T>.setNull;
begin
 FHasValue := false;
end;

procedure Nullable<T>.setValue(const val: T);
begin
 FHasValue := true;
 FValue := T; //COMPILER ERROR HERE …
Run Code Online (Sandbox Code Playgroud)

delphi generics

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

C++理解复制构造函数

有一些我无法理解的东西.看看这种主要:

class C {
 public:
  C() { cout << "C0 "; }
  C(const C&) { cout << "Cc"; }
};

class D {
 public:
  C c;
  D() { cout << "D0 "; }
  D(const D&) { cout << "Dd"; }
};

int main() {

  D x; cout << endl;
  D y(x); cout << endl;
  return 0;

}

//output is:
C0 D0
C0 Dd
Run Code Online (Sandbox Code Playgroud)

我同意这一事实D x给出C0 D0的输出,因为在d类存在于默认的构造函数的调用C,然后该对象D被创建.

D y(x)就像D y …

c++

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

C++标头和命名空间

在我的教授告诉我们在大学和我在Stroustrup的书中读到的内容之间,我心里有些困惑.

  • 我们都知道C++ header基本上是声明的集合(在file.h中定义),它们可以包含例如类的集合.它们非常有用,因为它们为我们提供了存储在单个空间中的许多功能

  • 命名空间是为了在不定义类型的情况下在程序的一部分中组织类,函数,类型(...)而发明的.

当我必须创建一个项目时,我无法看到具体的区别.


如果我(例如)制作一个解决不同程度方程的程序,我会把我需要的类放在一个文件中.例如,我将放置equations.h所有这些东西:class secondDeg,class thirdDeg,class fourthDeg等等.

那我为什么要使用命名空间呢?

答案(我猜)是:因为你可以给一个更好的组织命名(参见std :: cin).但在这种情况下我应该

  1. 创建equation.h(或其他)
  2. 创建一个名为命名空间eq,例如
  3. 将我的类放在命名空间中

这真的是必须的吗?我不能只使用头文件并将我的所有类放在里面吗?

c++ namespaces

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

Delphi泛型类和动态数组

我曾在多次读取的回答这个有关的问题TArray<T>array of T.根据我的理解,第一个的使用比后者更通用,因为对于动态数组我应该声明类似......

type
   TMyFlexibleArray = array of Integer;
Run Code Online (Sandbox Code Playgroud)

......这是必要的(在某些情况下)因为我无法返回array of Integer例如.相反,当然,我可以返回泛型类型.动态数组没有固定长度,并且使用SetLength过程重新分配它们的内存.TArray是一个静态方法的泛型类; 有关它的文档说明:

您不应该创建此类的实例,因为它的唯一目的是提供排序和搜索静态方法.


它们具有两种不同的性质/功能,但是它们具有相同的结果(例如,当作为参数传递时或者当我只需要一个灵活的容器时)?我看到TArray也有一些有用的方法.

如果我说这TArray<T>是一个用泛型构建的动态数组并且type K = array of T是一个自己的动态数组(自定义数组),那是正确的吗?在我的问题中,我假设它们在作为动态数组的功能上是等价的(我更喜欢通用的方式只是为了舒适).

arrays delphi

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

Delphi保护变量和构造函数

我写了这个简单的代码:

type
  TTestA = class
  strict protected
    a: integer;
  public
    f: integer;
    constructor Create(x: Integer);
  end;

type
  TTestB = class(TTestA)
  strict private
    c: integer;
  end;
Run Code Online (Sandbox Code Playgroud)

我使用,strict因为这些类与类在同一单元中TForm1.由于a受定义保护,它应该只能在子类中访问,但是为什么这段代码不起作用?

procedure TForm1.Button1Click(Sender: TObject);
var
  K: TTestB;
begin
  k := TTestB.Create(3);
  value = k.a; //I cannot access a
end;
Run Code Online (Sandbox Code Playgroud)

此外,受保护可用于创建抽象类.在C++中,如果我将构造函数声明为protected,我就无法创建对象的实例,只能创建子类.德尔福能做到这一点吗?

我对变量和构造函数有同样的问题.

delphi

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

C++ Qt无法正确解析JSON数组

我试图用Qt解析json,但我没有成功.这是我从服务器获得的输出:

[{"anni":2019},{"anni":2018},{"anni":2017}]
Run Code Online (Sandbox Code Playgroud)

从这个简单的PHP生成的地方:

header('Content-Type: application/json');
echo json_encode($data);
Run Code Online (Sandbox Code Playgroud)

$data是一个包含您在上面看到的值的数组.我在Qt 5.11.2中使用这段代码:

void MainWindow::showYears() {   

    //reply is a QNetworkReply* reply;
    if (reply->error() != QNetworkReply::NoError) {
        //some error managment
    } else {

        auto responsedata = reply->readAll();

        QJsonArray years = QJsonDocument::fromJson(responsedata).array();          
        qDebug() << QString{responsedata};

        for(const QJsonValue& y : years) {
            QJsonObject obj = y.toObject();

            //doing "qDebug() << r" shows that r is "" (empty!)
            auto r = obj["anni"].toString();

            ui->comboBoxP->addItem(r);
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

这有什么不对?


请注意qDebug() << QString{responsedata};打印"[{\"anni\":2019},{\"anni\":2018},{\"anni\":2017}]"

c++ qt json qt-creator

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

标签 统计

delphi ×7

c++ ×3

multithreading ×2

arrays ×1

generics ×1

indy ×1

json ×1

namespaces ×1

qt ×1

qt-creator ×1