小编Alb*_*ola的帖子

读写文本文件的最佳方式

我使用的是Lazarus IDE的最新版本,Memo1我的TForm1上有一个.我必须加载一个文本文件Memo1,然后编辑备忘录的每一行(我使用Memo1.Lines.Strings[i] := ...).最后,我必须将编辑的备忘录保存在特定路径中.

问题:我正在寻找更快的方式:

  1. 在备忘录中加载整个文本,编辑其内容并保存到新文件中(全部加载 - >全部编辑 - >全部写入)
  2. 做一个while循环(直到我的*.txt文件末尾)逐行读取文件,编辑内容并将其保存在新文件中.(加载行 - >编辑 - >写入|加载 - >编辑 - >写入|加载行 - >编辑 - >写入... ...)

我是Delphi开发的新手,我也读过一些关于TStringLists.我的文本文件将有很多行(它可能有5000多行),我不希望我的程序失去性能.

有什么建议吗?我应该使用TStringList我之前列出的两种方法之一吗?

delphi file-io text-files lazarus fpc

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

德尔福因子运算精度

情况

我需要为我的数学课程制作一个关于组合和排列的程序.如果你想计算它们,你必须处理阶乘,我写了这个典型的递归函数:

//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)

代码本身是正确的,如果nk(两个整数)都很小,函数返回所需的数字.输入大数字时会出现问题,因为因子很快就会增长.在这里你看到一个例子.

在此输入图像描述

在左侧,您可以看到输出11440是正确的,但在右侧,它是不正确的.我知道这种计算是"危险的",因为我正在处理大整数,即使它们被声明为Int64.

Int64据我所知,类型是最大的整数类型,但如果我尝试用大整数进行计算,还有其他可能性吗?

可能的解决方案

  1. 很简单,我可以设置n和k不能大于10(例如我不喜欢)

  2. 使用浮点运算.我在想我可以使用getSoluzioniExtended返回值的函数(而不是Int64).由于这些操作的结果必须是整数,我可以检查double的小数部分是否等于零.如果没有,我不会接受结果.

我正在考虑第2点,因为Extended比Int64具有更广泛的值.Delphi中的扩展部门比Int64部门更精确吗?

我希望能够得到一个不错的结果,例如至少n = 14和k = 8.

delphi algorithm

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

Vert.x将http重定向到https

我们用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)

java vert.x java-11 vertx4

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

Indy FTP无法正确加载进度条

我的一个朋友向我求助,因为他想要一个表示上传/下载某些文本文件的进度条.在这里你可以看到我使用的代码:

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
推荐指数
1
解决办法
4695
查看次数

使用ComboBox在TImage中加载ImageList图片

在我的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类型.我能做什么?

delphi

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

Delphi记录助手为double

情况

我写了一个类似于二级方程的类.你可以在这里找到该课程的完整代码,但它与问题无关.

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)

delphi

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

在JPanel中创建JTable并添加行

在我的程序中,我用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,但表格没有(图片).我能做什么?

java swing jtable

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

FindComponent在程序中不起作用

我正在开发一个程序来计算不同数据的平均值,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,我怎么能这样做?

delphi lazarus

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

Delphi通过引用返回值

在C++中,我可以编写一个这样的函数:

int test(params) { }

返回的值只是一个数字(r值).但它也可能这样做:

int& test(params) { }

在这种情况下,该函数返回"完整变量".这意味着返回的值不仅仅是之前的值,而是具有r值和l值的完全变量.

这可能在Delphi中吗?第一个功能是,function test(params):integer;但第二个呢?

当我尝试实现并行for循环时,我已经看到了类似的东西.看这里有一个&.它有参考意义吗?我自己找不到一个好的答案.

delphi

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

获取n个数字的gcd

这似乎是一个简单的问题,但我找不到解决方案.我必须找到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)

有一个整数数组作为参数,但我不知道代码.你有什么建议吗?

java math greatest-common-divisor

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