-1

在使用 mmioDescend 定位数据块之后,我想如何读取示例数据并将其显示到例如 delphi 7 中的备忘录中?

我已经按照打开文件、定位 riff、定位 fmt、定位数据块等步骤进行操作。

if (mmioDescend(HMMIO, @ckiData, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) then
SetLength(buf, ckiData.cksize);
mmioRead(HMMIO, PAnsiChar(buf), ckiData.cksize);

我也使用 mmioRead 但我不知道如何显示数据。谁能帮忙举个例子如何使用 mmioRead 然后显示结果?

4

1 回答 1

3

好吧,我可能会读入一个使用更合适的类型声明的缓冲区。

例如,假设您的数据是 16 位整数,Smallint在 Delphi 中。然后声明一个动态数组Smallint

var
  buf: array of Smallint;

然后为数据分配足够的空间:

Assert(ckiData.cksize mod SizeOf(buf[0])=0);
SetLength(buf, ckiData.cksize div SizeOf(buf[0]));

然后读取缓冲区:

mmioRead(HMMIO, PAnsiChar(buf), ckiData.cksize);

现在您可以将元素作为Smallint值访问。

如果您有不同的元素类型,那么您可以调整您的数组声明。如果您直到运行时才知道元素类型是什么,那么您最好array of Byte使用指针算术和强制转换来访问实际内容。

我会说界面的设计mmioRead有点弱。缓冲区并不是真正的字符串。最好将其视为字节数组。但也许是因为 C 没有单独的字节和字符类型,函数被声明为采用指向 char 数组的指针。实际上,Delphi 翻译会更好地公开指向字节的指针,或者在我看来甚至更好,即普通的无类型Pointer类型。


我假设您正在努力解释的输出,mmioRead因为那是您在问题中包含的代码。但是,根据现在已删除的评论,您的问题是 GUI 问题。

您想向备忘录添加内容。像这样做:

Memo1.Clear;
for i := low(buf) to high(buf) do
  Memo1.Items.Add(IntToStr(buf[i]));

如果要转换为浮点数,仍然假设 16 位有符号数据,请执行以下操作:

Memo1.Clear;
for i := low(buf) to high(buf) do
  Memo1.Items.Add(FormatFloat('0.00000', buf[i]/32768.0));//show 5dp
于 2013-04-29T08:09:34.453 回答