我只是试图让单独的单元挂起来使我的代码更加封装.我正在尝试将我的方法的公共/私有声明整理出来,所以我可以从其他使用的单元中调用它们testunit.在这个例子中,我想hellofromotherunit公开,但stickletters私人.
unit testunit;
interface
uses
Windows, Messages, Dialogs;
implementation
function stickletters(a,b:string):string;
begin
result:=a+b;
end;
procedure hellofromotherunit();
begin
showmessage(stickletters('h','i'));
end;
end.
Run Code Online (Sandbox Code Playgroud)
我似乎无法从其他单位复制私人/公共结构,如:
Type
private
function stickletters(a,b:inter):integer;
public
procedure hellofromotherunit();
end
Run Code Online (Sandbox Code Playgroud) 我正在使用Inno Setup创建一个安装程序.我必须从用户那里采取两条路径.一个用于程序可执行文件,另一个用于库.默认的app文件夹是{pf}/companyname/applicationname
在InitializeWizard我创建了第二页,它从用户获取lib文件夹.
有没有办法将默认的lib文件夹更改为用户选择的文件夹{app}?
我试过了WizardDirValue.它只提供默认{app}值,而不是用户在第一页中选择的路径.
[code]
procedure InitializeWizard();
begin
page2:= CreateInputDirPage(wpProgress,
'Select Library Location', 'Where Library files should be stored?',
'To continue, click Next. If you would like to select a different folder, click Browse.',
False, 'Libs');
page2.Add('');
page2.Values[0] := WizardDirValue+'\libs';
LibDir := page2.Values[0];
end
Run Code Online (Sandbox Code Playgroud) 我有这个用C++ Builder 6编写的程序.我没有编写所有代码,只是编写了一些代码.然而,语言不是C++(据我所知) - 它看起来更像是Delphi或Pascal.这就是我将它们全部包含在标签中的原因.
我有一个叫做的int Oversteering.
try
{
Oversteering=HoursCounter.ToInt();
}
catch(EConvertError &convertError)
{
Oversteering=0;
}
Run Code Online (Sandbox Code Playgroud)
HoursCounter 是一个AnsiString,它是一个int的形式.
因为这是整个代码中唯一的try/catch语句(这不太好,我知道),我在Delphi/Pascal/???中找不到任何好的例子,我不知道是不是写得不错.
好吧,我尝试将字符串转换为int.有时我会收到此错误:

