标签: pascal

Lazarus - 为什么我不能将事件分配给运行时组件?

我有这个Lazarus计划:

unit Unit2; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ComCtrls;

type

  { TForm2 }

  TForm2 = class(TForm)
    procedure OnTlacitkoClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    tlac:TButton;
  private
    { private declarations }
  public
    { public declarations }
  end;



var
  Form2: TForm2;

implementation

{ TForm2 }

procedure TForm2.OnTlacitkoClick(Sender: TObject);
begin
  showmessage('helloworld');
end;

procedure TForm2.FormCreate(Sender: TObject);
var i,j:integer;
begin
  tlac:=TButton.Create(Form2);
  tlac.OnClick:=OnTlacitkoClick;
  tlac.Parent:=Form2;
  tlac.Left:=100;
  tlac.Top:=100;
end;

initialization
  {$I unit2.lrs}

end.
Run Code Online (Sandbox Code Playgroud)

但编译器说:unit2.pas(63,32)错误:在tlac.OnClick中调用"OnTlacitkoClick"时指定的参数数量错误:= OnTlacitkoClick; 表达.我搜索并认为这是德尔福的法律表达.我想简单地将OnTlacitkoClick注册为tlac.OnClick事件,而不是调用此过程.是否有一些错误的代码或我必须在Lazarus/Freepascal做不同的? …

events pascal freepascal onclick lazarus

0
推荐指数
1
解决办法
5088
查看次数

请解释这些Pascal代码..?

我想在pascal实验室考试之前了解这些代码,特别是PROCEDURE

PROGRAM vowels; 

USES crt; 

{Program that counts the number of vowels in a sentence} 

CONST space=' '; 
      maxchar=80; 

TYPE vowel=(a,e,i,o,u); 

VAR buffer:ARRAY[1..maxchar] of char; 
    vowelcount:ARRAY[vowel] of integer; 

PROCEDURE initialize; 

VAR ch:vowel; 

BEGIN 
     FOR ch:=a TO u DO 
     BEGIN 
          vowelcount[ch]:=0; 
     END; 
END; 

PROCEDURE textinput; 

VAR index:integer; 

BEGIN 
     writeln('Input a sentence'); 
     FOR index:=1 TO maxchar DO 
         IF eoln THEN buffer[index]:=space 
         ELSE read(buffer[index]); 
         readln; 
END; 

PROCEDURE analysis; 

VAR index:integer; 
    ch:vowel; 

BEGIN 
     index:=1; 
     WHILE index<>maxchar+1 DO 
     BEGIN 
          IF buffer[index] IN ['a','e','i','o','u'] THEN 
          BEGIN …
Run Code Online (Sandbox Code Playgroud)

pascal

0
推荐指数
1
解决办法
1193
查看次数

Pascal语法错误

我的程序中有以下功能:

function Getrand(rStart,rEnd:Integer): Integer;
var
diff: Integer;

begin
diff := rEnd - rStart;

Getrand := Random(diff) + rStart;
end;
Run Code Online (Sandbox Code Playgroud)

当我尝试编译程序时,我收到此错误:

Failed when compiling
Line 27: [Error] (27:9): Invalid number of parameters in script 
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

pascal

0
推荐指数
1
解决办法
1122
查看次数

Pascal WriteLn失败了

我正在Pascal的小型项目上学.我正在使用Lazaruz 1.0.2

写入文件时,我遇到了wirteLn函数的问题.一段时间后,它只是停止写入文件.

以此程序为例:

var oFile: Text;
  i: LongWord;
begin
  Assign(oFile, 'test.txt');
  ReWrite(oFile);
  for i:=1 to 4096 do
  WriteLn(oFile, 'ThisIsTest');
  CloseFile(oFile);//Added as suggested
end.
Run Code Online (Sandbox Code Playgroud)

这是输出:

...
4072 ThisIsTest
4073 ThisIsTest
4074 ThisIsTest
4075 ThisIsTe
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,它只是在句子的中间停止而且并不是全部写的.所有这些都取决于一个WriteLn insturction的持续时间和调用次数.

怎么解决?

我尝试使用名为WriteFile的"Windows"模块中的WinApi函数,但是我没能将最后3个参数传递给它.


大新闻

谢谢.这个例子中有效(关闭文件).但是我有一些更复杂的程序,我将打开的文件句柄传递给通过"var"写入它的函数.即使在关闭该文件后也没有做任何事情.它很奇怪.

pascal freepascal lazarus

0
推荐指数
1
解决办法
338
查看次数

