小编Raf*_*ssi的帖子

Delphi构造函数和类构造函数

我怀疑我无法解决.我已经在embarcadero上阅读了类构造函数的文档,但我无法理解它的含义.换句话说,a constructor和a 之间的用法差异是class constructor什么?我这样做了:

type
 TGeneric<T> = class
  private
   FValue: T;
   aboutString: string;
   procedure setValue(const a: T);
  public
   property V: T read FValue write setValue;
   property about: string read aboutString;
   constructor Create;
   destructor Destroy; override;
 end;

implementation

{ TGeneric<T> }

constructor TGeneric<T>.Create;
begin
  inherited;
  aboutString := 'test';
end;
Run Code Online (Sandbox Code Playgroud)

相反,此代码无法正常工作:

type
 TGeneric<T> = class
  private
   FValue: T;
   aboutString: string;
   procedure setValue(const a: T);
  public
   property V: T read FValue write setValue;
   property about: string read aboutString; …
Run Code Online (Sandbox Code Playgroud)

delphi

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

Delphi队列和同步

我正在网上阅读Nick Hodges,我发现了Queue,但它并没有像我预期的那样表现,我无法理解他和文档所说的内容.看看这段代码:

 TThread.CreateAnonymousThread(
  procedure
   begin

     TThread.Queue(TThread.Current, procedure
                                          begin
                                           Memo1.Lines.Clear;
                                           Memo1.Lines.Add('start');
                                          end);

     Sleep(2000);

     TThread.Synchronize(TThread.Current, procedure
                                          begin
                                           Memo1.Lines.Add('end');
                                          end);

   end
 ).Start;
Run Code Online (Sandbox Code Playgroud)

我总是使用,Synchronize但这次我尝试过,Queue因为根据尼克,在多个请求的情况下更好,因为它们不会被"序列化"并逐个执行.上面的代码工作正常.为什么这不起作用呢?

 TThread.CreateAnonymousThread(
  procedure
   begin

     TThread.Queue(TThread.Current, procedure
                                          begin
                                           Memo1.Lines.Clear;
                                           Memo1.Lines.Add('start');
                                          end);

     Sleep(2000);

     TThread.Queue(TThread.Current, procedure
                                          begin
                                           Memo1.Lines.Add('end');
                                          end);

   end
 ).Start;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,备注输出start但不是结束.我打电话的时候:

  • 在第一个上同步,在第二个上同步它
  • 队列在第一个,同步在第二个它工作
  • 两次排队它都不起作用,因为我只看到start备忘录中的内容

delphi multithreading

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

Delphi通用嵌套类

我正在对C++和Delphi进行比较,我发现了一些棘手的东西.

这是非常简单的C++代码:

template<typename T>
class C {

 class D {
  T x;
 }

}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们认为类C是模板类(=泛型类),嵌套类D也是模板类.如果Tdouble,则x内部Ddouble.

我不能这样说:

template<typename T>
class C {

 template<typename T>
 class D {
  T x;
 }

}
Run Code Online (Sandbox Code Playgroud)

这是一个错误,因为我已经"内部" C而另一个T将是一个冲突.要修复错误,我应该使用不同的名称,例如U.

template<typename T>
class C {

 template<typename U>
 class D {
  T x;
 }

}
Run Code Online (Sandbox Code Playgroud)

在Delphi中,我可以这样写:

type
 TClassC<T> = class
  private

   type
    TClassD = class
     private 
      x: T;
    end;

 end; …
Run Code Online (Sandbox Code Playgroud)

delphi generics

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

为什么我能够从类外部访问私有类变量,我该如何防止它?

我正在使用此代码

type
 TSomeClass = class(TOBject)
 private
  class var InstanceCount : integer;
  class var TotalInstanceCount : integer;
 public
  class function instances: integer;
  class function totalInstances: integer;
  constructor Create;
  destructor Destroy;
end;

constructor TSomeClass.Create;
begin
 inherited Create;
 Inc(InstanceCount);
 Inc(TotalInstanceCount);
end;

destructor TSomeClass.Destroy;
begin
 Dec(InstanceCount);
 inherited;
end;

class function TSomeClass.instances;
begin
  Result := InstanceCount;
end;

class function TSomeClass.totalInstances;
begin
  Result := TotalInstanceCount;
end;
Run Code Online (Sandbox Code Playgroud)

我想创建一个实例计数器,并将一些类变量设置为私有.问题很简单,看看这张图:

在此输入图像描述

正如您在红色框中看到的那样,我声明为私有的类变量.我不希望它们出现.我只希望公共类函数能够显示计数器.我能做什么?

delphi access-modifiers

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

Delphi接口引用计数机制

事实上,网上有很多关于此的内容,但更多的是我读起来更加困惑.我写了一个叫做Combinatorics一些数学概率的组件.代码非常简短,因为我不希望它变得复杂.我在这里做一些预览:

//Combinatorio.pas
type
 ICombinatorio = interface
  function getSoluzioni(): integer; //soluzioni means "Solutions"
  function getFormula(): string;
 end;

//ImplCombinatorio.pas
type

 TCombinazioni = class(TInterfacedObject, ICombinatorio)
  private
   n, k: integer;
   ripetizione: boolean;
   function fattoriale(const x: integer): integer;
  public
   constructor Create(const n, k: integer; const ripetizione: boolean);
   function getSoluzioni(): integer;
   function getFormula(): string;
 end;

 TDisposizioni = class(TInterfacedObject, ICombinatorio)
  private
   n, k: integer;
   ripetizione: boolean;
   function fattoriale(const x: integer): integer;
  public
   constructor Create(const n, k: integer; const ripetizione: boolean);
   function getSoluzioni(): integer;
   function getFormula(): …
