Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.01.2007, 18:46
Alexxxx Alexxxx вне форума
Прохожий
 
Регистрация: 19.01.2007
Адрес: Мліїв, Україна
Сообщения: 13
Репутация: 10
Радость Програмное открытие дисковода

Как програмно открыть несколько дисководов (если есть DVD-RW и CD-ROM)?
Ответить с цитированием
  #2  
Старый 30.01.2007, 19:53
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
Стрелка

читай дельфиворлд....

в двух словах: перебираешь дисководы от "A" до "Z" и проверяшь: если это cd-rom, то открываешь его....
я понимаю что это банально, но извини delphiworld под рукой нету(как сейчас помню - смотри в последнем разделе )
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
  #3  
Старый 30.01.2007, 22:02
Аватар для Artem28
Artem28 Artem28 вне форума
Прохожий
 
Регистрация: 07.08.2006
Сообщения: 32
Репутация: 10
По умолчанию

Код:
unit DriveTools; 

interface 

uses 

  Windows, SysUtils, MMSystem; 

function CloseCD(Drive: Char): Boolean; 
function OpenCD(Drive: Char): Boolean; 

implementation 

function OpenCD(Drive: Char): Boolean; 
var 

  Res: MciError; 
  OpenParm: TMCI_Open_Parms; 
  Flags: DWord; 
  S: string; 
  DeviceID: Word; 
begin 

  Result := false; 
  S := Drive + ':'; 
  Flags := mci_Open_Type or mci_Open_Element; 
  with OpenParm do 
  begin 
    dwCallback := 0; 
    lpstrDeviceType := 'CDAudio'; 
    lpstrElementName := PChar(S); 
  end; 
  Res := mciSendCommand(0, mci_Open, Flags, Longint(@OpenParm)); 
  if Res <> 0 then 
    exit; 
  DeviceID := OpenParm.wDeviceID; 
  try 
    Res := mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0); 
    if Res = 0 then 
      exit; 
    Result := True; 
  finally 
    mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm)); 
  end; 
end; 

function CloseCD(Drive: Char): Boolean; 
var 

  Res: MciError; 
  OpenParm: TMCI_Open_Parms; 
  Flags: DWord; 
  S: string; 
  DeviceID: Word; 
begin 

  Result := false; 
  S := Drive + ':'; 
  Flags := mci_Open_Type or mci_Open_Element; 
  with OpenParm do 
  begin 
    dwCallback := 0; 
    lpstrDeviceType := 'CDAudio'; 
    lpstrElementName := PChar(S); 
  end; 
  Res := mciSendCommand(0, mci_Open, Flags, Longint(@OpenParm)); 
  if Res <> 0 then 
    exit; 
  DeviceID := OpenParm.wDeviceID; 
  try 
    Res := mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0); 
    if Res = 0 then 
      exit; 
    Result := True; 
  finally 
    mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm)); 
  end; 
end; 

end. 
Полный код...
Ответить с цитированием
  #4  
Старый 03.02.2007, 17:01
Alexxxx Alexxxx вне форума
Прохожий
 
Регистрация: 19.01.2007
Адрес: Мліїв, Україна
Сообщения: 13
Репутация: 10
Хорошо Respect

Big respect!!!!!
Ответить с цитированием
  #5  
Старый 08.02.2007, 14:18
dron-s dron-s вне форума
Прохожий
 
Регистрация: 08.02.2007
Сообщения: 44
Репутация: 10
По умолчанию

в общем, в чём заключалась мысль (идея) в том чтобы при старте проги, определить сколько приводов в системе и какие буквы они занимают, записать их куда нибудь (я выбрал ComboBox) а потом по очереди в цикле их открывать и закрывать...
вот полный код проекта: на форму кинуть один батон и ComboBox
Код:
uses
  MMSystem;
//...

//Инициализация приводов в системе
procedure TForm1.FormCreate(Sender: TObject);
var
  w:dword;
  Root:string;
  I, K:integer;
  Driv: array [1..25] of string;
begin
  k:=0;
  w:=GetLogicalDrives;
  Root := '#:';
  for i := 0 to 25 do
  begin
    Root[1] := Char(Ord('A')+i);
    if (W and (1 shl i))>0 then
      if GetDriveType(Pchar(Root)) = DRIVE_CDROM then
      begin
        k:=k+1;
        Driv[k] := Root;
        ComboBox1.Items.Add(Driv[k]);
        ComboBox1.Text := Driv[1];
      end;
  end;
end;

//функция на открытие привода
function OpenCD(Drive: string): Boolean;
var
  Res : MciError;
  OpenParm: TMCI_Open_Parms;
  Flags : DWord;
  S : string;
  DeviceID : Word;
