Avatar billede clavo Nybegynder
12. september 2000 - 15:52 Der er 6 kommentarer og
1 løsning

Tjekke for CD i drev.

Jeg har brug for at kunne tjekke, om der er indsat en cd i drevet.
Jeg gør det i øjeblikket med *
if DirectoryExists(DrevBogstav for CD) then, og det virker også fint, bortset fra at Windows beder mig indsætte en cd. Er der en metode specielt for cdrom drevet eller er det muligt at hindre fejlmeddelelsen fra windows i at dukke op?

Jacob
Avatar billede pellelil Nybegynder
12. september 2000 - 16:00 #1
Nedenstående virker med floppy, men jeg ved ikke om den også virker med CD-ROM. Parametret du skal overføre er drev bogstavet, så hvis du eksempelvis vil se om F-drevet \"er klar så skriver du: \"if IsDriveReady(\'F\') then ....\"


<SNIP>
Function  IsDriveReady(cDrive : Char) : Boolean;
var
  uiDrvNum : byte;
  wEMode  : Word;
begin
  Result := False;
  uiDrvNum := ord(cDrive);
  if uiDrvNum >= ord(\'a\') then dec(uiDrvNum,$20);
  wEMode := SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    if DiskSize(uiDrvNum-$40) <> -1 then Result := True
                                    else messagebeep(0);
  finally
    SetErrorMode(wEMode);
  end;
end;
</SNIP>
Avatar billede borrisholt Novice
12. september 2000 - 16:02 #2
Jeg vil anbefale dig at skrive en klasse til at håndtere skidtet med ...
Prøv fx. den her :

unit DiscInfo;

interface
uses
  Windows,sysutils, JbUtils;
type
  TDriveType = (dtUnknown, dtNoDrive, dtFloppy, dtFixed, dtNetwork, dtCDROM, dtRAM);
  TDriveString = array [0..2] of char;
  TDiscInfo = class(TObject)
  private
    FDrive : TDriveString;
    FFreeSpaceAvailable, FTotalSpace : Int64;
    FTotalFree : _LARGE_INTEGER;
    FSerialId : String;
  protected
    Function GetDriveType : String;
    Function GerDriveSize : String;
  public
    constructor Create(const drive : char);
    property Drive : TDriveString read FDrive;
    property DriveType : String read GetDriveType;
    property FreeSpaceAvailable : Int64 read FFreeSpaceAvailable;
    property TotalSpace : Int64 read FTotalSpace;
    property DiskVolSerialID : String read FSerialId;
  end;


implementation

{ TDiscInfo }

constructor TDiscInfo.Create(const drive: char);
var
  Tmp : DWORD;
begin
  FDrive[0] := drive;
  FDrive[1] := #58;
  FDrive[2] := #92;

  FFreeSpaceAvailable := 0;
  FTotalSpace := 0;

  if GetVolumeInformation(FDrive, nil, 0, nil, Tmp, Tmp, nil, 0) then
    GetDiskFreeSpaceEx(FDrive, FFreeSpaceAvailable, FTotalSpace, @FTotalFree);

  FSerialId := GetDiskVolSerialID(drive);
end;

function TDiscInfo.GerDriveSize: String;
begin
  Result := IntToStr(DiskSize(0));
end;

Function  TDiscInfo.GetDriveType : String;
var
  DriveType: TDriveType;
begin
  DriveType := TDriveType(Windows.GetDriveType(FDrive));
  case DriveType of
    dtUnknown :  Result := \'Drive type cannot be determined.\';
    dtNoDrive :  Result := \'Root directory does not exist\';
    dtFloppy  :  Result := \'Floppy drive.\';
    dtFixed  :  Result := \'Hard disk drive\';
    dtNetwork :  Result := \'Network drive\';
    dtCDROM  :  Result := \'CD-ROM drive\';
    dtRAM    :  Result := \'RAM drive\';
  end;
end;

end.


Så kan du bare kalde den alla det her :


  with TDiscInfo.Create(#68) do
  try
    ListBox1.Items.Add(\'Drive type : \' + DriveType);
    ListBox1.Items.Add(\'Free Space : \' + ConvertBytes(FreeSpaceAvailable));
    ListBox1.Items.Add(\'Total Space : \' + ConvertBytes(TotalSpace));
    ListBox1.Items.Add(\'Disk Serial ID : \' + DiskVolSerialID);
  finally
    free;
  end;

Jens B
Avatar billede borrisholt Novice
12. september 2000 - 16:03 #3
pellelil  >> Hurtig på aftrækkeren hva ?
Avatar billede borrisholt Novice
12. september 2000 - 16:04 #4
Skriv etv. til Jens@borrisholt.com for at få en hel application der kører og viser teknikken ...

Jens B
Avatar billede pellelil Nybegynder
12. september 2000 - 16:05 #5
borrisholt > Ja jeg har mine lyse millisekunder  :-)
Avatar billede clavo Nybegynder
12. september 2000 - 16:23 #6
Tak til jer begge to for det MEGET hurtige svar.
Pellelil\'s lille kodestump virker. Det var lige præcis det jeg skulle bruge. Jeg troede egentlig at jeg kunne give jeg begge point, fordi borrisholt har gjort virkelig meget ud af sit svar. Han tilbyder endda en færdig kode over email :-). Men det blev så til Pellelil. Han VAR også meget hurtig.
Endnu engang tak for hjælpen, begge to!
Jacob
Avatar billede borrisholt Novice
12. september 2000 - 16:25 #7
Jacob >> Derfor kan du godt få koden alligevel ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester