标签: pascal

如何在Delphi中使用Unit文件

我只是试图让单独的单元挂起来使我的代码更加封装.我正在尝试将我的方法的公共/私有声明整理出来,所以我可以从其他使用的单元中调用它们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)

delphi pascal private public delphi-units

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

如何在Inno Setup的InputDirPage中显示/使用用户选择的应用程序路径{app}?

我正在使用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)

installer pascal inno-setup

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

虽然它包含在catch语句中,但不会捕获异常

我有这个用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语句捕获?

c++ delphi pascal c++builder

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

Delphi 7:函数在dll中调用时崩溃,在exe中工作

我在网上找到了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)

delphi crash dll pascal function

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

迭代编辑框并将值与Delphi中的先前值进行比较

我正在做一个学校项目,我有10个文本框(5对).

这个想法是每对的总和最多可以是"3".所以

[1] [2]

[1] [0]

...

[2] [1]

我认为在"onChange"事件中检查这个太耗时了,所以我决定用一个检查所有这些的按钮.只要任何一对不满足要求,它就会抛出一个showmessage().

现在有办法检查每一对并检查它们的值是否小于或等于三并且不是负数?我知道我可以通过编写大量代码手动完成,但我希望尽可能保持干净.

谢谢!

delphi pascal editbox

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

如果我通过在pascal中为它分配一个非初始化数组来清除我的数组,那么会发生什么不好的事吗?

在pascal中,我敢于清理阵列的唯一方法就是简单地遍历它并清除它,但效率非常低.我不能简单地通过为它分配一个空数组来重新初始化它吗?

program arrays;
  var
    working, empty : array [1..10] of integer;
begin
  working[3] := 5;
  working:= empty;
end.
Run Code Online (Sandbox Code Playgroud)

可以这样做,这可能适得其反吗?

delphi pascal freepascal

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

如何在lazarus调试窗口中禁用AT&T /启用Intel语法?

默认情况下,Lazarus使用可怕的(可怕的)AT&T语法显示x86/x64程序集.

如何让它显示人们使用的英特尔语法?

在此输入图像描述

ide debugging assembly pascal lazarus

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

如何使用Delphi读取文本文件中的最后一行

我需要阅读一些非常大的文本文件中的最后一行(从数据中获取时间戳).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 ascii pascal delphi-xe2

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

Delphi(Pascal)检查是否分配了每个字段

我在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)

delphi dll pascal rtti

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

什么是Pascal中的我?

我不知道是什么^I,并^G帕斯卡尔程序.

这里:

const TAB = ^I;
Run Code Online (Sandbox Code Playgroud)

WriteLn(^G, ' Error : ' , s, ' . ' );
Run Code Online (Sandbox Code Playgroud)

pascal

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