有人能帮我把这个结构翻译成delphi记录吗

Can anyone help me with translation of this struct to delphi record?

本文关键字:翻译 结构 delphi 记录      更新时间:2023-10-16

我需要帮助将具有另一个嵌套结构的结构转录到Delphi。下面是一个结构:

#define CHANNEL_TAG_LENGTH 17
struct stChannelInfo
 {
  char ChannelTag[CHANNEL_TAG_LENGTH];  // Tag (máx 16 caracteres)
  char ChannelEnabled;  // Habilitado se diferente de "0"
 };
// Structure with information about channels
struct stChannel
 {
  int ChannelNumber;  // Número de canais no buffer
  struct stChannelInfo *ChannelInfo;  // Buffer com informações dos canais
 };

在Borland C++6中,该示例使用以下代码读取ChannelTag的值:

 stChannels = this->deviceInterface->LookForAvailableChannels(EdDirectorySource->Text.c_str(), iSn, dateTimeStart, dateTimeEnd);
 for(int i = 0; i < stChannels.ChannelNumber; i++)
 {
  CLbChannels->Items->Add(stChannels.ChannelInfo[i].ChannelTag);  // Add to list the values found
 }

我希望我能在德尔福做同样的事情。我应该如何转录结构?

谢谢和抱歉,因为英语不是我的母语

编辑

我没有在Delphi上发布我所做的事情是错误的。跟随我的尝试:

// record who receive the values 
type stChannelInfo = record
    ChannelTag : string[16];    
    ChannelEnabled : char ; 
end;
type stChannel = record
    ChannelNumber:integer;  // Númber of buffer channels
    ChannelInfo : ^stChannelInfo ;
end;

所以我试着读:

 Var DadosCanais : stChannel;  // defined in var section of procedure onclick Button.
 DadosCanais:=LookForAvailableChannels (Pwidechar(dirroot) , sn , datepickerinicial.DateTime,datepickerfinal.DateTime);
 for i := 0 to (DadosCanais.ChannelNumber-1) do  
  begin  
   Showmessage(String(DadosCanais.ChannelInfo^.ChannelTag));
   inc(DadosCanais.ChannelInfo);
  end;

我拿到了记录,但我不能正确阅读​​ChannelTag值。大小似乎不正确,因为字符串被截断,并且总是丢失名称的第一个字符。

也许这澄清了一点问题。再次感谢

解决方案

根据雷米的建议,我这样做:

 sn:=strtoint(lstdirMaquinas.Items[lstdirMaquinas.Itemindex]);
 Dadoscanais := LookForAvailableChannels(PChar(dirroot) , sn , datepickerinicial.DateTime,datepickerfinal.DateTime);
 for i:=0 to DadosCanais.ChannelNumber-1 do
  begin
    ListboxChannel.Items.add(String(DadosCanais.ChannelInfo[i].ChannelTag));
  end;

现在这解决了我的问题。谢谢大家。

{$POINTERMATH ON}
Type
  PstChannelInfo = ^stChannelInfo;
  stChannelInfo = record
    ChannelTag: array[0..CHANNEL_TAG_LENGTH-1] of AnsiChar;  // Tag (máx 16 caracteres)
    ChannelEnabled: AnsiChar;  // Habilitado se diferente de "0"
  end;
  // Structure with information about channels
  stChannel = record
    ChannelNumber: Integer;  // Número de canais no buffer
    ChannelInfo: PstChannelInfo;  // Buffer com informações dos canais
  end;

stChannels := Self.deviceInterface.LookForAvailableChannels(PChar(EdDirectorySource.Text), iSn, dateTimeStart, dateTimeEnd);
for i := 0 to stChannels.ChannelNumber-1 do begin
  CLbChannels.Items.Add(stChannels.ChannelInfo[i].ChannelTag);  // Add to list the values found
end;

或者:

Type
  PstChannelInfo = ^stChannelInfo;
  stChannelInfo = record
    ChannelTag: array[0..CHANNEL_TAG_LENGTH-1] of AnsiChar;  // Tag (máx 16 caracteres)
    ChannelEnabled: AnsiChar;  // Habilitado se diferente de "0"
  end;
  // Structure with information about channels
  stChannel = record
    ChannelNumber: Integer;  // Número de canais no buffer
    ChannelInfo: PstChannelInfo;  // Buffer com informações dos canais
  end;
  PstChannelInfoList = ^TstChannelInfoList;
  TstChannelInfoList = [0..(MaxInt div SizeOf(stChannelInfo))-1] of stChannelInfo;

stChannels := Self.deviceInterface.LookForAvailableChannels(PChar(EdDirectorySource.Text), iSn, dateTimeStart, dateTimeEnd);
for i := 0 to stChannels.ChannelNumber-1 do begin
  CLbChannels.Items.Add(PstChannelInfoList(stChannels.ChannelInfo)^[i].ChannelTag);  // Add to list the values found
end;