将类定义为TObject或仅仅是一个类有什么区别?

这两种定义类的方法有什么区别?

TMyClass = class

end;

TMyObject = class(TObject)

end;
Run Code Online (Sandbox Code Playgroud)

显然,一个来自a TObject,另一个是它自己的一类.但是使用这两者之间的根本区别是什么?

delphi types pascal class object

0
推荐指数
1
解决办法
956
查看次数

子阵列的最大值

是否有任何函数从longint数组的子数组返回最大数字?

例如:

我有阵列:[2,3,6,2,9,4,2,4]

我想要数组的前5个元素[2,3,6,2,9]的最大值(9)

哪个是最好的解决方案?

arrays pascal freepascal max

0
推荐指数
1
解决办法
413
查看次数

使用动态数组的无效指针操作

Heloo guys ...一旦我尝试运行此代码,我就会遇到"无效指针操作"错误,问题是什么?它应该将该文本文件中的那些名称按字母顺序排序(学校项目).

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;
var
  names : TextFile;
  count : integer=0;
  array : array of string;
  i : integer;

Procedure Load;
 begin
  Reset(names);
  SetLength(array, count - 1);
  for i := 1 to count do ReadLn(names, array[i]);
 end;

begin
  AssignFile(names, 'names.txt');
  Reset(names);
    While not EoF(names) do
      begin
      ReadLn(names);
      Inc(count);
      end;
   Load;
   for i := 1 to count do WriteLn(array[i]);
   ReadLn;
   CloseFile(names);
   Erase(names);
end.
Run Code Online (Sandbox Code Playgroud)

arrays delphi sorting pascal dynamic

0
推荐指数
1
解决办法
698
查看次数

程序在读取程序后停止(delphi)

我的程序停止读取任何行,并在此过程之后结束程序,如"结束".之后(但不是):

  Procedure BubbleSort;
  var i, j : integer;
  begin
    for i := 0 to count - 1 do begin
      for j := count - 1 downto i do
        if (together[j] > together[j - 1]) then
          Swap(together[j - 1], together[j]);
    end;
  end;
Run Code Online (Sandbox Code Playgroud)

delphi pascal bubble-sort

0
推荐指数
1
解决办法
320
查看次数

使用RTTI分配属性,而不知道属性的类型

我有一些newObject具有未知属性的对象,我希望能够在不知道属性类型的情况下为其属性赋值.

到目前为止我能做的最好的是

vCtx := TRttiContext.Create;
vType := vCtx.GetType(newObject.ClassType);

for vProp in vType.GetProperties do
begin    
    vPropValue := 'Test Value';

    val := TValue.From<String>( vPropValue);

    vProp.SetValue( newObject , val );
end;
Run Code Online (Sandbox Code Playgroud)

当然,这假设属性是类型 string

我如何使这更一般?

delphi reflection pascal rtti

0
推荐指数
1
解决办法
168
查看次数

Delphi在日期时间范围之间生成随机日期时间值

我试图在delphi 5中生成给定范围内的随机Tdatetime值,假设我们有以下格式的两个日期

date1=01/01/2018 12:35:32 
date2=05/01/2018 21:35:32 
Run Code Online (Sandbox Code Playgroud)

我希望在此范围之间生成exaclty"x"日期.作为一个例子,我想从范围date1-> date2生成7个日期

randomdate[0]:=01/01/2018 12:35:32 
randomdate[1]:=01/01/2018 14:35:12 
randomdate[2]:=01/01/2018 16:42:22 
randomdate[3]:=02/01/2018 21:12:01
randomdate[4]:=03/01/2018 11:13:12
randomdate[5]:=04/01/2018 22:20:05
randomdate[6]:=05/01/2018 20:30:05
Run Code Online (Sandbox Code Playgroud)

问题是,如果第二个随机日期富含date2,则所有其他日期必须与date2相同,但如果时间到达23:59:59,则下一个日期将超出范围

像下面的那样

randomdate[0]:=01/01/2018 12:35:32 
randomdate[1]:=05/01/2018 23:59:59
.................................
Run Code Online (Sandbox Code Playgroud)

!从现在开始的所有日期都将是

06/01/2018 23:59:59

超出我的范围!!

任何帮助将是欣赏它

在Andreas Suggestion之后是最终代码,他在D5上工作,所以我想在所有其他版本的delphi上工作

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure …
Run Code Online (Sandbox Code Playgroud)

delphi pascal

0
推荐指数
1
解决办法
501
查看次数