Prokl
Участник
Offline
|
|
« : 27-09-2011 01:20 » |
|
void __fastcall TForm1::diski() { //получаем название диска char DiskLabel[MAX_PATH]; char *DiskName1 = (ComboBox1->Items->Strings[ComboBox1->ItemIndex]).c_str();//+"\\" WORD OldErrorMode; Label4->Caption = (ComboBox1->Items->Strings[ComboBox1->ItemIndex]).c_str(); OldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); // убираем показ ошибок bool ready = DirectoryExists(DiskName1); // пытаемcя открыть корневую директорию SetErrorMode(OldErrorMode); // восстанавливаем старый режим показа ошибок if (ready) { GetVolumeInformation(DiskName1, DiskLabel, MAX_PATH, NULL, NULL, NULL, NULL, 0); Edit1->Text = DiskLabel;//здесь название диска Button2->Enabled = true; Timer1->Enabled = false; } else { Edit1->Text = "не готов"; Button2->Enabled = false; Timer1->Enabled = true; } delete [] DiskName1; }
этот код работает нестабильно, невсегда показывает название диска, часто показывает его неправильно. вызываю функцию: void __fastcall TForm1::ComboBox1Change(TObject *Sender) { diski(); }
|
|
« Последнее редактирование: 27-09-2011 19:12 от RXL »
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #1 : 27-09-2011 12:36 » |
|
Prokl, а в чём ты видишь помощь?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Prokl
Участник
Offline
|
|
« Ответ #2 : 27-09-2011 12:43 » |
|
Даже незнаю, может ошибку какую кто-нибудь подскажет...
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #3 : 27-09-2011 17:34 » |
|
Prokl, возникает впечатление, что ты этот код вообще не понимаешь. Иначе хотя бы дал пояснения о том, причём тут таймер, комбо-бокс и прочие элементы управления, и как вообще должна работать программа.
Если вообще не понимаешь - взял кусок чужого кода, - то разговаривать, в общем-то, не о чем.
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #4 : 27-09-2011 19:13 » |
|
Я отредактировал пост - подсветил две строчки кода. Prokl, расскажи, что в них делается.
|
|
« Последнее редактирование: 27-09-2011 19:15 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #5 : 28-09-2011 04:08 » |
|
RXL ох ты ж ёлки-метёлки я эту строчку то и не заметил
|
|
|
Записан
|
Странно всё это....
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #6 : 28-09-2011 05:48 » |
|
Я ж, в основном, на BCB программирую. Оператор delete там нужен только если ты сам используешь new - в остальных случаях либо все само когда надо уничтожается, либо используются косвенные механизмы, но не delete. А тут new не видать, зато есть получение указателя на внутренний буфер объекта.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Prokl
Участник
Offline
|
|
« Ответ #7 : 28-09-2011 07:37 » |
|
// для получения метки диска напишите следующий код: char DiskLabel[MAX_PATH]; char *DiskName = "c:\\"; // имя диска GetVolumeInformation(DiskName, DiskLabel, MAX_PATH, NULL, NULL, NULL, NULL, 0); // в DiskLabel находится метка диска Это послужило мне примером для того кода. Здесь тоже нет "new", а "delete" я вставил уже после и на работу кода это не отразилось. В ComboBox создается список CD-ROMов в формате - D:\\ значение выбранной строки ComboBox передается переменной DiskName1.
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #8 : 28-09-2011 10:07 » |
|
// для получения метки диска напишите следующий код: char DiskLabel[MAX_PATH]; char *DiskName = "c:\\"; // имя диска GetVolumeInformation(DiskName, DiskLabel, MAX_PATH, NULL, NULL, NULL, NULL, 0); // в DiskLabel находится метка диска Это послужило мне примером для того кода. Здесь тоже нет "new", а "delete" я вставил уже после и на работу кода это не отразилось. В ComboBox создается список CD-ROMов в формате - D:\\ значение выбранной строки ComboBox передается переменной DiskName1. На всякий случай. Когда в строковой константе написано "\\" - на самом деле в строке слеш только один, а второй его экранирует (дань escape-последовательностям). Поэтому то, что в комбо-боксе видится как "d:\\", в константе будет "d:\\\\".
|
|
|
Записан
|
|
|
|
Prokl
Участник
Offline
|
|
« Ответ #9 : 28-09-2011 12:01 » |
|
AnsiString DiskName1 = (ComboBox1->Items->Strings[ComboBox1->ItemIndex]);
GetVolumeInformation(DiskName1.c_str(), DiskLabel, MAX_PATH, NULL, NULL, NULL, NULL, 0); Вот две строки, которые я изменил и все заработало. RXL, спасибо
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #10 : 28-09-2011 13:15 » |
|
Prokl, нифига не "все"! Строку 27 (в коде в начале темы) убери или получишь плавающий глюк.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Prokl
Участник
Offline
|
|
« Ответ #11 : 28-09-2011 13:29 » |
|
Забыл написать, я ее убрал сразу
|
|
|
Записан
|
|
|
|
|