小编Yur*_*riy的帖子

获取特定属性的属性值

我有一个发布道具的类,我将其序列化为XML.

MyAttr = class(TCustomAttribute)
private
  FName: string;
public
  constructor Create(const Name: string);
  property Name: string read FName write FName;
end;

MyClass = class(TPersistent)
private
  FClassCaption: string;
published
  [MyAttr('Class')]
  property ClassCaption: string read FClassCaption write FClassCaption;
end;
Run Code Online (Sandbox Code Playgroud)

由于XML大小至关重要,我使用属性为属性提供更短的名称(即我无法定义名为'Class'的属性).序列化通过以下方式实现:

lPropCount := GetPropList(PTypeInfo(Obj.ClassInfo), lPropList);
for i := 0 to lPropCount - 1 do begin
  lPropInfo := lPropList^[i];
  lPropName := string(lPropInfo^.Name);

  if IsPublishedProp(Obj, lPropName) then begin
    ItemNode := RootNode.AddChild(lPropName);
    ItemNode.NodeValue := VarToStr(GetPropValue(Obj, lPropName, False));
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我需要条件:如果属性标记为MyAttr,则获取"MyAttr.Name"而不是"lPropInfo ^ .Name".

delphi attributes rtti

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

实现线程安全日志记录

我的任务是创建一个类,它将围绕多个应用程序收集用户活动.

假设我有一个类TLogging和一个名为的全局对象Logging.

用户活动(屏幕打开等)应该在内存中收集(可能放入(字符串)列表中TLogging)并在一段时间间隔(每10分钟)或应用程序关闭后保存到日志文件中.

最重要的是日志记录必须处于"静默模式",它不得以任何方式影响用户工作流程:没有屏幕挂起,没有例外.

请给我这个任务的方向.

delphi queue logging multithreading

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

正确将字节从C++转换为delphi AnsiString

我有dll接受来自C++的字节数组的指针,并尝试通过以下方式将此数据移动到AnsiString中

procedure Convert(const PByteArr: Pointer; ArrSize: Cardinal); export; cdecl;
var
  Buf: AnsiString;
begin
  SetString(Buf, PAnsiChar(PByteArr^), ArrSize);
end;
Run Code Online (Sandbox Code Playgroud)

如果我从Delphi调用这个方法

procedure Try;
var
  M: TMemoryStream;
  Arr: TBytes;  
begin
  M := TMemoryStream.Create;
  try
    M.LoadFromFile('myfile.dat');
    SetLength(Arr, M.Size);
    M.Position := 0;
    M.Read(Arr[0], M.Size);
  finally
    M.Free;
  end;
  Convert(@Arr, Length(Arr));
end;
Run Code Online (Sandbox Code Playgroud)

它工作正常,但从c ++如果在SetString上提供AV.

请帮我解决一下这个.


来自RredCat:

让我为Yuriy的问题添加一些解释:首先是我们使用的语言.我们需要在C#项目中调用Delphi dll.为此,我创建了C++\CLI层(代理).现在关于头文件中的C++\CLI代码:

HINSTANCE hDelphiDLL;
typedef void (*pPBDFUNC)(byte* aBytes, int size);
pPBDFUNC Convert;
Run Code Online (Sandbox Code Playgroud)

在cpp中我在构造函数中设置Convert:

hDelphiDLL = LoadLibrary(<path to dll>);

if(NULL != hDelphiDLL ){
    pPBDFUNC clb= GetProcAddress(HMODULE(hDelphiDLL), "Convert");
        if(NULL != clb){
            Convert= pPBDFUNC (clb); …
Run Code Online (Sandbox Code Playgroud)

c# c++ delphi interop data-conversion

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

是否可能:记录中的数组

我有下一个数组

NAMES1: array[0..1] of string = ('NO1','NAME1');
NAMES2: array[0..1] of string = ('NO2','NAME2');
Run Code Online (Sandbox Code Playgroud)

和记录结构

TMyRec = record(
  Name: ????;
);
Run Code Online (Sandbox Code Playgroud)

结果我需要声明一个常量的记录数组,如下所示

const
  StringArraysList: array[0..1] of TMyRec = (
    (Name: NAMES1),
    (Name: NAMES2)
  );
Run Code Online (Sandbox Code Playgroud)

问题是我应该在TMyRec中为Name选择什么类型?

arrays delphi record

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