Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/36: Рейтинг темы: голосов - 36, средняя оценка - 4.83
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1

Каким компонентом можно реализовать такое?

01.07.2012, 02:31. Показов 7843. Ответов 89
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Каким компонентом можно реализовать такое?
Миниатюры
Каким компонентом можно реализовать такое?  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.07.2012, 02:31
Ответы с готовыми решениями:

Каким компонентом продемонстрировать выбранный цвет
Уважаемые здравствуйте! Вопрос детский конечно, но всё же хотябы помогите где рыть и какой это может быть компонент в билдере ... ...

Каким компонентом воспользоваться, чтобы отправить E-mail, если у меня инет через прокси?
Пробовал NMSMTP, IdSMTP, но там нет настроек прокси.

Игра "Дурак", каким компонентом воспользоваться и как.
Пытаюсь я написать карточную игру дурак, чтобы можно было играть по локальной сети или через Хамачи. Играть можно будет двум и более людям....

89
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
08.11.2012, 12:53  [ТС]
Студворк — интернет-сервис помощи студентам
BRcr, я через
C++
1
ShowMessage("ВОТ");
. я попробую но на следующей неделе так как этой флэшки нет сбойной собой, и наверно совсем не много осталось что бы ловить отключение флэшки?Или проще создать три списка букв флэшки?1 подключенный на данный момент, 2 - после отключения, 3 - 1 список - 2 список, та буква и отключена?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
08.11.2012, 13:35
Цитата Сообщение от Ddv122 Посмотреть сообщение
Или проще создать три списка букв флэшки?
Проще, конечно. Вполне себе рабочий вариант.
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
14.11.2012, 17:35  [ТС]
BRcr, как я понял здесь handle_disk
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void __fastcall handle_disk(AnsiString disk) {
 
                   // ïûòàåìcÿ îòêðûòü êîðíåâóþ äèðåêòîðèþ
                   char DiskLabel[MAX_PATH];
                   TDateTime dt;
                    UINT DriveType = GetDriveType( disk.c_str( ) );  // ïîëó÷àåì òèï äèñêà
                    if ( (DriveType != DRIVE_CDROM &                // èñêëþ÷àåì CDROMû
                            DriveType != DRIVE_FIXED &             // èñêëþ÷àåì  HDD
                            DriveType != DRIVE_RAMDISK &          // èñêëþ÷àåì  Ram disk
                            DriveType != DRIVE_REMOTE &          //èñêëþ÷àåì FDD
                            DriveType != DRIVE_NO_ROOT_DIR &    //èñêëþ÷àåì ïîâðåæä¸ííûå äèñêè
                            DriveType != DRIVE_UNKNOWN))       //èñêëþ÷àåì íåèçâåñòíûå äèñêè
                    {
 
                        GetVolumeInformation( disk.c_str( ), DiskLabel, MAX_PATH, NULL, NULL, NULL, NULL, 0 );    //ïîëó÷àåì Èìÿ äèñêà
                        // äëÿ îò÷åòà
                        dt = Now( ); // ïîëíûé ôîðìàò äàòû
                        redtLog->Lines->Add(DateTimeToStr(dt) +
                                       "  | " + "Ïîäêëþ÷åí íàêîïèòåëü: " "(" + ( disk.SubString(1,2) ) +
                                        ")" + " " + DiskLabel + "" );     //óêàçûâàåì â Ëîã âðåìÿ,äàòó, èìÿ äèñêà.
                                        redtLog->Lines->SaveToFile("Log.txt");
                        }}

