我有这个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做不同的? …
我想在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) 我的程序中有以下功能:
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的小型项目上学.我正在使用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"写入它的函数.即使在关闭该文件后也没有做任何事情.它很奇怪.
这两种定义类的方法有什么区别?
TMyClass = class
end;
TMyObject = class(TObject)
end;
Run Code Online (Sandbox Code Playgroud)
显然,一个来自a TObject,另一个是它自己的一类.但是使用这两者之间的根本区别是什么?
是否有任何函数从longint数组的子数组返回最大数字?
例如:
我有阵列:[2,3,6,2,9,4,2,4]
我想要数组的前5个元素[2,3,6,2,9]的最大值(9)
哪个是最好的解决方案?
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) 我的程序停止读取任何行,并在此过程之后结束程序,如"结束".之后(但不是):
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) 我有一些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 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)