Пpиходит сантехник(С) к пpогpаммисту(П) pемонтиpовать засоpившуюся pаковину.
C. начинает ковыpяться в отстойнике...
С.- А у вас тут из сети все на винт падает...вот и забило..
П.- Hадо винт больше ставить?
С.- Hет, винт надо вообще спилить к #$%^&й матеpи.
Компонент, выводящий список дисков уже существует – TDriveComboBox, но он не всегда удобен. Я привожу пример программы, выводящей список дисков в двух разных видах.
procedure TForm1.Button1Click(Sender: TObject);
var
i, j: integer;
buf: array [0..499] of char;
DrvStr: array [0..9] of char;
LogDrives: setof 0..25;
begin
integer(LogDrives) := GetLogicalDrives;
for i := 0 to 25 doif (i in LogDrives) then
ListBox1.Items.Add(chr(i + 65));
GetLogicalDriveStrings(1000, buf);
i := 0;
repeat
FillChar(DrvStr, SizeOf(DrvStr), #0);
j := 0;
repeat
DrvStr[j] := buf[i];
inc(j);
inc(i);
until
(buf[i] = #0) or (j > 9);
inc(i);
ListBox2.Items.Add(DrvStr);
until
((buf[i-1] = #0) and (buf[i] = #0)) or (i > 499);
end;
Программа, которую вы предоставили, - это процедура Delphi, которая выводит список доступных дисков в два различных списка: ListBox1 и ListBox2. Первый список отображает буквы диска (A-Z), а второй список - полные пути диска.
Разбивка кода:
GetLogicalDrives
Функция возвращает целочисленное значение, представляющее количество логических дисков на системе. В этом случае, оно хранится в множестве LogDrives.
Цикл for
Программа затем проходит через множество LogDrives и добавляет каждую букву диска (A-Z) в ListBox1.
GetLogicalDriveStrings
Функция получает буфер, содержащий имена всех логических дисков на системе. Буфер хранится в массиве buf.
Повторный цикл
Программа затем проходит через массив buf, заполняя массив DrvStr дисками. Когда она встречает символ null (#0) или превышает длину 9 символов, она добавляет заполненный DrvStr в ListBox2.
Альтернативное решение
Вместо использования двух отдельных списков и циклов, можно использовать одиночный список и проходить через массив buf напрямую. Вот пример:
В этом альтернативном решении мы используем функцию GetLogicalDriveStrings для получения дископутей и хранения их в массиве buf. Затем мы проходим через массив buf и добавляем каждый не-null символную последовательность в список.
Обратите внимание, что это решение предполагает, что null-terminated строка не длиннее 500 символов (размер массива buf). Если фактическая длина путей диска превышает этот лимит, вам может потребоваться использовать больший буфер или корректировать цикл в соответствии с вашими требованиями.
В статье описывается пример программы на Delphi, которая выводит список дисков в двух различных видах: как буквы (A-Z) и как строку с именами дисков.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.