阅读德尔福专家书,我发现了一些我无法理解的东西.作者使用以下代码创建了一个单元:
IToDoData = interface //CRUD
function ToDoCreate(aValue: TToDo): integer;
function ToDoRead(id: integer; out aValue: TToDo): boolean;
function ToDoUpdate(aValue: TToDo): boolean;
function ToDoDelete(id: integer): boolean;
procedure ToDoList(aList: TToDos);
end;
Run Code Online (Sandbox Code Playgroud)
然后他决定使用a DataModule并以这种方式实现上面的接口:
type
TDMToDo = class(TDataModule, IToDoData)
// ... other code ...
public
// IToDoData
function ToDoCreate(aValue: TToDo): integer;
function ToDoRead(id: integer; out aValue: TToDo): boolean;
function ToDoUpdate(aValue: TToDo): boolean;
function ToDoDelete(id: integer): boolean;
procedure ToDoList(aList: TToDos);
end;
Run Code Online (Sandbox Code Playgroud)
到目前为止这么好,但请注意,他没有这么说TInterfacedObject,我们没有AddRef之类的方法等等.我的猜测是上面的代码很好,但它必须包含在try ... finally块中.
在主窗体中(数据模块单元当然是uses子句),有一个这样的函数:
function TFormToDo.GetToDoData: IToDoData;
begin
if …Run Code Online (Sandbox Code Playgroud) TList<integer>我决定使用而不是使用geneirc
TSolutions = array of integer;
Run Code Online (Sandbox Code Playgroud)
然后:
function TEuclidMod.gcdExtended(p, q: integer): TSolutions;
var tmpArr: TSolutions;
begin
SetLength(tmpArr, 3);
if (q = 0) then
begin
tmpArr[0] := p;
tmpArr[1] := 1;
tmpArr[2] := 0;
end
else
begin
vals := gcdExtended(q, modulo(p,q));
tmpArr[0] := vals[0];
tmpArr[1] := vals[2];
tmpArr[2] := vals[1] - vals[2]*floor(p/q);
end;
Result := tmpArr;
end;
Run Code Online (Sandbox Code Playgroud)
该变量vals: TSolutions;在类中声明为private,在构造函数内部我设置了它的长度.
我在docwiki上看到动态数组被重新计算,所以我不必担心它们的生命周期.确定我写了:
constructor TEuclidMod.Create;
begin
SetLength(vals, 3);
end;
destructor TEuclidMod.Destroy;
begin
vals := nil;
inherited;
end;
Run Code Online (Sandbox Code Playgroud)
到目前为止,这应该没问题; vals属于班级,我在课堂的破坏中释放它.怎么样tmpArr …
这个问题非常基础,因为我处于一个非常基本的层面.我必须阅读带*.pam扩展名的文件的内容.它并不常见,它是由特定程序生成的文件,它具有固定大小的xx KB.里面有一些数字和值.
我需要阅读这个文件,所以我将使用TStreamReader.当然我需要知道文件的结构,但我不知道.顺便说一句,我上面的图片是一个有用信息的表格的一部分:
含义如下:打开文件后,转到特定地址并获取数据.例如,在0x30中,我可以找到有关"Move 1 Current PP"的数据.我的问题是:我如何跳转到给定的地址?
procedure TForm1.Button1Click(Sender: TObject);
var sw: TStreamReader;
begin
Memo1.Clear;
sw := TStreamReader.Create('C:\aaa\myfile.pam', TEncoding.UTF8);
try
sw.Position := 0;
finally
sw.Free;
end;
Run Code Online (Sandbox Code Playgroud)
我在文档中看到有类似的东西Seek,Position但似乎我不能使用它们.一般来说我会用
while not(sw.EndOfStream) do
begin
//read...
end;
Run Code Online (Sandbox Code Playgroud)
这从头开始,它以seqence读取数据.如何跳转到特定地址并阅读内容?我想我可以将十六进制地址传递给像Seek这样的函数,所以我可以去一个特定的点.然后我可以检索数据.
在这个问题中,您可以看到可以创建一个添加abstractkeywrod 的抽象类.我正在Delphi中翻译一个项目,但我发现它允许创建一个抽象类.这是代码:
type
TCableSPF = class abstract
//code
end;
Run Code Online (Sandbox Code Playgroud)
这是一个抽象类,当然我有很多实现它的子类.顺便说一句,我看到可以创建一个这样的实例;
a := TCableSPF.Create;
Run Code Online (Sandbox Code Playgroud)
当我尝试调用其虚拟和抽象的方法时,我得到了错误,这是可以的,但我可以阻止创建类吗?或者Delphi默认允许这个?谢谢您的帮助
这可能是显而易见的,但我认为这对我来说很难.鉴于这种:
void test(std::string&&) { }
std::string x{"test"};
test(std::move(x)); // ok
Run Code Online (Sandbox Code Playgroud)
此代码test() 使用rvalue引用作为参数调用,以便程序按照我的预期进行编译.
现在看看这个:
void other_test(const std::string&) { }
std::string x{"test"};
other_test(std::move(x)); // ok???
Run Code Online (Sandbox Code Playgroud)
在这里,我倾斜了.为什么这个版本会编译?所述std::move返回一个&&类型; 为什么我在第二种方法中没有出现错误const&?
我知道
int&& s = 5;
const int& s = 5;
Run Code Online (Sandbox Code Playgroud)
是有效的,因为在这两种情况下我提供的东西都没有左值,它没有地址.是&&与const&相同呢?如果不是,有区别吗?
我不是德尔福专家,我在网上阅读有关动态数组和静态数组的内容.在此文章中,我找到了一个叫章与代码段,下面笔者说:"动感V静态数组.":
[...]访问动态数组可能比静态数组更快!
我已经知道动态数组位于堆上(它们是用引用/指针实现的).
到目前为止,我知道动态数组的访问时间更长.但这与分配是一回事吗?就像我打电话SetLength(MyDynArray, 5)比创建一个慢MyArray = array[0..4] of XXX?
这是我目前使用的代码:
procedure TForm1.Button1Click(Sender: TObject);
var a:string;
i:smallint;
begin
a:=Edit1.text;
for i:= 1 downto length(Edit1.Text) do
begin
Edit2.Text:= {last letter};
end;
Run Code Online (Sandbox Code Playgroud)
我希望程序取出单词的最后一个字母Edit1.Text并将其打开Edit2.Text.我能做什么?如果您需要,可以看到该程序的图片:

