Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 01.11.2017
Сообщений: 4

Логические диски в ComboBox

10.11.2017, 15:36. Показов 1653. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Помогите пожалуйста на примере, как определить логические диски и передать в ComboBox.
Например Диск С: (метка тома) объем ГБ
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.11.2017, 15:36
Ответы с готовыми решениями:

Логические диски
Здравствуйте! У меня такой вопрос как определить количество дисков и их имена???

Логические жёсткие диски
Появилась такая проблема. У меня есть 1 жёсткий диск, он разделён на два. На одном стоит ОС, на другом пользовательские файлы. После...

2 сервера и логические диски!
Доброго времени суток Уважаемые форумчане!!!! Есть такая проблемка: на предприятии имеются 2 ссервера! Планируется сделать так чтобы...

12
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,014
11.11.2017, 03:43
Некорректный вывод информации о системе
0
11.11.2017, 14:07

Не по теме:


А ведь стоило только поискать

0
0 / 0 / 0
Регистрация: 01.11.2017
Сообщений: 4
11.11.2017, 21:17  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <windows.h>
#include "Unit1.h"
#include "Registry.hpp"
#include <stdio.h>
// Use to convert bytes to MB
#define DIV 1048576
#define WIDTH 7
#define UNICODE
#include <conio.h>
 
//--------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
 
 
__int64 Size;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// локальные диски
wchar_t disks[256]; // список дисковввввввввввввввввввввв
wchar_t *disk;
DWORD sizebuf=256;
GetLogicalDriveStringsW(sizebuf, disks);
disk=disks;
while (*disk)
{
        ComboBox2->Items->Add(disk);
        disk=disk+wcslen(disk)+1;
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ComboBox2Change(TObject *Sender)
{
 char letter;
 int drive;
 if(ComboBox2->ItemIndex>-1)
 {
  letter = ComboBox2->Text[1];  // берем первый символ текста
  drive = int(letter-'A')+1;  // A - английская
  Size=DiskSize(drive);
  if(Size>0)
  {
   Edit7->Text=IntToStr(Size/1024/1024);
  }
}
}
//---------------------------------------------------------------------------
C++
1
2
3
4
5
// Для получения метки диска напишите следующий код:
char DiskLabel[MAX_PATH];
char *DiskName = "c:\\"; // имя диска
GetVolumeInformation(DiskName, DiskLabel, MAX_PATH, NULL, NULL, NULL, NULL, 0);
// в DiskLabel находится метка диска
Я только начинаю учиться (разбираться) с C++ Builder вот поэтому прошу помощи
как записать в одну строчку ComboBox Диск (метка тома) объем ГБ
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
12.11.2017, 01:44
Наверное не самый правильный подход, но работает (у меня)__
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <tchar.h>
     TStringList *SL = new TStringList;
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    SL->Clear();
    ComboBox1->Items->Clear();
   OSVERSIONINFO osvi;
   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
   if(GetVersionEx(&osvi) && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))
  {
    TCHAR szDevices[0xFFFF];
    if(QueryDosDevice(NULL, szDevices, 0xFFFF))  {
      int i=0; String G;
      for (;;)  {
        TCHAR* pszCurrentDevice = &szDevices[i];
        G = pszCurrentDevice;
        if(G.Length()==2 && G.SubString(2,1)==":") SL->Add(G);
        while(szDevices[i] != _T('\0')) i++;
        i++;
        if(szDevices[i] == _T('\0')) break;   }  }
     SL->Sort();
     char buf1[MAX_PATH] ;
     for(int i=0;i<SL->Count;i++) {
       ZeroMemory(&buf1,MAX_PATH);
       GetVolumeInformation(SL->Strings[i].c_str(), buf1, MAX_PATH, 0, 0, 0, 0, 0);
       float dsz = DiskSize(SL->Strings[i][1]-0x40) / 1073741824.00 ;
       SL->Strings[i]=String().sprintf(
            "%s ( %s )%12c%.1f GB",SL->Strings[i], buf1, ' ', dsz) ;
     }
     ComboBox1->Items->Assign(SL);
  }
}
Правда, у логического диска метку не показывает. Подождем, пока отзовутся более сведущие...
1
0 / 0 / 0
Регистрация: 01.11.2017
Сообщений: 4
17.11.2017, 23:54  [ТС]
nick42, Спасибо ваш вариант работает, правда сперва ругался на char переделал на wchar_t.

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
TForm2 *Form2;
TStringList *SL = new TStringList;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
    : TForm(Owner)
{
 
}
//---------------------------------------------------------------------------
 
 
//---------------------------------------------------------------------------
 
