小编Ces*_*ero的帖子

如何用Delphi Win32编写SOAP 1.2客户端的最佳方法

到目前为止,没有Delphi版本支持SOAP 1.2客户端或服务器.

我已经尝试了几个星期才能使它工作,但每次出现新问题时,使用VS/C#我都可以这样做,并在3天内完成工作,但我需要使用Delphi 2009.

"我使用Rem Objects SDK编写了一个新版本",但结果并不比我使用Delphi SOAP库好.

但我想知道我还有什么选择,哪个库/组件完全支持SOAP 1.2?

我发现了一条来自Bruneau的消息,暗示Pocket SOAP http://www.pocketsoap.com/pocketsoap/ 我不知道它是如何工作的,我会调查并看看我能做些什么.

delphi soap components soap-client

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

如何知道var是什么类型的?

TypeInfo(Type)返回有关指定类型的信息,有没有办法知道var的typeinfo?

var
  S: string;
  Instance: IObjectType;
  Obj: TDBGrid;
  Info: PTypeInfo;
begin
  Info:= TypeInfo(S);
  Info:= TypeInfo(Instance);
  Info:= TypeInfo(Obj);
end
Run Code Online (Sandbox Code Playgroud)

此代码返回:

[DCC错误] Unit1.pas(354):E2133 TYPEINFO标准函数需要类型标识符

我知道非实例化的var只是一个指针地址.在编译时,编译器解析并执行类型安全检查.

在运行时,有没有办法知道更多关于var,只传递其地址?

delphi runtime typeinfo

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

如何在编译时告诉项目是程序还是库?

我正在尝试知道项目是否是一个库,在阅读帮助后我写了这段代码不起作用:

{$IF DEFINED(LIBPREFIX)}
    {$DEFINE PROJECT_IS_EXECUTABLE}
    {$UNDEF PROJECT_IS_LIBRARY}
{$ELSE}
    {$DEFINE PROJECT_IS_EXECUTABLE}
    {$UNDEF PROJECT_IS_LIBRARY}
{$IFEND}
Run Code Online (Sandbox Code Playgroud)

我试过DEFINED,DECLARED和

{$IF (LIBPREFIX = '')}
Run Code Online (Sandbox Code Playgroud)

每次尝试总是为DLL和程序返回相同的内容.如何仅使用内置编译器指令执行此操作?

编辑

我的目的是从"PE文件"中删除额外的信息.

我直接在.dpr项目文件中进行,所以不管其他单元是如何编译的,但我不能在DLL项目中做同样的事情.

因此我正在寻找一种方法来阻止它在DLL项目中.

这就是我解决这个问题的方法,我将这个指令添加到我的.dpr程序中:

  {$DEFINE STRIPE_PE_INFO}
  {$DEFINE STRIPE_RTTI}
  {$I DDC_STRIP.inc}
Run Code Online (Sandbox Code Playgroud)

并且DDC_STRIP.inc具有所有逻辑.

delphi compiler-directives

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

如何使用bit/bit-operator来控制对象状态?

我想创建轻型对象数据包以在客户端和服务器应用程序之间传递.

这是一个如此简单的任务,我只能控制1个字节,因此一个字节中的每个位都有不同的含义,

仅使用位

0 = False 
1 = True
Run Code Online (Sandbox Code Playgroud)

Itens我现在需要:

1 - Loaded from database 
2 - Persisted
3 - Changed
4 - Marked to Delete
5 -
6 - 
7 - Null Value 
8 - Read Only


1) How do I use bit operators in Delphi to check each bit value? 
2) How do I set the bit Values?
Run Code Online (Sandbox Code Playgroud)