вызов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 WORD OldErrorMode;                   //îòêëþ÷àåì ïîêàç îøèáîê
        AnsiString disk;                    //ïåðåìåííàÿ disk òèïà  AnsiString
        DWORD dr = GetLogicalDrives( );    // ôóíêöèÿ âîçâðàùàåò áèòîâóþ ìàñêó
        for ( int x = 0; x < 26; x++ ) {
            if ( ( dr >> x ) & 1 ) {
                disk = AnsiString( ( char )( 65 + x ) ) + ":\\"; // ïîëó÷àåì ëèòåðó äèñêà
                OldErrorMode = SetErrorMode( SEM_FAILCRITICALERRORS ); // óáèðàåì ïîêàç îøèáîê
                bool ready = DirectoryExists(disk); // ïûòàåìcÿ îòêðûòü êîðíåâóþ äèðåêòîðèþ
                if (ready)
                               {
                                  handle_disk( disk );
 
                                   }
                else
                {
Просто если за комментировать else . В лог идет 2 копии одного и того же диска вставленного в ПК
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
14.11.2012, 21:12
Да зачем эти "закомментировать", учись пользоваться трассировщиком.
Тебе нужно в точности понять, что происходит, и, тыкая в небо пальцем, этого не достичь. Когда идет вызов той или иной функции? Какие ей передаются параметры, как они обрабатываются? Может, WMDeviceChange() дважды отрабатывает, может, таймер по списку дисков некорректно проходит...
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
14.11.2012, 23:45  [ТС]
Устанавливаю брэйкпойнты, нажимаю F8, Верно?Но мне это не чего не дает...Да и в интернете глухо.У меня c++ builder 6
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
12.02.2013, 00:07  [ТС]
BRcr, я заметил что не ту флэшку обрабатывает
Вот если подключаю телефон(там 2 флэшки), в системе на тот момент не чего не было подключено
Code
1
2
3
4
DDV122-PC\DDv122 |  11.02.2013 22:37:36  | Подключен накопитель: (F:) 
DDV122-PC\DDv122 |  11.02.2013 22:37:36  | Защита уже установлена на диск: (G:)
DDV122-PC\DDv122 |  11.02.2013 22:37:36  | Подключен накопитель: (G:) Memory card
DDV122-PC\DDv122 |  11.02.2013 22:37:36  | Защита уже установлена на диск: (G:)
Вот подключаю к этим 1 ещё одну флэшку
Code
1
2
3
4
5
DDV122-PC\DDv122 |  11.02.2013 22:37:36  | Подключен накопитель: (F:) 
DDV122-PC\DDv122 |  11.02.2013 22:37:36  | Защита уже установлена на диск: (G:)
DDV122-PC\DDv122 |  11.02.2013 22:37:36  | Подключен накопитель: (G:) Memory card
DDV122-PC\DDv122 |  11.02.2013 22:37:36  | Защита уже установлена на диск: (G:)
DDV122-PC\DDv122 |  11.02.2013 22:40:04  | Подключен накопитель: (F:)
и бьёт ошибку что не может скопировать на диск H

+ подключаю к этим 3 флэшкам картридер (без флэшки) диск J
бьёт ошибку что не может скопировать на диск J
Code
1
2
3
4
5
6
DDV122-PC\DDv122 |  11.02.2013 22:37:36  | Подключен накопитель: (F:) 
DDV122-PC\DDv122 |  11.02.2013 22:37:36  | Защита уже установлена на диск: (G:)
DDV122-PC\DDv122 |  11.02.2013 22:37:36  | Подключен накопитель: (G:) Memory card
DDV122-PC\DDv122 |  11.02.2013 22:37:36  | Защита уже установлена на диск: (G:)
DDV122-PC\DDv122 |  11.02.2013 22:40:04  | Подключен накопитель: (F:) 
DDV122-PC\DDv122 |  11.02.2013 22:42:05  | Подключен накопитель: (F:)
В логе не то идёт, и не копирует во 2 случаи, а в 3 не куда копировать но пробует скопировать....

Добавлено через 22 минуты
Весь код
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
void __fastcall TMain::execute_t_wait_disk( TObject *Sender ) {
    timer_waits_for_explorer *t = dynamic_cast <timer_waits_for_explorer *> ( Sender );
    for ( size_t i = 0; i < t->disks.size( ); ++i ) {
        if ( t->disks[i].IsEmpty( ) ) {
            t->disks.erase( t->disks.begin( ) + i-- );
        }
        else if ( DirectoryExists( t->disks[i] ) ) {
            handle_disk( t->disks[i] );
            t->disks.erase( t->disks.begin( ) + i-- );
        }
        if ( t->disks.empty( ) ) {
            t->Enabled = false;
        }
    }
}
 
 
void __fastcall TMain::WMDeviceChange( TMessage &Message ) {
   TDateTime dt;
    if ( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000 )
    {
 
        char DiskLabel[MAX_PATH];             //метка диска
        WORD OldErrorMode;                   //отключаем показ ошибок
        AnsiString disk;                    //переменная disk типа  AnsiString
        DWORD dr = GetLogicalDrives( );    // функция возвращает битовую маску
        timer_waits_for_explorer *t_wait_disk = NULL; // это желательно в классе формы, а в ее деструкторе освобождение
        for ( int x = 1; x < 26; x++ ) {  // проходимся циклом по битам
            if ( ( dr >> x ) & 1 ) {     // узнаём значение текущего бита, если единица - диск с номером x есть
                disk = AnsiString( ( char )( 65 + x ) ) + ":\\"; // получаем литеру диска
                OldErrorMode = SetErrorMode( SEM_FAILCRITICALERRORS ); // убираем показ ошибок
                bool ready = DirectoryExists(disk); // пытаемcя открыть корневую директорию
                if (ready)
                {
                       handle_disk( disk );
                    }
                         else
 
                {
                    if ( ! t_wait_disk ) {
 
                       t_wait_disk = new timer_waits_for_explorer( this );
                        t_wait_disk->OnTimer = &execute_t_wait_disk;
                    }
                    t_wait_disk->set_disk_and_start( disk );
                }
            }
        }
    }
    if( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8004 )  //ловим отключение
    {
        dt = Now( );       // полный формат даты
        Log->Lines->Add(Label24->Caption + "\\"+ Label21->Caption + " |  " +  DateTimeToStr(dt) + "  | " + " USB-накопитель отключен");  //в отчёт отключение
        Main->Caption=( "Flash Cleaner - "+ TimeToStr(dt) +
                        "  | " + " USB-накопитель отключен" );     //указываем в Лог время,дату, имя диска.
        Button1Click(0) ;               //обновление дерева
        Edit1->Clear();               //очищаем Edit1
    }
}
//---------------------------------------------------------------------------
*.H

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
private:    // User declarations
void virtual __fastcall WMDeviceChange(TMessage &Message);
public:     // User declarations
 #pragma option push -vi-
BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_DEVICECHANGE,TMessage,WMDeviceChange);
END_MESSAGE_MAP(TForm);
#pragma option pop
class timer_waits_for_explorer
               : public TTimer {
                 public:
    std::vector <AnsiString> disks;
 
    __fastcall timer_waits_for_explorer( TComponent *owner )
                   : TTimer( owner ) {
        Interval = 500;
    };
    void __fastcall set_disk_and_start( AnsiString _disk ) {
        disks.push_back( _disk );
        Enabled = true;
    };
};
void __fastcall handle_disk(AnsiString disk) {
                             char DiskLabel[MAX_PATH];             //метка диска
                             TDateTime dt;
        WORD OldErrorMode;                   //отключаем показ ошибок
        DWORD dr = GetLogicalDrives( );    // функция возвращает битовую маску
                            UINT DriveType = GetDriveType( disk.c_str( ) );  // получаем тип диска
                    if ( (DriveType != DRIVE_CDROM &                // исключаем CDROMы
                            DriveType != DRIVE_FIXED &             // исключаем  HDD
                            DriveType != DRIVE_RAMDISK &          // исключаем  Ram disk
                            DriveType != DRIVE_REMOTE &          //исключаем FDD
                            DriveType != DRIVE_NO_ROOT_DIR &    //исключаем повреждённые диски
                            DriveType != DRIVE_UNKNOWN))       //исключаем неизвестные диски
                    {
                {
                        // для отчета
                        dt = Now( ); // полный формат даты
                        Log->Lines->Add(Label24->Caption + "\\"+ Label21->Caption + " |  " +  DateTimeToStr(dt) +
                                        "  | " + "Подключен накопитель: " "(" + ( disk.SubString(1,2) ) +
                                        ")" + " " + DiskLabel + "" );     //указываем в Лог время,дату, имя диска.
                        Caption=( "Flash Cleaner - "+ TimeToStr(dt) +
                                        "  | " + "Подключен накопитель: " "(" + ( disk.SubString(1,2) ) +
                                        ")" + " " + DiskLabel + "" );     //указываем в Лог время,дату, имя диска.
                        Edit1->Text=disk;           //результат в Edit1
                        if ( Settings->CheckBox5->Checked ) {   //если стоит галочка на  CheckBox
                            Button4->Click( );                  //выполняется Button
                        }
....................}}}}
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.02.2013, 15:11
Полагаю, нужно вести учет уже обработанных томов, так как WM_DEVICECHANGE прилетает для каждого вновь подключенного и у тебя каждый раз идет цикл по всем дискам. Носители, уже подключенные до этого, следует отсекать либо в этом цикле, либо в функции handle_disk().
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
16.02.2013, 16:14  [ТС]
BRcr, а можно не много подробнее...
Вы последняя надежда, в интернете всё глухо
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.02.2013, 17:26
Да просто вести список имен томов - добавлять туда очередное имя после успешной обработки тома, удалять при отключении устройства. При перехвате WM_DEVICECHANGE идти циклом по всем дискам и обрабатывать очередной лишь если его нет в списке обработанных.

Еще ошибку в логике заметил. Фильтр:
C++
1
2
3
4
5
6
if ( (DriveType != DRIVE_CDROM &                // исключаем CDROMы
                            DriveType != DRIVE_FIXED &             // исключаем  HDD
                            DriveType != DRIVE_RAMDISK &          // исключаем  Ram disk
                            DriveType != DRIVE_REMOTE &          //исключаем FDD
                            DriveType != DRIVE_NO_ROOT_DIR &    //исключаем повреждённые диски
                            DriveType != DRIVE_UNKNOWN))       //исключаем неизвестные диски
следует вынести в цикл обхода дисков в обработчике TMain::WMDeviceChange(), чтобы не вызывать функцию handle_disk() и не стартовать таймер для дисков, флешками не являющихся.
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
16.02.2013, 20:53  [ТС]
BRcr, и подключил 1 диск H. диск С/D это HDD не знаю как тут они появляются....
Code
1
2
3
4
5
6
7
8
9
10
11
12
DDV122-PC\DDv122 |  16.02.2013 19:52:35  | Подключен накопитель: (C:) 
DDV122-PC\DDv122 |  16.02.2013 19:52:35  - Удалён ярлык: H:\autorun.inf, Размер: 26 Байт
DDV122-PC\DDv122 |  16.02.2013 19:52:35  | Защита уже установлена на диск: (H:)
1
DDV122-PC\DDv122 |  16.02.2013 19:52:35  | Подключен накопитель: (D:) 
DDV122-PC\DDv122 |  16.02.2013 19:52:35  - Удалён ярлык: H:\autorun.inf, Размер: 26 Байт
DDV122-PC\DDv122 |  16.02.2013 19:52:35  | Защита уже установлена на диск: (H:)
1
DDV122-PC\DDv122 |  16.02.2013 19:52:35  | Подключен накопитель: (H:) A3cam
DDV122-PC\DDv122 |  16.02.2013 19:52:35  - Удалён ярлык: H:\autorun.inf, Размер: 26 Байт
DDV122-PC\DDv122 |  16.02.2013 19:52:35  | Защита уже установлена на диск: (H:)
1
код
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
 if ( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000 )
    {
        char DiskLabel[MAX_PATH];             //ìåòêà äèñêà
        AnsiString disk;                    //ïåðåìåííàÿ disk òèïà  AnsiString
        char drive_fat[30];                //ìàêñèìóì 30 ñèìâîëîâ
        DWORD dr = GetLogicalDrives( );   // ôóíêöèÿ âîçâðàùàåò áèòîâóþ ìàñêó
        WORD OldErrorMode;
        timer_waits_for_explorer *t_wait_disk = NULL; // ýòî æåëàòåëüíî â êëàññå ôîðìû, à â åå äåñòðóêòîðå îñâîáîæäåíèå
        for ( int x = 1; x < 26; x++ ) {  // ïðîõîäèìñÿ öèêëîì ïî áèòàì
            if ( ( dr >> x ) & 1 ) {     // óçíà¸ì çíà÷åíèå òåêóùåãî áèòà, åñëè åäèíèöà - äèñê ñ íîìåðîì x åñòü
                disk = AnsiString( ( char )( 65 + x ) ) + ":\\"; // ïîëó÷àåì ëèòåðó äèñêà
                OldErrorMode = SetErrorMode( SEM_FAILCRITICALERRORS ); // óáèðàåì ïîêàç îøèáîê
                WORD OldErrorMode;                   //îòêëþ÷àåì ïîêàç îøèáîê
                DWORD dr = GetLogicalDrives( );    // ôóíêöèÿ âîçâðàùàåò áèòîâóþ ìàñêó
                UINT DriveType = GetDriveType( disk.c_str( ) );  // ïîëó÷àåì òèï äèñêà
                if ((DriveType != DRIVE_CDROM &                // èñêëþ÷àåì CDROMû
                        DriveType != DRIVE_FIXED &             // èñêëþ÷àåì  HDD
                        DriveType != DRIVE_RAMDISK &          // èñêëþ÷àåì  Ram disk
                        DriveType != DRIVE_REMOTE &          //èñêëþ÷àåì FDD
                        DriveType != DRIVE_NO_ROOT_DIR &    //èñêëþ÷àåì ïîâðåæä¸ííûå äèñêè
                        DriveType != DRIVE_UNKNOWN))       //èñêëþ÷àåì íåèçâåñòíûå äèñêè
                    GetVolumeInformation( disk.c_str(),0,0,0,0,0,drive_fat,sizeof(drive_fat));
                    bool ready = DirectoryExists(disk); // ïûòàåìcÿ îòêðûòü êîðíåâóþ äèðåêòîðèþ
                if (ready && drive_fat!="?Wi")
                {
                    handle_disk( disk );
                    Log->Lines->Add("1");
                }
                else
                {
                    if ( ! t_wait_disk ) {
                        t_wait_disk = new timer_waits_for_explorer( this );
                        t_wait_disk->OnTimer = &execute_t_wait_disk;
                    }
                    t_wait_disk->set_disk_and_start( disk );
                }
            }
        }
    }
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.02.2013, 20:57
Это полный ппц... ты трое суток не спал что ли?

Указатель t_wait_disk нельзя объявлять локально - каждый раз создается новый экземпляр класса таймера.
Флажок ready вообще ставится вне тела цикла... полный бред. OldErrorMode переобъявляется, да и не используется в дальнейшем вовсе. GetLogicalDrives( ) излишне вызывается в теле цикла.

Код писать следует в трезвом виде, все-таки применяя уже имеющиеся познания, а не тыкая пальцем в небо.
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
16.02.2013, 21:00  [ТС]
BRcr, я как раз только это понял....уже исправил
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.02.2013, 21:04
Неправильно применяешь фильтр по типам дисков. Не логичнее ли было бы так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
                if ((DriveType != DRIVE_CDROM &                // исключаем CDROMы
                        DriveType != DRIVE_FIXED &             // исключаем  HDD
                        DriveType != DRIVE_RAMDISK &          // исключаем  Ram disk
                        DriveType != DRIVE_REMOTE &          //исключаем FDD
                        DriveType != DRIVE_NO_ROOT_DIR &    //исключаем повреждённые диски
                        DriveType != DRIVE_UNKNOWN))       //исключаем неизвестные диски
                {       
                        bool ready = DirectoryExists(disk); // пытаемcя открыть корневую директорию
                        if (ready)
                        {
                            handle_disk( disk );
                            Log->Lines->Add("1");
                        }
                        else
                        {
                            if ( ! t_wait_disk ) {
                                t_wait_disk = new timer_waits_for_explorer( this );
                                t_wait_disk->OnTimer = &execute_t_wait_disk;
                            }
                            t_wait_disk->set_disk_and_start( disk );
                        }
                }
И зачем нужна строчка drive_fat?
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
16.02.2013, 22:18  [ТС]
BRcr,
Цитата Сообщение от BRcr Посмотреть сообщение
И зачем нужна строчка drive_fat?
Это мои эксперименты, что бы исключить картридеры, когда был накосячил с
C++
1
 bool ready
Цитата Сообщение от BRcr Посмотреть сообщение
Да просто вести список имен томов - добавлять туда очередное имя после успешной обработки тома, удалять при отключении устройства. При перехвате WM_DEVICECHANGE идти циклом по всем дискам и обрабатывать очередной лишь если его нет в списке обработанных.
Осталось это
Так всё работает

Добавлено через 9 минут
C++
1
 timer_waits_for_explorer *t_wait_disk = NULL; // это желательно в классе формы, а в ее деструкторе освобождение
И куда это нужно размещать?правильно....

Добавлено через 26 минут
Как я понял:

В итоге должно быть 3 списка:
1) подключенные при запуске программы
2) обновленный список при отключении флэшки
3) только что подключенные