我问过一些天前这个问题中,人们告诉我使用TFileStream.我正在阅读Głowacki的Expert Delphi,他使用的是TStreamReader/TStreamWriter.在评论中我读过这个:
TStreamReader是一个用于读取文本数据的辅助类.您的文件不是文本,而是二进制文件.直接使用TFileStream
我对此有点麻烦.我知道二进制文件不包含文本,TFileStream我可以阅读二进制文件(如文档所述).假设我想用来TStreamWriter在文件上输出一系列数字,然后读取该文件的内容.我可以用TFileStream做到吗?
我看到TStreamWriter TEncoding在构造函数中有,所以我需要指定utf-8或ansi.这会影响文件的结构吗?
我是新手,我不太了解我在网上发现的专家话题.据我所知,TFileStream用于二进制文件,而TStreamReader用于包含一些文本的文件
我怀疑我无法在线或在我的delphi书籍中解决.看这个.
情况1.
type
Test = class(TThread)
protected
procedure Execute; override;
public
constructor Create;
end;
constructor Test.Create;
begin
inherited Create(false);
FreeOnTerminate := true;
end;
procedure Test.Execute;
begin
inherited;
Sleep(5000);
TFile.WriteAllText('C:\Users\EmmaVMWare\Desktop\ts.txt', 'test2');
end;
Run Code Online (Sandbox Code Playgroud)
这是VCL的实现:
procedure TForm1.Button1Click(Sender: TObject);
var s: Test;
begin
s := Test.Create;
s := nil;
end;
Run Code Online (Sandbox Code Playgroud)
我打开程序,单击按钮,等待5秒钟,我在桌面上看到该文件.但是如果我打开程序,我点击按钮,2秒钟后我关闭程序,我再也看不到文件了(5秒后).
我在delphi中阅读了nick hodges的更多编码,他说这种线程是F&F("Fire and forget")因为一旦开始我们就放手了,它会自行清理.如果我在终止之前关闭程序,它会被正确杀死吗?
案例2. 出于好奇,我也编写了这段代码:
procedure TForm1.Button1Click(Sender: TObject);
var s: ITask;
begin
s := TTask.Run(procedure
begin
Sleep(5000);
TFile.WriteAllText('C:\Users\EmmaVMWare\Desktop\aa.txt', 'test');
end);
end;
Run Code Online (Sandbox Code Playgroud)
这是案例1中的代码,但由于我使用了一个任务,因此键入较少.在这种情况下,事情是不同的!
如果我运行程序,单击按钮并等待5秒我可以看到该文件.如果我运行程序,单击按钮然后我在2秒后关闭程序(或者在任何情况下,在5秒之前)我仍然看到文本文件!
这是我用于我的网站的代码.您可以看到HTML输入:
<form action="upload_request.php" method="post">
<input type="file" name="userfile" id="file"/>
<i>Only Excel files (*.xls || *.xlsx)</i>
</form>
Run Code Online (Sandbox Code Playgroud)
这里有PHP脚本:
<?php
$uploaddir = '/cdir/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "uploaded.\n";
} else {
echo "fail!!\n";
}
?>
Run Code Online (Sandbox Code Playgroud)
我必须在我的文件夹中上传一个excel文件,dir但是这个脚本没有这样做,他总是"失败!!".请问你能帮帮我吗?
我正在观看此视频,其中Marco正在讨论自动参考计数.我已经知道在Android和iOS(Firemonkey)下我的对象被重新计算,所以我不需要try finally块.
引用计数实现是否根据平台(VLC或FMX)或OS运行?
我的意思是:
var a: TObject;
begin
a := TObject.Create;
a.use1;
a.use2;
end;
Run Code Online (Sandbox Code Playgroud)
如果它在Android/iOS/Mac上运行,这在Firemonkey中很好,我没有内存泄漏.但是,如果我在Windows下运行它(并且我使用过Firemonkey),由于没有引用计数,我是否还有内存泄漏?
反正从视频我已经理解的是,try finally随着通话Free,即使在ARC,是不是不好的用法,但它只是无用的.
我已经构建了后端(使用WebBroker)并且它有一些API.所以在客户端我将使用REST组件来获取json并解析它.这是一个例子:
procedure TForm1.ButtonCreateClick(Sender: TObject);
begin
//rreqTodoCreate is a TRESTRequest component!
rreqTodoCreate.Params[0].Value := EditTitle.Text;
rreqTodoCreate.Params[1].Value := EditCategory.Text;
rreqTodoCreate.ExecuteAsync(procedure
begin
ResponseEdit.Text := rrespToDo.Content;
end);
end;
Run Code Online (Sandbox Code Playgroud)
我正在使用ExecuteAsyncdocwiki建议,因为我在移动设备上,我不希望UI冻结!我已经读过,它ExecuteAsync运行在一个单独的线程上,所以我有一个疑问.
我编写的代码是否是线程安全的?或换句话说:当我更新主窗体中组件的文本时,我应该使用队列还是同步?
我把这段代码写成了测试:
#include <iostream>
#include <thread>
#include <mutex>
int counter = 0;
auto inc(int a) {
for (int k = 0; k < a; ++k)
++counter;
}
int main() {
auto a = std::thread{ inc, 100000 };
auto b = std::thread{ inc, 100000 };
a.join();
b.join();
std::cout << counter;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该counter变量是全球性的,因此,创建2个线程a和b,我希望找到一个数据的比赛.输出为200000而不是随机数.为什么?
此代码是一个固定版本,它使用一个mutex全局变量只能访问一次(每次1个线程).结果仍然是200000.
std::mutex mutex;
auto inc(int a) {
mutex.lock();
for (int k = 0; k < a; ++k)
++counter;
mutex.unlock();
} …Run Code Online (Sandbox Code Playgroud)