begin
  Result:=false;
  S:=Drive;
  Flags:=mci_Open_Type or mci_Open_Element;
  with OpenParm do
  begin
    dwCallback := 0;
    lpstrDeviceType := 'CDAudio';
    lpstrElementName := PChar(S);
  end;
  Res := mciSendCommand(0, mci_Open, Flags, Longint(@OpenParm));
  if Res<>0 then
    exit;
  DeviceID:=OpenParm.wDeviceID;
  try
    Res:=mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0);
    if Res=0 then
      exit;
    Result:=True;
  finally
    mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm));
  end;
end;

//функция на закрытие привода
function CloseCD(Drive: string): Boolean;
var
  Res : MciError;
  OpenParm: TMCI_Open_Parms;
  Flags : DWord;
  S : string;
  DeviceID : Word;
begin
  Result:=false;
  S:=Drive;
  Flags:=mci_Open_Type or mci_Open_Element;
  with OpenParm do
  begin
    dwCallback := 0;
    lpstrDeviceType := 'CDAudio';
    lpstrElementName := PChar(S);
  end;
  Res := mciSendCommand(0, mci_Open, Flags, Longint(@OpenParm));
  if Res<>0 then
    exit;
  DeviceID:=OpenParm.wDeviceID;
  try
    Res:=mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);
    if Res=0 then
      exit;
    Result:=True;
  finally
    mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm));
  end;
end;

//цикл
procedure TForm1.Button1Click(Sender: TObject);
var
 i:integer;
begin
  for I := 0 to Combobox1.Items.Count do
   if not openCD(ComboBox1.Items[i]) then
     CloseCD(ComboBox1.Items[i]);
end;
Ответить с цитированием
  #6  
Старый 08.02.2007, 16:57
Alexxxx Alexxxx вне форума
Прохожий
 
Регистрация: 19.01.2007
Адрес: Мліїв, Україна
Сообщения: 13
Репутация: 10
По умолчанию

Цитата:
Сообщение от dron-s
в общем, в чём заключалась мысль (идея) в том чтобы при старте проги, определить сколько приводов в системе и какие буквы они занимают, записать их куда нибудь (я выбрал ComboBox) а потом по очереди в цикле их открывать и закрывать...
вот полный код проекта: на форму кинуть один батон и ComboBox
Код:
uses
  MMSystem;
//...

//Инициализация приводов в системе
procedure TForm1.FormCreate(Sender: TObject);
var
  w:dword;
  Root:string;
  I, K:integer;
  Driv: array [1..25] of string;
begin
  k:=0;
  w:=GetLogicalDrives;
  Root := '#:';
  for i := 0 to 25 do
  begin
    Root[1] := Char(Ord('A')+i);
    if (W and (1 shl i))>0 then
      if GetDriveType(Pchar(Root)) = DRIVE_CDROM then
      begin
        k:=k+1;
        Driv[k] := Root;
        ComboBox1.Items.Add(Driv[k]);
        ComboBox1.Text := Driv[1];
      end;
  end;
end;

//функция на открытие привода
function OpenCD(Drive: string): Boolean;
var
  Res : MciError;
  OpenParm: TMCI_Open_Parms;
  Flags : DWord;
  S : string;
  DeviceID : Word;
begin
  Result:=false;
  S:=Drive;
  Flags:=mci_Open_Type or mci_Open_Element;
  with OpenParm do
  begin
    dwCallback := 0;
    lpstrDeviceType := 'CDAudio';
    lpstrElementName := PChar(S);
  end;
  Res := mciSendCommand(0, mci_Open, Flags, Longint(@OpenParm));
  if Res<>0 then
    exit;
  DeviceID:=OpenParm.wDeviceID;
  try
    Res:=mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0);
    if Res=0 then
      exit;
    Result:=True;
  finally
    mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm));
  end;
end;

//функция на закрытие привода
function CloseCD(Drive: string): Boolean;
var
  Res : MciError;
  OpenParm: TMCI_Open_Parms;
  Flags : DWord;
  S : string;
  DeviceID : Word;
begin
  Result:=false;
  S:=Drive;
  Flags:=mci_Open_Type or mci_Open_Element;
  with OpenParm do
  begin
    dwCallback := 0;
    lpstrDeviceType := 'CDAudio';
    lpstrElementName := PChar(S);
  end;
  Res := mciSendCommand(0, mci_Open, Flags, Longint(@OpenParm));
  if Res<>0 then
    exit;
  DeviceID:=OpenParm.wDeviceID;
  try
    Res:=mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);
    if Res=0 then
      exit;
    Result:=True;
  finally
    mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm));
  end;
