小编fru*_*ugi的帖子

如何在类型A中定义类型B中的类型A和类型B中的类型B?

我有两种类型.一个类型A和一个类型B.问题类型A包含类型B,类型B包含类型A.这样的事情将不起作用:

  type
    typeA = record
       test1 : typeB;
    end;
  type
    typeB = record
       test2 : typeA;
    end;
Run Code Online (Sandbox Code Playgroud)

编辑: 那不是我的设计.我将包含此类构造的C头文件(访问DLL)转换为delphi.

Edit2: "C++结构是AFAIR类的另一个名称.并且必须有指针,而不是值本身. - Arioch'1分钟之前"是的你是对的,它是一个类型的指针:

我在那里定义:

test1 : ^typeB;
Run Code Online (Sandbox Code Playgroud)

这会改变吗?

test1 : Pointer;
Run Code Online (Sandbox Code Playgroud)

Edit3: C结构:

/* DLPDFPAGE */
typedef struct dlpdfpage
{
    CosObj              Page;
    CosObj      PrintSelect;
    ASFixedRect         PageBBox;
    ASFixedRect         ContentBBox;
    struct dlpdfpage    *Next;
    PDRotate            Angle;
    struct dlpdfdoc     *Doc;
    DLPDFSTREAM         *Content;
    long                PageNumber;
    char                Complete;
    char                FontSubstituted;
    char                FontMM;
    char                FontBad;
} DLPDFPAGE;


/* DLPDFDOC */
typedef struct dlpdfdoc
{
    DLPDFINSTANCE       *dliInstance;
    PDDoc …
Run Code Online (Sandbox Code Playgroud)

c delphi types pointers record

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

将复杂的C Typedef语句转换为Delphi记录

对于DLL的使用,我只有C头文件可用.现在我将这些头文件转换为Delphi接口文件.这很有效,直到出现像这样的复杂C Typedef:

  typedef struct _IFSDK_PAUSE
  {
    int version;
    FPDF_BOOL (*NeedToPauseNow) (struct _IFSDK_PAUSE* pThis);
    void*       user;
  } IFSDK_PAUSE;
Run Code Online (Sandbox Code Playgroud)

转换为:

type
  IFSDK_PAUSE = record

    version: Integer;

    pThis: <----- Problem!!!

    user: Pointer;
  end
Run Code Online (Sandbox Code Playgroud)

如何正确转换这些复杂的Typedef?

c delphi

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

如何按多个字段对记录列表进行排序?

我想首先按x坐标排序坐标列表,然后按y坐标排序:

Orginal: (7,8)(10,22)(7,3)(5,10)(20,14)(7,10)(7,3)

First Step by x: (5,10)(7,8)(7,3)(7,10)(7,3)(10,22)(20,14)

Second Step by y: (5,10)(7,3)(7,3)(7,8)(7,10)(10,22)(20,14)
Run Code Online (Sandbox Code Playgroud)

我已经有一个适用于第一步的功能:

function SortCoords(Item1: Pointer; Item2: Pointer): Integer;
var
line1 : Coords;
line2 : Coords;
begin
  line1 :=  Coords;(Item1);
  line2 :=  Coords;(Item2);

  if (line1.X < line2.X) then 
    result := -1
  else if (line1.X > line2.X) then 
     result := 1
  else
     result := 0;

end; 
Run Code Online (Sandbox Code Playgroud)

但我没有第二步.

delphi sorting

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

在 Delphi 中使用 C# DLL 仅使用第一个函数参数

我使用 C# DLL 导出(UnmanagedExports - https://www.nuget.org/packages/UnmanagementExports)使我的托管 C# DLL 可被非托管代码(如 Delphi)访问。我的问题是只有第一个函数参数从 delphi 传输到 C# dll:

C# DLL 部分

   [DllExport("SomeCall", CallingConvention.StdCall)]
   public static String SomeCall([MarshalAs(UnmanagedType.LPWStr)] String data1, [MarshalAs(UnmanagedType.LPWStr)] String data2)
    { 
             //Data1 is never filled with some string data. 
             String result = WorkWithData(data1);                   
             //Data2 is filled with some string data.
             result += WorkWithData(data2) 
             return result;
    }
Run Code Online (Sandbox Code Playgroud)

Delphi部分(调用部分):

SomeCall: function(data1: PWideChar; data2: PWideChar;): String StdCall;

procedure DoSomeDLLWork(data1: PWideChar; data2: PWideChar);
var 
 dllCallResult: String;
begin
  dllCallResult := SomeCall(data1,data2);
end
Run Code Online (Sandbox Code Playgroud)

本例的问题是只填充了data2。data1 永远不会被填充。我已经尝试过 StdCall 和 …

c# delphi dll dllexport delphi-xe2

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

标签 统计

delphi ×4

c ×2

c# ×1

delphi-xe2 ×1

dll ×1

dllexport ×1

pointers ×1

record ×1

sorting ×1

types ×1