Запускаю программу . пишу флэшки в 1 список
Отключаю флэшку . 1 минус 2 список
Подключаю флэшку. 1 минус 3 список и результат в 1 список
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.02.2013, 23:05
Цитата Сообщение от Ddv122 Посмотреть сообщение
И куда это нужно размещать?правильно....
В объявление класса формы, как я и советовал изначально. Чем слушал... пардон, читал?
Цитата Сообщение от Ddv122 Посмотреть сообщение
В итоге должно быть 3 списка:
Верно. Хранить и обновлять имеет смысл лишь первый из них, остальные создаются локально для поиска отличий. На самом деле, локально создавать именно списки и ни к чему, достаточно искать очередной элемент в хранимом списке.
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
16.02.2013, 23:13  [ТС]
BRcr,
Цитата Сообщение от BRcr Посмотреть сообщение
В объявление класса формы
Я везде уже перепробовал везде ошибку выдаёт компилятор....
Цитата Сообщение от BRcr Посмотреть сообщение
создаются локально
а как это...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.02.2013, 11:40
Какую ошибку-то? undefined symbol?
Локально - значит в относительно ограниченной области видимости, например, в теле метода. В то же время, срок жизни локальной переменной может не ограничиваться временем выполнения метода, т.к. можно ее объявить как static...
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
17.02.2013, 12:36  [ТС]
BRcr,
Ошибка эта.
Может ещё подскажите по такому поводу...флэшки обрабатывать в потоке
т.к часто бывают подвисания...
Стоит ли?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
17.02.2013, 14:17
Цитата Сообщение от Ddv122 Посмотреть сообщение
Ошибка эта.
Размести до объявления класса формы либо объявление класса timer_waits_for_explorer, либо его прототип.
Цитата Сообщение от Ddv122 Посмотреть сообщение
флэшки обрабатывать в потоке
Неплохая идея, почему нет? Подвисать главный поток уже не будет. Только тут два момента - необходимо со всей тщательностью отнестись к синхронизации действий потоков и еще подумать, насколько это в программе необходимо, т.к. переписывать и отлаживать придется довольно много.
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
17.02.2013, 14:26  [ТС]
BRcr, а если как то так...
или я не правильно всё делаю....
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void __fastcall TMain::WMDeviceChange( TMessage &Message ) {
 
 if ( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000 )
    {
 
            MyThread1 = new TMyThread(True );
            MyThread1->Resume();
           }
 
 if( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8004 )  //ловим отключение
    {
//2 поток
    }
 
}
и поток

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
61
62
63
__fastcall TMyThread::TMyThread(bool CreateSuspended)
    : TThread(CreateSuspended)
{
    FreeOnTerminate =true;
}
 