在所有帮助之后,我会使用下一个Set

  TStateType = (
    stLoaded    = 0,   // loaded from persistance
    stNative    = 2,   // value loaded and converted …
Run Code Online (Sandbox Code Playgroud)

delphi bitwise-operators object-state

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

将AnsiString强制转换为PAnsiString会发生什么?

我有方法(Delphi 2009):

procedure TAnsiStringType.SetData(const Value: TBuffer; IsNull: boolean = False);
begin
  if not IsNull then
    FValue:= PAnsiString(Value)^;
  inherited;
end;
Run Code Online (Sandbox Code Playgroud)

这是基类上的抽象方法,其中"Value:Pointer"需要相应数据的指针,如下所示:

String = PString
AnsiString = PAnsiString
Integer = PInteger
Boolean = PBoolean
Run Code Online (Sandbox Code Playgroud)

所以我尝试传递这样的值:

var
  S: AnsiString;
begin
  S:= 'New AnsiString Buffer';
  SetBuffer(PAnsiString(S));
end;
Run Code Online (Sandbox Code Playgroud)

但是从AnsiString到PAnsiString的转换不起作用,我可以看出原因,但我想知道转换的结果是什么.所以我写了一个简单的测试:

var
  Buffer: AnsiString;
  P1: Pointer;
  P2: Pointer;
  P3: Pointer;
  P4: Pointer;
begin
  P1:= PAnsiString(Buffer);
  P2:= Addr(Buffer);
  P3:= @Buffer;
  P4:= Pointer(Buffer);
  P5:= PChar(Buffer[1]);

  WriteLn('P1: ' + IntToStr(Integer(P1)));
  WriteLn('P2: ' + IntToStr(Integer(P2)));
  WriteLn('P3: ' + IntToStr(Integer(P3)));
  WriteLn('P4: ' …
Run Code Online (Sandbox Code Playgroud)

delphi string casting

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

GetMem x ReallocMem

System.GetMem和System.ReallocMem有什么区别?

ReallocMem的Delphi 2009帮助,与GetMem的描述完全相同.System.FreeMem和System.Dispose如何

我应该对数组使用什么?

type
  PMemberDataList = ^TMemberDataList;
  TMemberDataList = array[0..MaxClassMembers -1] of PMemberData;

var
  FItems: PMemberDataList;

begin
  GetMem(FItems, Value * SizeOf(Pointer));
  FreeMem(FItems);
end;
Run Code Online (Sandbox Code Playgroud)

要么

begin
  ReallocMem(FItems, Value * SizeOf(Pointer));
  Dispose(FItems);
end;
Run Code Online (Sandbox Code Playgroud)

在人们建议之后,我将FItems声明为记录类型,而不是指向记录的指针,将TMemberDataList声明为动态数组,将SetLength声明为(de)alloc数组,将New/Dispose声明为数据

type
  PMemberDataList = ^TMemberDataList;
  TMemberDataList = array of PMemberData;
var
  Items: TMemberDataList;
  Item: PMemberData;

// Add
begin
  Setlength(Items, 1);
  New(Item);
  Items[0]:= Item
end;

// Remove
begin
  Dispose(Items[0]);
  Setlength(Items, 0);
end;
Run Code Online (Sandbox Code Playgroud)

arrays delphi memory-management

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

有没有办法知道在类助手中是否正在创建或销毁对象?

我有很少的类助手用于创建子组件,如弹出菜单,以便在运行时访问这些子组件,我创建了一个Singleton TDictionary.

我的问题是如何知道所有者组件被销毁以从TDictionary中删除子组件?

如果它是一个专门的组件,我将它添加到析构函数中,但我不能在类助手中添加构造函数和/或析构函数.

编辑 - 解决方案

我创建了一个接受TObject作为参数的基础对象,使用时,必须手动完成删除操作.

然后我从它继承了一个新类,重写方法只接受TComponent.这就是现在代码的相关部分:

type     
  TCustomLinkedComponents = class(TCustomLinkedObjects)
  strict private
    type
      TCollector = class(TComponent)
      protected
        procedure Notification(AComponent: TComponent; Operation: TOperation); override;
      end;
  strict private
    FCollector: TCollector;
[..]
  end;

procedure TCustomLinkedComponents.Add(Owner: TComponent; const LinkedName: string; LinkedComponent: TComponent);
begin
  inherited Add(Owner, LinkedName, LinkedComponent);
  FCollector.FreeNotification(LinkedComponent);
end;

procedure TCustomLinkedComponents.TCollector.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited;
  if Operation = opRemove then
    LinkedObjects.Remove(TObject(AComponent));
end;
Run Code Online (Sandbox Code Playgroud)

使用这种方法,我可以解决我的实际需要,并打开后可以轻松扩展.

delphi lifecycle class-helpers

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