void __fastcall TForm2::FormCreate(TObject *Sender)
{
    SL->Clear();
    ComboBox1->Items->Clear();
   OSVERSIONINFO osvi;
   osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
   if(GetVersionExW(&osvi) && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))
  {
    wchar_t szDevices[0xFFFF];
    if(QueryDosDevice(NULL, szDevices, 0xFFFF))
    {
      int i=0; String G;
      for (;;)
      {
        wchar_t* pszCurrentDevice = &szDevices[i];
        G = pszCurrentDevice;
        if(G.Length()==2 && G.SubString(2,1)==":") SL->Add(G);
        while(szDevices[i] != _T('\0')) i++;
        i++;
        if(szDevices[i] == _T('\0')) break;
      }
    }
     SL->Sort();
     wchar_t buf1[MAX_PATH];
     for(int i=0;i<SL->Count; i++)
     {
       ZeroMemory(&buf1,MAX_PATH);
       GetVolumeInformation(SL->Strings[i].w_str(), buf1, MAX_PATH, 0, 0, 0, 0, 0);
       double dsz = DiskSize(SL->Strings[i][1]-0x40) / 1073741824.00;
       SL->Strings[i]=String().sprintf(L"%s ( %s )%12c%.1f GB", SL->Strings[i], buf1, ' ', dsz);
     }
     ComboBox1->Items->Assign(SL);
  }
}


Во общем осталось несколько вопросов
1 Как можно исключить диск А
2 Сдвинуть объем дисков в право
3 При компиляции х64 выдает ошибку
C++
1
SL->Strings[i]=String().sprintf(L"%s ( %s )%12c%.1f GB", SL->Strings[i], buf1, ' ', dsz);
Unit2.cpp
[bcc64 Warning] Unit2.cpp(34): 'GetVersionExW' is deprecated
sysinfoapi.h(458): 'GetVersionExW' declared here
[bcc64 Error] Unit2.cpp(57): cannot pass object of non-trivial type 'System::UnicodeString' through variadic method; call will abort at runtime
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
18.11.2017, 00:04
Цитата Сообщение от Fantasy22 Посмотреть сообщение
cannot pass object of non-trivial type 'System::UnicodeString' through variadic method
Угу. Если не ошибаюсь, надо добавить .c_str(), чтобы успокоить компилер:

C++
1
SL->Strings[i]=String().sprintf(L"%s ( %s )%12c%.1f GB", SL->Strings[i].c_str(), buf1, ' ', dsz);
1
0 / 0 / 0
Регистрация: 01.11.2017
Сообщений: 4
18.11.2017, 00:11  [ТС]
volvo, Благодарю

Во общем осталось несколько вопросов
1 Как можно исключить диск А
2 Сдвинуть объем дисков в право
Изображения
 
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
18.11.2017, 00:59
Цитата Сообщение от Fantasy22 Посмотреть сообщение
Как можно исключить диск А
Просто перед assign искать в SL комбинацию "A:" (она железно вначале,т.к. была сортировка) и удалить эту строку.
Цитата Сообщение от Fantasy22 Посмотреть сообщение
Сдвинуть объем дисков в право
Вот это я сам пока не придумал... - в полях комбобокса табуляция по символу табуляции не производится. Обойти, конечно, можно. Во-первых, - шрифт выбрать моноширинный (CourierNew), чтоб равномерно было. И каждую строку списка "по умному" дополнять пробелами; это еще один дополнительный цикл для вставки объемов дисков.

Добавлено через 23 минуты
П.С. лень напрягаться; если тупо - без анализа длины имён - переделать концовку, то вот так можно, хоть и не красиво...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
. . .     SL->Sort();
     char buf1[MAX_PATH], mx ;
     for(int k,i=0;i<SL->Count;i++) {
       if((k=SL->IndexOf("A:"))>=0) { SL->Delete(k); i--; }
       else {
       ZeroMemory(&buf1,MAX_PATH);
       GetVolumeInformation(SL->Strings[i].c_str(), buf1, MAX_PATH, 0, 0, 0, 0, 0);
       float dsz = 0.004+DiskSize(SL->Strings[i][1]-0x40) / 1073741824.00 ;
       String G = "              ",
              Hh = SL->Strings[i]+" ("+(String)buf1+") " ;
       mx=Hh.Length();
       for(int i=1;i<mx;i++) G[i]=Hh[i];
       SL->Strings[i]=String().sprintf("%s %.1f GB",G, dsz) ;
       }
     }
     ComboBox1->Items->Assign(SL);
  }
}
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
18.11.2017, 01:04
Вид такой...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
18.11.2017, 01:15
Заполняем так:

