我的服务器中有一个 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 秒,而且我正在捕获异常(仅用于调试目的)。我有两个主要问题:
这是我第一次使用 indy,据我所知,这是做我需要的好方法。我不确定我是否将 放在try-except正确的位置;是吗?
如果互联网连接很慢怎么办?我应该使用类似下面的代码吗?
代码
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) 我已经读过,接口对于解码代码是一件好事,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是类类型而不是接口类型,这是否会发生? …
今天我错过了一课,我发现了一段我无法理解的奇怪的代码.这是班级:
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) 我发布了一个让我对多线程感到困惑的问题,我没有在网上找到答案.让我们说我创造了类似的东西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()而被删除.
所以我真正的问题是:我如何确定何时通过nil或TThread.CurrentThread?
我已经明白,在TThread的派生类中,如上面的TTest,我可以用匿名方法调用Queue/Sync,因为Self它来拯救.
如果我必须在TTask.Run中调用队列或同步,我确定我必须使用nil参数吗?
我是这类新手,所以我发现这很难,我想理解这个概念,否则我会创建破碎的应用程序.我看到Nick Hodges在他的书中使用的是nil和CurrentThread,但我无法理解为什么.
由于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) 有一些我无法理解的东西.看看这种主要:
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 …
在我的教授告诉我们在大学和我在Stroustrup的书中读到的内容之间,我心里有些困惑.
我们都知道C++ header基本上是声明的集合(在file.h中定义),它们可以包含例如类的集合.它们非常有用,因为它们为我们提供了存储在单个空间中的许多功能
命名空间是为了在不定义类型的情况下在程序的一部分中组织类,函数,类型(...)而发明的.
当我必须创建一个项目时,我无法看到具体的区别.
如果我(例如)制作一个解决不同程度方程的程序,我会把我需要的类放在一个文件中.例如,我将放置equations.h所有这些东西:class secondDeg,class thirdDeg,class fourthDeg等等.
那我为什么要使用命名空间呢?
答案(我猜)是:因为你可以给一个更好的组织命名(参见std :: cin).但在这种情况下我应该
eq,例如这真的是必须的吗?我不能只使用头文件并将我的所有类放在里面吗?
我曾在多次读取的回答这个有关的问题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是一个自己的动态数组(自定义数组),那是正确的吗?在我的问题中,我假设它们在作为动态数组的功能上是等价的(我更喜欢通用的方式只是为了舒适).
我写了这个简单的代码:
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,我就无法创建对象的实例,只能创建子类.德尔福能做到这一点吗?
我对变量和构造函数有同样的问题.
我试图用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}]"