//---------------------------------------------------------------------------
 
void __fastcall TMyThread::execute_t_wait_disk( TObject *Sender ) {
    timer_waits_for_explorer *t = dynamic_cast <timer_waits_for_explorer *> ( Sender );
    for ( size_t i = 0; i < t->disks.size( ); ++i ) {
        if ( t->disks[i].IsEmpty( ) ) {
            t->disks.erase( t->disks.begin( ) + i-- );
        }
        else if ( DirectoryExists( t->disks[i] ) ) {
            handle_disk( t->disks[i] );
            t->disks.erase( t->disks.begin( ) + i-- );
        }
        if ( t->disks.empty( ) ) {
            t->Enabled = false;
        }
    }
}
 
void __fastcall TMyThread::Execute()
{
        timer_waits_for_explorer *t_wait_disk = NULL; // это желательно в классе формы, а в ее деструкторе освобождение
        char DiskLabel[MAX_PATH];             //метка диска
        AnsiString disk;                    //переменная disk типа  AnsiString
        WORD OldErrorMode;                   //отключаем показ ошибок
        DWORD dr = GetLogicalDrives( );    // функция возвращает битовую маску
        for ( int x = 1; x < 26; x++ ) {  // проходимся циклом по битам
            if ( ( dr >> x ) & 1 ) {     // узнаём значение текущего бита, если единица - диск с номером x есть
                disk = AnsiString( ( char )( 65 + x ) ) + ":\\"; // получаем литеру диска
                OldErrorMode = SetErrorMode( SEM_FAILCRITICALERRORS ); // убираем показ ошибок
                UINT DriveType = GetDriveType( disk.c_str( ) );  // получаем тип диска
                 if ((DriveType != DRIVE_CDROM &                // исключаем CDROMы
                        DriveType != DRIVE_FIXED &             // исключаем  HDD
                        DriveType != DRIVE_RAMDISK &          // исключаем  Ram disk
                        DriveType != DRIVE_REMOTE &          //исключаем FDD
                        DriveType != DRIVE_NO_ROOT_DIR &    //исключаем повреждённые диски
                        DriveType != DRIVE_UNKNOWN))       //исключаем неизвестные диски
                {
                        bool ready = DirectoryExists(disk); // пытаемcя открыть корневую директорию
                        if (ready)
                        {
                          ShowMessage(disk);
                            handle_disk( disk );
                            Application->ProcessMessages();
                        }
                        else
                        {
                            if ( ! t_wait_disk ) {
                                t_wait_disk = new timer_waits_for_explorer( 0 );
                                t_wait_disk->OnTimer = &execute_t_wait_disk;
                            }
                            t_wait_disk->set_disk_and_start( disk );
                        }
                }
        }
 
    }
}
ну и синхронизация будет то что handle_disk

Или я всё не правильно делаю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.02.2013, 14:26
Помогаю со студенческими работами здесь

У кого-то есть идея каким образом можно такое реализовать?
Доброго дня уважаемое сообщество. Подскажите пожалуйста, как можно сделать сайт с одной страницей, но на которой есть меню, по клику на...

Каким компонентом можно показать время?
Каким компонентом в C# можно показать време например (08:00 до 14:00)

Каким компонентом можно сделать вот такую сетку
Каким компонентом можно сделать вот такую сетку в delphi.

Каким компонентом joomla 1.5 можно создать такую таблицу?
Пожалуйста помогите!!

Можно ли такое реализовать?
А можно ли сделать такое же ток с числами которые введёт пользователь? С числом разрешается производить только два действия: умножать на...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru