我使用的是Lazarus IDE的最新版本,Memo1我的TForm1上有一个.我必须加载一个文本文件Memo1,然后编辑备忘录的每一行(我使用Memo1.Lines.Strings[i] := ...).最后,我必须将编辑的备忘录保存在特定路径中.
问题:我正在寻找更快的方式:
while循环(直到我的*.txt文件末尾)逐行读取文件,编辑内容并将其保存在新文件中.(加载行 - >编辑 - >写入|加载 - >编辑 - >写入|加载行 - >编辑 - >写入... ...)我是Delphi开发的新手,我也读过一些关于TStringLists.我的文本文件将有很多行(它可能有5000多行),我不希望我的程序失去性能.
有什么建议吗?我应该使用TStringList我之前列出的两种方法之一吗?
情况
我需要为我的数学课程制作一个关于组合和排列的程序.如果你想计算它们,你必须处理阶乘,我写了这个典型的递归函数:
//TCombinazioni is a class that I have created to solve Combinations
function TCombinazioni.fattoriale(const x: integer): Int64;
begin
Result:= 1;
if x > 0 then
begin
Result:= fattoriale(x-1)*x;
end;
end;
Run Code Online (Sandbox Code Playgroud)
问题
我在课堂上写了这段代码TCombinazioni:
function TCombinazioni.getSoluzioni: Int64;
begin
//C(n,k) = (n+k-1)! / (k! * (n-1)!)
Result := fattoriale(n+k-1) div (fattoriale(k) * fattoriale(n-1));
end;
Run Code Online (Sandbox Code Playgroud)
代码本身是正确的,如果n和k(两个整数)都很小,函数返回所需的数字.输入大数字时会出现问题,因为因子很快就会增长.在这里你看到一个例子.
在左侧,您可以看到输出11440是正确的,但在右侧,它是不正确的.我知道这种计算是"危险的",因为我正在处理大整数,即使它们被声明为Int64.
Int64据我所知,类型是最大的整数类型,但如果我尝试用大整数进行计算,还有其他可能性吗?
可能的解决方案
很简单,我可以设置n和k不能大于10(例如我不喜欢)
使用浮点运算.我在想我可以使用getSoluzioni带Extended返回值的函数(而不是Int64).由于这些操作的结果必须是整数,我可以检查double的小数部分是否等于零.如果没有,我不会接受结果.
我正在考虑第2点,因为Extended比Int64具有更广泛的值.Delphi中的扩展部门比Int64部门更精确吗?
我希望能够得到一个不错的结果,例如至少n = 14和k = 8.
我们用Vert.x 4重新编写了我们的Web服务,我们感到非常满意。在将它们投入生产之前,我们要保护它们安全,并尝试启用https。这是主要版本:
public class MainVerticle extends AbstractVerticle {
@Override
public void start() throws Exception {
//Deploy the HTTP server
vertx.deployVerticle(
"com.albertomiola.equations.http.HttpServerVerticle",
new DeploymentOptions().setInstances(3)
);
}
// I use this only in IntelliJ Idea because when I hit "Run" the build starts
public static void main(String[] args) {
Launcher.executeCommand("run", MainVerticle.class.getName());
}
}
Run Code Online (Sandbox Code Playgroud)
这是HTTP服务器Verticle代码中最相关的部分:
public class HttpServerVerticle extends AbstractVerticle {
@Override
public void start(Promise<Void> startPromise) throws Exception {
var options = new HttpServerOptions();
options.setPort(443)
.setSSl(true)
.setPemTrustOptions(...)
.setPemKeyCertOptions(...);
var server = vertx.createHttpServer(options);
var …Run Code Online (Sandbox Code Playgroud) 我的一个朋友向我求助,因为他想要一个表示上传/下载某些文本文件的进度条.在这里你可以看到我使用的代码:
procedure TForm1.IdFTP1Work(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Int64);
begin
Application.ProcessMessages;
ProgressBar1.Position:= AWorkCount;
Label6.Caption:=IntToStr(ProgressBar1.Position);
end;
procedure TForm1.IdFTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Int64);
begin
if(AWorkCountMax>0) then
begin
ProgressBar1.Max:=AWorkCountMax;
end;
ProgressBar1.Position:=0;
end;
procedure TForm1.IdFTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
ProgressBar1.Position:=0;
end;
Run Code Online (Sandbox Code Playgroud)
在我的表格上我也有2个标签:第一个表示进展并被调用Label6,另一个只有一个像"%"的标题,如下所示.Label 6的值应为0到100.

他发送的文本文件现在很小,但它们会更大.我的问题是,我没有看到程序中的条形进展(绿色矩形),而且标签6上的值超过100并且到达700.我该怎么办?
在我的Delphi表单中,我有一个包含4张图片的ImageList.还有一个被调用的ComboBox ComboBox1和一个被调用的TImage组件Image9.
我onChange为我的ComboBox 创建了一个,因为我想做这样的事情:如果选择了ComboBox项目1,则在我的ImageList中加载图像1.如果选择了ComboBox项目3(例如),则加载ImageList的图像3.
我写的代码是这样的:
case ComboBox1.Items[ComboBox1.ItemIndex] of
0:
begin
ImageList1.GetBitmap(0,Image9.Picture);
end;
1:
begin
ImageList1.GetBitmap(1,Image9.Picture);
end;
2:
begin
ImageList1.GetBitmap(2,Image9.Picture);
end;
3:
begin
ImageList1.GetBitmap(3,Image9.Picture);
end;
end;
Run Code Online (Sandbox Code Playgroud)
使用此代码,IDE(我正在使用Delphi XE4)给我一个错误,case ComboBox1.Items[ComboBox1.ItemIndex] of因为它表示需要Ordinal类型.我能做什么?
情况
我写了一个类似于二级方程的类.你可以在这里找到该课程的完整代码,但它与问题无关.
type
TArrayOfDouble = array of array of double;
type
TEqSecGrado = class
private
//variables
a, b, c: double;
delta: double;
solutions: TArrayOfDouble;
solRealCount: integer;
solImaginaryCount: integer;
class var currentIstances: integer;
class var totalIstances: integer;
//methods
function getDelta(const vala, valb, valc: double): double; overload;
public
constructor Create(const a, b, c: double);
destructor Destroy; override;
//methods
function getDelta: double; overload;
function getSolutions: TArrayOfDouble; virtual;
//properties
property valueOfA: double read a;
property valueOfB: double read b;
property valueOfC: double …Run Code Online (Sandbox Code Playgroud) 在我的程序中,我用dinamically创建了一个包含JPanel的JFrame jp.jp还包含一个JTable,我想填充一些行.
case KeyEvent.VK_R:
JFrame frame = new JFrame("Snake v2.0 - Rankings");
JPanel jp = new JPanel();
jp.setPreferredSize(new Dimension(300,300));
JTable table = new JTable();
JScrollPane tableContainer = new JScrollPane(table);
jp.add(tableContainer, BorderLayout.CENTER);
DefaultTableModel tm = (DefaultTableModel) table.getModel();
tm.addRow(new Object[] {"#","Player","Score","Date"});
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.getContentPane().add(jp);
frame.pack();
frame.setVisible(true);
break;
Run Code Online (Sandbox Code Playgroud)
这是我的代码.当我按下R键盘时,会出现带有JPanel的JFrame,但表格没有(图片).我能做什么?
我正在开发一个程序来计算不同数据的平均值,TStringGrid我想用一个程序.它被称为calcola.
procedure calcola(numero:ShortInt; StringGrid:TStringGrid; pbarprog:ShortInt);
var i,j,cont,num:shortint;
avg,temp,numfl:double;
a:string;
Edit1:TEdit;
begin
if StringGrid.Colcount>1 then
//other code
avg:=temp/cont;
TLabel(FindComponent('Label'+IntToStr(num))).Caption:=FloatToStrF(avg, ffGeneral, 1, 1);
Edit1.Text:=FloatToStr(StrToFloat(TLabel(FindComponent('Label'+IntToStr(num))).Caption)*10);
TProgressBar(FindComponent('ProgressBar'+IntToStr(i+pbarprog))).Position:=StrToInt(Edit1.Text);
//other code
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
在这个过程中,Lazarus告诉我" Identifier not found FindComponent ".然后我剪切/粘贴相同的代码procedure TForm1.Button1Click(Sender: TObject);,我没有错误.
我需要在FindComponent()里面使用calcola,我怎么能这样做?
在C++中,我可以编写一个这样的函数:
int test(params) {
}
返回的值只是一个数字(r值).但它也可能这样做:
int& test(params) {
}
在这种情况下,该函数返回"完整变量".这意味着返回的值不仅仅是之前的值,而是具有r值和l值的完全变量.
这可能在Delphi中吗?第一个功能是,function test(params):integer;但第二个呢?
当我尝试实现并行for循环时,我已经看到了类似的东西.看这里有一个&.它有参考意义吗?我自己找不到一个好的答案.
这似乎是一个简单的问题,但我找不到解决方案.我必须找到n个数字的gcd.
public int getGCD(int a, int b) {
if (b == 0) { return a; }
else { return getGCD(b, a%b); }
}
Run Code Online (Sandbox Code Playgroud)
这是计算两个数字的gcd的流行递归方式.但是,如果我需要获得3,4,5 ...... n个数字的gcd?我当时想做这样的事情:
public int getGCD(int[] a) {
//the code
}
Run Code Online (Sandbox Code Playgroud)
有一个整数数组作为参数,但我不知道代码.你有什么建议吗?