Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Название диска  (Прочитано 15856 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Prokl
Участник

ru
Offline Offline

« : 27-09-2011 01:20 » 

Код: (C++)
  1. void __fastcall TForm1::diski()
  2. {  //получаем название диска
  3.  
  4. char DiskLabel[MAX_PATH];
  5. char *DiskName1 = (ComboBox1->Items->Strings[ComboBox1->ItemIndex]).c_str();//+"\\"
  6. WORD OldErrorMode;
  7. Label4->Caption = (ComboBox1->Items->Strings[ComboBox1->ItemIndex]).c_str();
  8. OldErrorMode = SetErrorMode(SEM_FAILCRITICALERRORS); // убираем показ ошибок
  9. bool ready = DirectoryExists(DiskName1); // пытаемcя открыть корневую директорию
  10. SetErrorMode(OldErrorMode); // восстанавливаем старый режим показа ошибок
  11.  
  12.           if (ready)
  13.           {
  14.           GetVolumeInformation(DiskName1, DiskLabel, MAX_PATH, NULL, NULL, NULL, NULL, 0);
  15.          
  16.  
  17.           Edit1->Text =  DiskLabel;//здесь название диска
  18.           Button2->Enabled = true;
  19.           Timer1->Enabled = false;
  20.           }
  21.           else
  22.           {
  23.           Edit1->Text = "не готов";
  24.           Button2->Enabled = false;
  25.           Timer1->Enabled = true;
  26.           }
  27.  delete [] DiskName1;
  28. }
этот код работает нестабильно, невсегда показывает название диска, часто показывает его неправильно.
вызываю функцию:
Код:
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
diski();
}
« Последнее редактирование: 27-09-2011 19:12 от RXL » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 27-09-2011 12:36 » 

Prokl, а в чём ты видишь помощь?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Prokl
Участник

ru
Offline Offline

« Ответ #2 : 27-09-2011 12:43 » 

Даже незнаю, может ошибку какую кто-нибудь подскажет...
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 27-09-2011 17:34 » 

Prokl, возникает впечатление, что ты этот код вообще не понимаешь. Иначе хотя бы дал пояснения о том, причём тут таймер, комбо-бокс и прочие элементы управления, и как вообще должна работать программа.

Если вообще не понимаешь - взял кусок чужого кода, - то разговаривать, в общем-то, не о чем.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 27-09-2011 19:13 » new

Я отредактировал пост - подсветил две строчки кода.
Prokl, расскажи, что в них делается.
« Последнее редактирование: 27-09-2011 19:15 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #5 : 28-09-2011 04:08 » 

RXL
ох ты ж ёлки-метёлки
я эту строчку то и не заметил
Записан

Странно всё это....
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 28-09-2011 05:48 » 

Я ж, в основном, на BCB программирую. Оператор delete там нужен только если ты сам используешь new - в остальных случаях либо все само когда надо уничтожается, либо используются косвенные механизмы, но не delete. А тут new не видать, зато есть получение указателя на внутренний буфер объекта.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Prokl
Участник

ru
Offline 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.
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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
Участник

ru
Offline 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 Offline
Пол: Мужской

WWW
« Ответ #10 : 28-09-2011 13:15 » 

Prokl, нифига не "все"! Строку 27 (в коде в начале темы) убери или получишь плавающий глюк.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Prokl
Участник

ru
Offline Offline

« Ответ #11 : 28-09-2011 13:29 » 

Забыл написать, я ее убрал сразу
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines