Звонок в компьютерную контору:
- С моим компьютером проблемы, он не включается...
- Как не включается?
- Да пишет все время: "Вставьте дискету, вставьте дискету..."
- А вы вставляли?
- Hет... Как-то не догадался.
Каждый лазерный диск имеет свой идентификатор. Если сохранить, какому диску соответствует какой идентификатор, то можно реализовать определение диска.
В этой программе при нажатии на кнопку происходит проверка, есть ли название этого диска в файле. Если есть, то в заголовок окна выводится его название, если нет, то введенное пользователем название диска сохраняется в файл.
uses
MMSystem, IniFiles;
function GetCDid: string;
var
InfoParams: TMCI_Info_Parms;
s: array [0..63] of char;
OpenParams: TMCI_Open_Parms;
CloseParams: TMCI_Generic_Parms;
begin
result := '';
FillChar(InfoParams, sizeof(InfoParams), #0);
InfoParams.lpstrReturn := @s[0];
InfoParams.dwRetSize := 10;
OpenParams.dwCallback := 0;
OpenParams.lpstrDeviceType := 'CDAudio';
if mciSendCommand(0, mci_Open, mci_Open_Type,
Longint(addr(OpenParams))) <> 0 then
Exit;
if mciSendCommand(OpenParams.wDeviceID, MCI_INFO,
MCI_INFO_MEDIA_IDENTITY, longint(@InfoParams)) = 0 then
result := s;
mciSendCommand(OpenParams.wDeviceID, mci_Close, 0,
Longint(addr(CloseParams)));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
id: string;
ini: TIniFile;
name: string;
begin
id := GetCDid;
if id = '' thenbegin
Form1.Caption := 'No disk';
Exit;
end;
ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'cd.ini');
name := ini.ReadString('CD', id, '');
ifname = '' thenbeginname := 'CD name';
ifnot InputQuery('CD name', 'Enter CD name:', name) then
Exit;
ini.WriteString('CD', id, name);
end;
Form1.Caption := name;
ini.Destroy;
end;
Программа на Delphi, использующая библиотеки MMSystem и IniFiles для идентификации CD-дисков и хранения их названия в файле инициализации.
Вот подробное описание того, что код делает:
Функция GetCDid получает идентификатор текущего CD с помощью библиотеки MCI (Media Control Interface). Она отправляет команду на устройство-дрейвер MCI для открытия устройства CDAudio, затем запросывает медиаидентификацию CD и возвращает ее как строку.
Процедура Button1Click вызывается при клике пользователем на кнопку формы. Она вызывает функцию GetCDid, чтобы получить идентификатор текущего CD.
Если идентификатор пуст (т.е., нет вставленного CD), процедура устанавливает заголовок формы на "No disk" и выходит.
В противном случае она читает имя, связанное с идентификатором CD из файла инициализации cd.ini. Если не найдено имя, она спрашивает пользователя ввести имя с помощью диалогового окна ввода.
Введенное имя хранится в файле cd.ini под ключом идентификатора CD.
Наконец, процедура устанавливает заголовок формы на полученное или введенное имя CD.
Некоторые предложения по улучшению:
вместо жесткого кодирования пути к файлу инициализации (cd.ini) в коде, рассмотрите более гибкую approached, такие как хранение его в конфигурационном файле или переменной среды.
Рассмотрите добавление механизмов обработки ошибок и журналирования для обработки потенциальных проблем с чтением/записью файла инициализации или взаимодействием с драйвером MCI.
Функция GetCDid могла быть улучшена, возвращая пустую строку, если произошла ошибка при выполнении команды MCI, а не просто выйти.
Диалоговое окно ввода могло быть настроено с дефолтным значением и/или подсказкой для более пользовательского интерфейса.
В целом, это хороший старт для идентификации CD-дисков и хранения их названия в файле инициализации. С некоторыми улучшениями код может стать еще более robust и пользовательский.
Программа для определения звукового компакт-диска, которая использует идентификатор диска и сохраняет информацию о названии диска в файле.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.