C++
1
2
3
4
5
6
7
8
9
10
     for(int i=0;i<SL->Count; i++)
     {
       ZeroMemory(&buf1,MAX_PATH);
       GetVolumeInformation(SL->Strings[i].w_str(), buf1, MAX_PATH, 0, 0, 0, 0, 0);
       double dsz = DiskSize(SL->Strings[i][1]-0x40) / 1073741824.00;
       SL->Strings[i]=String().sprintf(L"%s ( %s )%s%.1f GB", SL->Strings[i].c_str(),
         buf1, StringOfChar(L'\t', 4 - (4 + wcslen(buf1)) / 8), dsz);
     }
     ComboBox1->Style = csOwnerDrawFixed; // внимательнее
     ComboBox1->Items->Assign(SL);
, и пишем обработчик OnDrawItem:
C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control, int Index, TRect &Rect,
          TOwnerDrawState State)
{
    TComboBox *bx = static_cast<TComboBox*>(Control);
    String s = bx->Items->Strings[Index];
    bx->Canvas->FillRect(Rect);
 
    ::DrawText(bx->Canvas->Handle, s.c_str(), s.Length(), &Rect, DT_EXPANDTABS);
}
Вид - вот такой:
Миниатюры
Логические диски в ComboBox  
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
18.11.2017, 03:02
А вообще - метод - не так чтобы очень... . По неясной причине съедает имена разделов, а для CD показывает нулевой размер и при вставленном диске.

Добавлено через 22 минуты
Хотя, это я погорячился.. -
Цитата Сообщение от nick42 Посмотреть сообщение
для CD показывает нулевой размер
Просто диск был недозаписан, и до гигабайта не дотягивал. Размер показывает.

Добавлено через 1 час 10 минут
Цитата Сообщение от nick42 Посмотреть сообщение
По неясной причине съедает имена разделов
- не извлекает имя активного раздела; т.е. диска, с которого запущена программа. В принципе, это можно как-то разрешить... .
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
18.11.2017, 12:11
Цитата Сообщение от nick42 Посмотреть сообщение
в SL комбинацию "A:"
Плохая идея. Кто сказал, что диск A: обязан быть флоппи-дисководом? Может, это сетевой диск какой-нибудь. Самый надежный метод (но не знаю, насколько он здесь нужен) - вызов NtQueryVolumeInformationFile и проверка, содержит ли поле Characteristics структуры FILE_FS_DEVICE_INFORMATION бит FILE_FLOPPY_DISKETTE...

Я бы вообще сделал перебор дисков вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    std::auto_ptr<TStringList> SL(new TStringList); // #include <memory>
    SL->Clear();
    ComboBox1->Items->Clear();
 
    if(TOSVersion::Platform == TOSVersion::TPlatform::pfWindows) // это в SysUtils начиная с XE4 - точно есть, раз был вопрос про 64-бит, то ...
    {
        const int DRIVES_SIZE = 512;
        TCHAR szDrives[DRIVES_SIZE] = {0};
        if(::GetLogicalDriveStrings(DRIVES_SIZE - 1, szDrives))
        {
            TCHAR *szDrive = szDrives;
            while(*szDrive)
            {
                ULONGLONG u64TotalBytes;
                TCHAR szLabel[MAX_PATH] = {0};
                ::GetDiskFreeSpaceEx(szDrive, 0, (PULARGE_INTEGER)&u64TotalBytes, 0);
                ::GetVolumeInformation(szDrive, szLabel, MAX_PATH, 0, 0, 0, 0, 0);
 
                SL->Add(String().sprintf(_T("%s ( %s )%s%.1f GB"), szDrive,
                    szLabel, StringOfChar(_T('\t'), 4 - (4 + _tcslen(szLabel)) / 8).c_str(),
                    (double)u64TotalBytes / ((ULONGLONG)1 << 30)));
 
                szDrive += _tcslen(szDrive) + 1;
            }
        }
    }
    ComboBox1->Style = csOwnerDrawFixed;
    ComboBox1->Items->AddStrings(SL.get());
(ну и вышеописанный OnDrawItem комбобокса)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2017, 12:11
Помогаю со студенческими работами здесь

Найти логические диски
Доброго всем времени суток. Извините, наверно не туда пишу, но раздел не нашел) Вопрос - как мне найти все логические диски,...

Разбить на логические диски
Добрый день! Вот сталкнулся с проблемой разбить хард на логические диски без потери данных. acronis и Partition Magic в семерке не...

Swing логические диски
Как считать какие логические диски,в тч. замапированные из сети доступны на компе. В классе file такой возможности не обнаружил. Можно...

Windows 7 не видит логические диски
На новый компьютер оставил старый диск который использовался как файлохранилище. Диск был разбит на три логических. При установке ОС...

Логические диски поменялись буквами.
Установил Windows 7 Professional 32-бит. Все нормально, но одно настораживает: два логических диска поменялись буквами. Тот, который под XP...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru