BCB6-Laufwerk wählen in dem bestimmte CD ist
-
-
habe jetzt folgenden code der grundsätzlich funktioniert:
void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString slVolumeName; DWORD dwVolumeSerial; if(IsDiskInDrive(AnsiString("c"), slVolumeName,dwVolumeSerial)) { if (slVolumeName=="AUDIO_CD")Application->MessageBox("C","Laufwerk",32); } if(IsDiskInDrive(AnsiString("d"), slVolumeName,dwVolumeSerial)) { if (slVolumeName=="AUDIO_CD")Application->MessageBox("D","Laufwerk",32); } else Application->MessageBox("Bitte cd einlegen","Fehler",32); }wenn keine disk eingelegt iss kommt die fehlermeldung, wenn disc zb in
ist kommt erst die "D" message und trozdem die fehlermeldung, was hab ich falsch gemacht ?
-
Glaube du bist mit deinen zwei if's und einem else welches nur für das letzte if gilt durcheinander. Da keiner deine Logik kennt und es nicht ersichtlich ist, was geprüft wird, laääst sich nix genaues sagen-> Was sind c & d? Die Laufwerksbuchstaben?
Wenn ja sollte doch die Prüfung lauten:Wenn DiskinDrive UND Volume==Audio_CD
-
Hier noch der Anfang des Codes:
bool IsDiskInDrive(AnsiString slDrive, AnsiString &slVolName, DWORD& dwVolumeSerial) { bool blRetVal = false; UINT iErrMode; TCHAR szVolName[256]; DWORD dwMaxComSize; DWORD dwFlags; TCHAR szFS[256]; // Falls Laufwerksname übergeben: if(slDrive.Length() > 0) { // der Aufruf von SetErrorMode ist notwendig, Windows-Messagebox // "Laufwerk nicht bereit" zu unterdrücken: iErrMode = SetErrorMode(SEM_FAILCRITICALERRORS); // Laufwerksinformationen auslesen: blRetVal = GetVolumeInformation( (slDrive.SubString(1,1)+ ":\\").c_str(), szVolName, sizeof(szVolName), &dwVolumeSerial, &dwMaxComSize, &dwFlags, szFS, sizeof(szFS)); // ErrorMode in ursprünglichen Zustand versetzen: SetErrorMode(iErrMode); } else blRetVal = false; // Volumen-Namen in überg. String schreiben: slVolName = blRetVal ? AnsiString(szVolName) : EmptyStr; return blRetVal; } bool GetDiskSpace(AnsiString slDrive, __int64& ilBytesTotal, __int64& ilBytesFree) { ilBytesFree = DiskFree(slDrive.UpperCase()[1]-0x40); ilBytesTotal = DiskSize(slDrive.UpperCase()[1]-0x40); return ilBytesFree > -1 && ilBytesTotal > -1; }aber das else steht doch für alle ifs oder nicht ? wenn bla mach das wenn bla mach das und ansonten bring die fehlermeldung, oder wie müsste das dann sein ?
-
if...
else if
...else if
else
-
jo darauf war ich auch shcon gekommen, leider bringt mir das nix weil er dann direkt in der if bedingung vom 1. laufwerkbuchstaben der net mehr vorhanden ist ans ende des programms springt und somit die else überspringt
die if bedingung müsste irgendwie anders gemacht werden, aber ich hab keine ahnung wie
-
kann mir niemand weiterhelfen ?
-
Hallo
Ich versuche mich mal in Dein Problem hinein zu versetzen (schreibt man das auseinander?)
Du hast den Code sicherlich von Bytes&More und da sieht der Aufruf ein wenig anders aus.
Wenn Du das Problem mit if und else nicht lösen kannst, so musst Du es abändern
Kannst Du das nicht in eine eigene Funktion legen?
void testDrive(AnsiString DriveLetter) { AnsiString slVolumeName; DWORD dwVolumeSerial; if(IsDiskInDrive(DriveLetter, slVolumeName,dwVolumeSerial) == true) Application->MessageBox(DriveLetter,"Laufwerk",32); else Application->MessageBox("Bitte cd einlegen","Fehler",32); }Du musst dann diese Funktion für alle Laufwerke, die Du testen willst, aufrufen
Gruss Rostfrei[]
-
mh und was muss ich da noch machen wenn er alle laufwerke (a-z) nach der cd mit dem namen "AUDIO_CD" durchsuchen soll, er soll damit nicht aufhören falls es einen laufwerkbuchstaben nicht gibt und wenn die cd gefunden iss soll er aufhören und laufwerkbuchstaben ausgeben und wenn sie nirgends drin iss ne fehlermeldung
-
Hallo weedhead87
char Alphabet[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'}; bool SpecialRomFounded = false; for(int x = 0; x <= 25; x++) { SpecialRoomFounded = testDrive(Alphabet[x]); if(SpecialRoomFounded == true) break; } if(SpecialRomFounded == false) Application->MessageBox("Bitte cd einlegen","Fehler",32); bool testDrive(AnsiString DriveLetter) { AnsiString slVolumeName; DWORD dwVolumeSerial; if(IsDiskInDrive(DriveLetter, slVolumeName,dwVolumeSerial) == true) if (slVolumeName=="AUDIO_CD")Application->MessageBox(DriveLetter,"Laufwerk",32); }Weiss nicht, ob das ganze funktioniert; habe mir das gerade mal schnell aus den Fingern geaugt
Gruss
-
ích glaube ich hab selbst ne funktion die funktoniert, habe ne schleife eingefügt:
{ for(int i=97;i<=122;i++) { char a=i; AnsiString DriveLetter=a; AnsiString slVolumeName; DWORD dwVolumeSerial; if(IsDiskInDrive(DriveLetter, slVolumeName,dwVolumeSerial) == true&&slVolumeName=="AUDIO_CD") Application->MessageBox("lol","Laufwerk",32); } else Application->MessageBox("Bitte cd einlegen","Fehler",32); }
-
´mh missplaced else steht da, iss doch aber richtig, oder ?
{ AnsiString slVolumeName; DWORD dwVolumeSerial; for(int i=97;i<=122;i++) { char a=i; AnsiString DriveLetter=a; if(IsDiskInDrive(DriveLetter, slVolumeName,dwVolumeSerial) == true&&slVolumeName=="AUDIO_CD") { Application->MessageBox("lol","Laufwerk",32); } } else Application->MessageBox("Bitte cd einlegen","Fehler",32); }wenn ich das els vor die { setze gehts, aber dann kommt für jden buchstaben die fehlermeldung, ich will das die nur einma kommt
-
ok ich habs nun endlich danke für eure hile (man bin ich doof)
{ AnsiString slVolumeName; DWORD dwVolumeSerial; for(int i=97;i<=122;i++) { char a=i; AnsiString DriveLetter=a; if(IsDiskInDrive(DriveLetter, slVolumeName,dwVolumeSerial) == true&&slVolumeName=="AUDIO_CD") { Application->MessageBox("CD gefunden","Laufwerk",32); } else if (i==122) Application->MessageBox("Bitte cd einlegen","Fehler",32); } }in dos gibts die variable %systemdrive% fürs windows verzeichnis
gibts das unter c++ auch und wenn ja wie heißt diese variable oder wie bekomme ich diese info ?
-
Hallo
char cBuf[MAX_PATH]; GetWindowsDirectory(cBuf, sizeof(cBuf)); ShowMessage("Windows-Verzeichnis: " + AnsiString(cBuf));Gruss Rostfrei[]
-
danke dir