Run Code Online (Sandbox Code Playgroud)

delphi

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

打开数组参数,类和字符串是通过引用传递的吗?

我已经读过SO,开放数组参数会自动通过引用传递.类和字符串是一样的,还是我必须使用var?

我指的是我想通过引用传递给函数(或过程)一个参数.就像在C++中一样,我总是传递std :: string&,它是显式的,否则我传递一个副本

delphi

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

Delphi解析JSON数组或数组

这是我希望能够解析的示例 JSON:

[
  {
    "a":{
      "username":"aaa",
      "email":"aaa@gmail.com"
    }
  },
  {
    "b":{
      "username":"bbb",
      "email":"bbb@gmail.com"
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

我需要调用getData('b', 'email')must 输出bbb@gmail.com


我真的很难理解如何使用该System.JSON单元,但我无法得到解决方案!我希望能够编写一个从上述 JSON 结构中提取特定数据的函数。到目前为止,这是我的代码。在类构造函数中,我有:

var
  FIds: TJSONArray;
begin
  FIds := TJSONObject.ParseJSONValue({json string here}) as TJSONArray;
end;
Run Code Online (Sandbox Code Playgroud)

然后,在必须返回数据的函数中,我写了这个:

// 'name' can be 'a' or 'b'  | 'data' can be 'username' or 'email'
function TTest.getData(const name, data: string): string;
var
  FValue, FValueInner: TJSONValue;
begin
  for FValue in Fids do
  begin
    if (FValue is TJSONArray) then
    begin
      //Here I …
Run Code Online (Sandbox Code Playgroud)

delphi json

7
推荐指数
2
解决办法
2万
查看次数

Delphi连接到在线sql数据库

这个问题可能很容易,但我真的无法在网上找到真正的答案.我已经知道我可以使用FireDac连接到存储在我的计算机中的sqlite数据库,但现在我想继续使用在线sql服务器.

我拥有一个带有sql server的域名.

在此输入图像描述

这是我的配置,它告诉我Unknown configuration host.我需要在线连接到我的sql数据库.FireDAC是真正的解决方案吗?


我有这种连接字符串服务器端:

$pdo = new PDO('mysql:host=mysql.netsons.com;dbname=caorobwq_worldcup', 'username', 'password');
Run Code Online (Sandbox Code Playgroud)

mysql delphi firemonkey

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

C++可变参数模板总和

我试图理解名为"variadic"的C++ 11特性.看看这个简单的代码:

#include <iostream>

using namespace std;

template<typename T, typename... Args>
T adder(T first, Args... args) {
  return first + adder(args...);
}

int main() {

  int c = adder(1,8,4);
  cout << c << endl;

  cout << "Hello World!" << endl;
  return 0;

}
Run Code Online (Sandbox Code Playgroud)

阅读c ++入门书籍我已经理解它们以递归方式工作,我也看到在递归调用中,args...部分被传递.

我正在使用MinGW 5和QtCreator来测试它.看

在此输入图像描述

好的,要修复我可以调用的太少的参数,adder(first, args...)但现在递归不正确并且程序崩溃了.该怎么办?我无法理解如何做到这一点.


在线查看我发现了一个这样的例子

template <typename T, typename... Rest>
double sum(T t, Rest... rest) {
  return t + sum(rest...);
}
Run Code Online (Sandbox Code Playgroud)

它基本相同.我是否必须使用显式(非模板)返回类型?

c++ c++11

6
推荐指数
3
解决办法
2569
查看次数

StatefulWidget 和 StatelessWidget 的 Flutter 性能

当我必须创建在我的应用程序中多次使用的小部件的“模板”时,我使用了很多 StatelessWidgets,因为文档是这样说的:

当您描述的用户界面部分不依赖于对象本身中的配置信息和小部件在其中膨胀的 BuildContext 之外的任何其他内容时,无状态小部件很有用。

下面是一个例子:

class StepInputButton extends StatelessWidget {

  final int pos;
  final String value;

  const StepInputButton({
    this.pos,
    this.value
  });

  @override
  Widget build(BuildContext context) {
    return Row(
      // Text, Icon and a tiny button
    );
  }

}
Run Code Online (Sandbox Code Playgroud)

以上很好,因为我可以const StepInputButton(val, "val"),在代码中使用 CONST 来提高性能。


问题

我正在使用著名的Provider小部件来管理我的应用程序的状态和页面通常如下所示:

class SuccessPage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    var prov = Provider.of<Type>(context);    
    return Scaffold(...); 
  }

}
Run Code Online (Sandbox Code Playgroud)

这是我的带有 Scaffold 的应用程序页面,它有一个抽屉、一个浮动操作按钮和一个 appTitle。在这里,我使用 StatelessWidget,因为我不使用 setState(),因为 provider 为我完成了所有工作。但他们仍然在官方颤振文档中说:

对于可以动态更改的组合,例如由于具有内部时钟驱动状态或取决于某些系统状态,请考虑使用 StatefulWidget。

所以我不得不改变class …

stateful dart flutter

6
推荐指数
3
解决办法
2335
查看次数