end;

//цикл
procedure TForm1.Button1Click(Sender: TObject);
var
 i:integer;
begin
  for I := 0 to Combobox1.Items.Count do
   if not openCD(ComboBox1.Items[i]) then
     CloseCD(ComboBox1.Items[i]);
end;
А как сделать, чтобы в зависимости от количества дисководов автоматически добавлялись пункты в MainMenu и можно было выбрать самостоятельно открываемый дисковод?
Ответить с цитированием
  #7  
Старый 08.02.2007, 17:29
dron-s dron-s вне форума
Прохожий
 
Регистрация: 08.02.2007
Сообщения: 44
Репутация: 10
По умолчанию

ну дык там же написано...
только вместо ComboBox используй TMainMenu и всё...
Ответить с цитированием
  #8  
Старый 08.02.2007, 17:39
dron-s dron-s вне форума
Прохожий
 
Регистрация: 08.02.2007
Сообщения: 44
Репутация: 10
По умолчанию

попробуй вот так
Код:
uses
  MMSystem;
//...

//функция на открытие привода
function OpenCD(Drive: string): Boolean;
var
  Res : MciError;
  OpenParm: TMCI_Open_Parms;
  Flags : DWord;
  S : string;
  DeviceID : Word;
begin
  Result:=false;
  S:=Drive;
  Flags:=mci_Open_Type or mci_Open_Element;
  with OpenParm do
  begin
    dwCallback := 0;
    lpstrDeviceType := 'CDAudio';
    lpstrElementName := PChar(S);
  end;
  Res := mciSendCommand(0, mci_Open, Flags, Longint(@OpenParm));
  if Res<>0 then
    exit;
  DeviceID:=OpenParm.wDeviceID;
  try
    Res:=mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0);
    if Res=0 then
      exit;
    Result:=True;
  finally
    mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm));
  end;
end;

//функция на закрытие привода
function CloseCD(Drive: string): Boolean;
var
  Res : MciError;
  OpenParm: TMCI_Open_Parms;
  Flags : DWord;
  S : string;
  DeviceID : Word;
begin
  Result:=false;
  S:=Drive;
  Flags:=mci_Open_Type or mci_Open_Element;
  with OpenParm do
  begin
    dwCallback := 0;
    lpstrDeviceType := 'CDAudio';
    lpstrElementName := PChar(S);
  end;
  Res := mciSendCommand(0, mci_Open, Flags, Longint(@OpenParm));
  if Res<>0 then
    exit;
  DeviceID:=OpenParm.wDeviceID;
  try
    Res:=mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);
    if Res=0 then
      exit;
    Result:=True;
  finally
    mciSendCommand(DeviceID, mci_Close, Flags, Longint(@OpenParm));
  end;
end;

//процедура добавления меню
procedure TForm1.addmainitem(s: string);
var
  newitem: Tmenuitem;
begin
  newitem := tmenuitem.create(Mainmenu1);
  newitem.caption := s;
  mainmenu1.items.insert(mainmenu1.items.count, newitem);
end;

//Инициализация приводов в системе
procedure TForm1.FormCreate(Sender: TObject);
var
  w:dword;
  Root:string;
  I, K:integer;
  Driv: array [1..25] of string;
begin
  k:=0;
  w:=GetLogicalDrives;
  Root := '#:';
  for i := 0 to 25 do
  begin
    Root[1] := Char(Ord('A')+i);
    if (W and (1 shl i))>0 then
      if GetDriveType(Pchar(Root)) = DRIVE_CDROM then
      begin
        k:=k+1;
        Driv[k] := Root;
        addmainitem(Driv[k]);
      end;
  end;
end;
Ответить с цитированием
  #9  
Старый 08.02.2007, 22:10
Alexxxx Alexxxx вне форума
Прохожий
 
Регистрация: 19.01.2007
Адрес: Мліїв, Україна
Сообщения: 13
Репутация: 10
Радость Help

Dron-s, а как сделать так, чтоб у пункта меню было подменю с пунктами "Открыть дисковод" и "Закрыть дисковод"? И как правильно к этим пунктам сделать обработчики, чтоб выбрал нужное меню - и дисковод закрылся (открылся)?? Напишите, пожалуйста, исходник...
Ответить с цитированием
  #10  
Старый 08.02.2007, 22:40
dron-s dron-s вне форума
Прохожий
 
Регистрация: 08.02.2007
Сообщения: 44
Репутация: 10
По умолчанию

создавай для каждого дисковода по два подменю... на событие каждого подменю вешай функцию OpenCD и CloseCD соответственно...
про динамическое создание подменю почитай в справке...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:39.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025