Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2009, 13:22   #1
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
Восклицание Помогите с процедурой работы с внешним носителем

Вот код

Код:
function DriveExists(Drive: Byte):boolean; 
var
LogDrives: set of 0..25;
begin
Integer(LogDrives):=GetLogicalDrives;
Result:=Drive in LogDrives;
end;


Procedure DriveD;
var
D:byte;
begin
if DriveExists(D) = true then
 if GetDriveType('D:') = DRIVE_REMOVABLE or DRIVE_FIXED then
  begin
   ///действия
  end
  else
  exit;
end;
Здесь вроде бы ошибка в DriveExists
dolphin705 вне форума Ответить с цитированием
Старый 24.05.2009, 13:27   #2
Levsha100
Заблокирован
Старожил
 
Регистрация: 20.07.2008
Сообщений: 4,032
По умолчанию

Может это поможет...http://www.delphisources.ru/pages/fa...ve_exists.html
Levsha100 вне форума Ответить с цитированием
Старый 24.05.2009, 13:36   #3
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию

Да нет, я ведь без ListBox работаю, мне нужно просто проверить вставлен диск в систему или нет
dolphin705 вне форума Ответить с цитированием
Старый 24.05.2009, 19:46   #4
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию

Ну что, никто не знает да?
dolphin705 вне форума Ответить с цитированием
Старый 24.05.2009, 19:53   #5
Лукманов Александр
работа не волк....
Форумчанин
 
Аватар для Лукманов Александр
 
Регистрация: 09.06.2008
Сообщений: 337
По умолчанию

С какого то сайта

Определить готовность устройства и наличие в нем носителя проще всего при помощи функции API GetDiskFreeSpace. Данная функция при вызове должна получать имя диска в формате "диск:\" в виде строки PCHAR. Если устройство готово к работе и в нем есть носитель, то возвращается TRUE, при ошибках или отсутствии носителя - FALSE. По этому признаку можно судить о наличии дискеты в дисководе. Кроме того, при успешном выполнении функция заполняет последние четыре параметра информацией о диске:

SectorsPerCluster - число секторов на кластер
BytesPerSector - число байт на сектор
NumberOfFreeClusters - число свободных кластеров
TotalNumberOfClusters - общее число кластеров на диске

Код:
Function DiskInDrive(ADriveLetter : Char) : Boolean;
var
  SectorsPerCluster,
  BytesPerSector,
  NumberOfFreeClusters,
  TotalNumberOfClusters   : Cardinal;
begin
  Result := GetDiskFreeSpace(PChar(ADriveLetter+':\'),
                              SectorsPerCluster,
                              BytesPerSector,
                              NumberOfFreeClusters,
                              TotalNumberOfClusters);

end;
В FAQ по Delphi можно встретить другой вариант реализации:

Код:
 Result := false;
 try
  ChDir('a:\');
  Result := true;
 except end;
Такой вариант (известно множество его реализаций - главное, что принцип основан на применении ChDir) несколько некорректен, т.к. приводит к смене текущего каталога, что не всегда желательно. Решить эту проблему позволяет запоминание текущего каталога при помощи функции GetDir и его восстановление после проверки при помощи ChDir.
Известен еще один способ - проверка при помощи FindFirst:

Код:
var
 SR  : TSearchRec;
 Res : integer;
 OldErrMode : integer;
begin
 // Запоминаем текущий режим обработки ошибок и устанавливаем SEM_FAILCRITICALERRORS
 // Это необходимо для подавления появления окна с сообщение о том, что устройство не готово
 OldErrMode = SetErrorMode(SEM_FAILCRITICALERRORS);
 try
  Res := FindFirst('a:\*.*', faAnyfile, SR);
  FindClose(SR);
 finally
  SetErrorMode(OldErrMode)
 end;
end;
Цель, для которой требуются неправые средства, не есть неправая цель.
Лукманов Александр вне форума Ответить с цитированием
Старый 24.05.2009, 20:40   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вроде бы приводил уже:
Код:
function IsDriveReady(DriveLetter : char) : bool;
var
OldErrorMode : Word;
OldDirectory : string;
begin
OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
GetDir(0, OldDirectory);
{$I-}
ChDir(DriveLetter + ':\');
{$I+}
if IoResult > 0 then
Result := False
else
Result := True;
ChDir(OldDirectory);
SetErrorMode(OldErrorMode);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if not IsDriveReady(Edit1.Text[1]) then
ShowMessage('Диска нет')
else
ShowMessage('Диск есть');
end;
Особенность - отключение диалога "Window's critical Error".
mihali4 вне форума Ответить с цитированием
Старый 24.05.2009, 21:18   #7
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию

mihali4, спасибо, как всегда на высоте!
Только вопрос, эта функция для всех типов съёмных носителей? Или только гибких дисков?
dolphin705 вне форума Ответить с цитированием
Старый 24.05.2009, 22:32   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Для всех, в том числе и CD/DVD, SD/MMC/MS/XD - проверено.
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с внешним накопителем Dr.MagoR Компьютерное железо 3 19.05.2009 21:43
Помогите с процедурой в Builder C++ 6.0 AntareSFire C++ Builder 1 27.02.2009 16:50
Помогите с процедурой, plz. Stager Помощь студентам 1 21.01.2009 02:17
Помогите с процедурой... Arkuz Помощь студентам 10 15.05.2008 08:56
помогите с процедурой на VBA Exo Microsoft Office Excel 2 06.05.2008 10:53