Сидит программер, клепает свою прогу, тут звонок в дверь.
Программер открывает - там смерть с косой стоит. Он в панике: "Смерть, дай мне еще полчаса, я закончу прогу, над которой работал два года и можешь меня забирать..."
Смерть ему в ответ: "Я не за тобой, я за твоим винтом!"
procedure TForm1.Button1Click(Sender: TObject);
var
ld: DWORD;
i: integer;
begin
ld := GetLogicalDrives;
for i := 0 to 25 dobeginif (ld and (1 shl i)) <> 0 then
Memo1.Lines.Add(Char(Ord('A') + i) + ':\');
end;
end;
Here is a translation of the provided text into Russian:
Код-snippet на Delphi, который получает список доступных дисков и отображает их в контроле памяти Memo1. Вот разбивка кода:
Процедура Button1Click вызывается при клике кнопки с надписью "Button1".
Переменная ld присваивается результат функции GetLogicalDrives, которая возвращает битмаску, представляющую доступные логические диски (например, A:, C:, D:, и т.д.).
Цикл проходит от 0 до 25, что соответствует количеству возможных букв диска (A-Z).
Для каждой итерации код проверяет, если соответствующий бит в битмаске ld установлен с помощью оператора побитового "И" (1 shl i). Если бит установлен, то это означает, что соответствующая буква диска доступна.
Если буква диска доступна, код добавляет строковое представление буквы диска (например, "A:\") в коллекцию Memo1. Lines.
Для получения списка доступных дисков данный код может использоваться как есть. Однако, если вы хотите улучшить код, вот несколько предложений:
Вместо жесткого кодирования максимального количества итераций (25), рассмотрите возможность использования возвращаемого значения функции GetLogicalDrives для определения фактического количества доступных дисков.
Вы также можете использовать более элегантный способ конструирования строки буквы диска, например, путем конкатенации символа буквы диска и двоеточия ('\') с помощью функции Concat.
Если вы планируете использовать данный код в многопоточной среде, рассмотрите возможность использования механизма синхронизации (например, блокировок) для обеспечения доступа к контролу памяти не одновременно.
Вот обновленная версия кода, которая включает эти предложения:
procedure TForm1.Button1Click(Sender: TObject);
var
ld: DWORD;
i: Integer;
begin
ld := GetLogicalDrives;
for i := 0 to (GetLogicalDrives shr 31) - 1 do // Используйте возвращаемое значение функции GetLogicalDrives
begin
if (ld and (1 shl i)) <> 0 then
Memo1.Lines.Add(Concat(Chr(Ord('A') + i), '\'));
end;
end;
Замечание: я использовал функцию Concat для конструирования строки буквы диска, и также обновил условие цикла, чтобы использовать возвращаемое значение функции GetLogicalDrives. Это обеспечивает, что цикл проходит только над фактическим количеством доступных дисков.
В статье описывается как использовать процедуру GetLogicalDrives для получения списка доступных носителей в программировании на языке Delphi.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.