也就是说,发生了一个名为EConvertError的异常.
所以我的问题是:为什么这个异常没有被catch语句捕获?
我在网上找到了Delphi 7字符串解码器功能("Decrypt")的问题.它需要一个字符串和1到120之间的四个数值来解码它.将该函数放在可执行文件中并运行它可以很好地工作.但是,我想在DLL中运行它.我正在使用额外的函数从调用任务接收必要的值,并从那里调用解密函数.出于某种原因,我无法将手指放在上面,每次dll调用解密函数时,主机应用程序都会崩溃.在过去的几个小时里,我一直在尝试一切可以让它发挥作用,但没有成功.我是Delphi和Pascal的新手,所以我可能只是忽略了一些明显的东西.无论哪种方式,我都输了.任何帮助将不胜感激.
编辑:这是崩溃时弹出的Windows错误:
Fault Module Name: StackHash_0a9e
Fault Module Version: 0.0.0.0
Fault Module Timestamp: 00000000
Exception Code: c0000005
Exception Offset: 00000000
OS Version: 6.1.7600.2.0.0.256.1
Locale ID: 1031
Additional Information 1: 0a9e
Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
Additional Information 3: 0a9e
Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
Run Code Online (Sandbox Code Playgroud)
这是我使用的代码:
library decrypt_test_dll;
uses
SysUtils,
Classes,
Dialogs;
{$R *.res}
function callfunction(externalstring, value1, value2, value3, value4: PAnsiChar):integer; cdecl;
var
convkey1, convkey2, convkey3, convkey4 : string;
convstring, decodedstring : string;
Decrypt : function(Text : string; Key1, Key2, Key3, Key4 …Run Code Online (Sandbox Code Playgroud) 我正在做一个学校项目,我有10个文本框(5对).
这个想法是每对的总和最多可以是"3".所以
[1] [2]
[1] [0]
...
[2] [1]
我认为在"onChange"事件中检查这个太耗时了,所以我决定用一个检查所有这些的按钮.只要任何一对不满足要求,它就会抛出一个showmessage().
现在有办法检查每一对并检查它们的值是否小于或等于三并且不是负数?我知道我可以通过编写大量代码手动完成,但我希望尽可能保持干净.
谢谢!
在pascal中,我敢于清理阵列的唯一方法就是简单地遍历它并清除它,但效率非常低.我不能简单地通过为它分配一个空数组来重新初始化它吗?
program arrays;
var
working, empty : array [1..10] of integer;
begin
working[3] := 5;
working:= empty;
end.
Run Code Online (Sandbox Code Playgroud)
可以这样做,这可能适得其反吗?
默认情况下,Lazarus使用可怕的(可怕的)AT&T语法显示x86/x64程序集.
如何让它显示人们使用的英特尔语法?

我需要阅读一些非常大的文本文件中的最后一行(从数据中获取时间戳).TStringlist是一个简单的方法,但它返回一个内存不足的错误.我正在尝试使用seek和blockread,但缓冲区中的字符都是无意义的.这与unicode有关吗?
Function TForm1.ReadLastLine2(FileName: String): String;
var
FileHandle: File;
s,line: string;
ok: 0..1;
Buf: array[1..8] of Char;
k: longword;
i,ReadCount: integer;
begin
AssignFile (FileHandle,FileName);
Reset (FileHandle); // or for binary files: Reset (FileHandle,1);
ok := 0;
k := FileSize (FileHandle);
Seek (FileHandle, k-1);
s := '';
while ok<>1 do begin
BlockRead (FileHandle, buf, SizeOf(Buf)-1, ReadCount); //BlockRead ( var FileHandle : File; var Buffer; RecordCount : Integer {; var RecordsRead : Integer} ) ;
if ord (buf[1]) <>13 then //Arg to integer …Run Code Online (Sandbox Code Playgroud) 我在Delphi中使用windows dll,我必须检查我的功能是否分配得很好.
我声明了函数类型,以便将我的dll函数放在类属性中,如下所示:
type
MPOS_OpenResource = function (ResID: DWORD; CplNum:BYTE; BlockingMode: DWORD):WORD;stdcall;
MPOS_CloseResource = function (ResID: DWORD; CplNum:BYTE):WORD;stdcall;
MPOS_GetResourceID = function (CplNum : Byte; ResID : PDWord) : word;stdcall;
...
Run Code Online (Sandbox Code Playgroud)
然后,我为我的dll类中的每个相应字段分配一个方法,如下所示:
@Self.m_MPOS_OpenResource := GetProcAddress( libHandler, '_MPOS_OpenResource@12' );
@Self.m_MPOS_CloseResource := GetProcAddress( libHandler, '_MPOS_CloseResource@8' );
@Self.m_MPOS_GetResourceID := GetProcAddress( libHandler, '_MPOS_GetResourceID@8');
...
Run Code Online (Sandbox Code Playgroud)
我最后检查每个分配是否使用了一个巨大的if条款:
If(not Assigned(@m_MPOS_OpenResource) OR
not Assigned(@m_MPOS_CloseResource) OR
not Assigned(@m_MPOS_GetResourceID) OR
...) then { Some code for exception}
Run Code Online (Sandbox Code Playgroud)
我想避免if使用反射的giantic 子句,但我找不到有用的东西.我尝试了很多东西,最后一个开始:
for f in rttiType.GetFields() do
if(not Assigned(rttiType.GetField(f.Name).GetValue(Self))
OR …Run Code Online (Sandbox Code Playgroud) 我不知道是什么^I,并^G在帕斯卡尔程序.
这里:
const TAB = ^I;
Run Code Online (Sandbox Code Playgroud)
和
WriteLn(^G, ' Error : ' , s, ' . ' );
Run Code Online (Sandbox Code Playgroud) pascal ×10
delphi ×7
dll ×2
ascii ×1
assembly ×1
c++ ×1
c++builder ×1
crash ×1
debugging ×1
delphi-units ×1
delphi-xe2 ×1
editbox ×1
freepascal ×1
function ×1
ide ×1
inno-setup ×1
installer ×1
lazarus ×1
private ×1
public ×1
rtti ×1