You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Lazarus中将MIDI设备名称添加至ComboBox组件?

在Lazarus中显示MIDI设备名称到ComboBox

要在ComboBox中显示MIDI设备的具体名称,你需要调用Windows API的midiOutGetDevCaps函数获取每个设备的详细信息(包括名称),而非仅依赖设备ID。以下是修改后的完整代码:

uses
  winmm; // 必须引入winmm单元以使用MIDI相关API

var
  MyMIDIDevice: integer;
  caps: MIDIOUTCAPS;
  devName: string;
begin
  cmbMIDIdevs.Clear;
  for MyMIDIDevice := 0 To midiOutGetNumDevs() - 1 do
  begin
    // 获取当前MIDI设备的属性信息
    if midiOutGetDevCaps(MyMIDIDevice, @caps, SizeOf(MIDIOUTCAPS)) = MMSYSERR_NOERROR then
    begin
      // 将设备ID和名称组合成显示文本(也可仅显示名称)
      devName := Format('%d - %s', [MyMIDIDevice, caps.szPname]);
      cmbMIDIdevs.Items.Add(devName);
      // 将设备ID存储到ComboBox的Objects列表,方便后续调用
      cmbMIDIdevs.Items.Objects[cmbMIDIdevs.Items.Count - 1] := TObject(MyMIDIDevice);
    end;
  end;

  if cmbMIDIdevs.Items.Count > 0 then
  begin
    cmbMIDIdevs.ItemIndex := 0;
    // 从Objects中取出真实设备ID,传递给OpenMidiOut
    OpenMidiOut(Integer(cmbMIDIdevs.Items.Objects[0]));
  end;
end;

关键说明:

  • MIDIOUTCAPS结构体:包含MIDI输出设备的所有属性,其中szPname字段对应设备名称字符串。
  • midiOutGetDevCaps函数:传入设备ID、结构体指针和结构体大小,成功返回MMSYSERR_NOERROR时,结构体将填充设备信息。
  • 绑定设备ID:通过Items.Objects将设备ID与显示文本绑定,避免直接用ItemIndex替代设备ID的潜在风险,确保选择后能准确获取对应设备ID。
  • 显示格式:示例中用%d - %s同时显示ID和名称,你也可根据需求仅显示名称(直接使用caps.szPname)。

内容的提问来源于stack exchange,提问作者FDelph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:22:38