如何在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
相关产品推荐
相关产品推荐

