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

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

01.07.2012, 02:31. Показов 7861. Ответов 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
14.07.2012, 19:30  [ТС]
Студворк — интернет-сервис помощи студентам
BRcr, разобрался я..почитал теории...работает..
Только вот...
Как освобождать память?в 2 раза занимает больше теперь памяти...

Цитата Сообщение от BRcr Посмотреть сообщение
timer_waits_for_explorer *t_wait_disk = NULL;
Куда правильней добавлять?
Если так?
C++
1
2
3
4
5
6
7
8
9
void __fastcall TMain::WMDeviceChange( TMessage &Message ) {
    if ( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000 )
    {
        char DiskLabel[MAX_PATH];             //ìåòêà äèñêà
        timer_waits_for_explorer *t_wait_disk = NULL;
        WORD OldErrorMode;                   //îòêëþ÷àåì ïîêàç îøèáîê
        AnsiString disk;                    //ïåðåìåííàÿ disk òèïà  AnsiString
        DWORD dr = GetLogicalDrives( );    // ôóíêöèÿ âîçâðàùàåò áèòîâóþ ìàñêó
        for ( int x = 1; x < 26; x++ ) {  // ïðîõîäèìñÿ öèêëîì ïî áèòàì
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
15.07.2012, 01:07
Ну и где вы ее выделяете?

Добавлено через 5 минут
Можно уменьшить размер процесса в памяти.
Программа разрастается
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
15.07.2012, 01:29  [ТС]
LK, я видел этот код, но как грамотно реализовать то?На таймер вешать, иль ещё как можно?
Цитата Сообщение от LK Посмотреть сообщение
Ну и где вы ее выделяете?
не понял, что выделяю?
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
15.07.2012, 01:33
C++
1
2
3
4
for(int x=1;x<26;x++) { // проходимся циклом по битам
// истчо куча непонятного кода
//...
ProcessReduceMemory();
например
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
15.07.2012, 01:50  [ТС]
LK, это то всё хорошо, но при использовании кода от BRcr размер памяти потребляемой выросло почти в 3 раза, около 20 мб...
Цитата Сообщение от LK Посмотреть сообщение
например
а я поставил при разворачивании с трея..
C++
1
2
3
4
5
6
7
void __fastcall TMain::TrayIcon1Restore(TObject *Sender)
{
    ShowWindow( Handle, SW_SHOW );      //âîñòàíàâëèâàåì îêíî
    ShowWindow( Application->Handle, SW_SHOW );  //âîñòàíàâëèâàåì îêíî
    Application->ShowMainForm = true;  //âîñòàíàâëèâàåì îêíî
    ProcessReduceMemory();
    }
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
15.07.2012, 02:12
Ddv122, а смысл при разворачивании из трея, если у вас основная работа WMDeviceChange ? Намусорили - подмели, я так понимаю.
Шо такое "код BRcr" понятия не имею.

Добавлено через 1 минуту
Или наоборот, почистить память при сворачивании программы, т.е., когда активных действий не предполагается и зря занимать память смысла нет.

Добавлено через 42 секунды
Да хоть при каждом телодвижении, ваапчета.
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
15.07.2012, 17:38  [ТС]
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
class timer_waits_for_explorer
               : public TTimer {
public:
    AnsiString disk;
    __fastcall timer_waits_for_explorer( TComponent *owner )
                   : TTimer( owner ) {
        Interval = 500;
    };
    void __fastcall set_disk_and_start( AnsiString _disk ) {
        disk = _disk;
        Enabled = true;
    };
};
// ---------------------------------------------------------------------------
void __fastcall TMain::execute_t_wait_disk( TObject *Sender ) {
    timer_waits_for_explorer *t = dynamic_cast <timer_waits_for_explorer *> ( Sender );
    if ( ! t->disk.IsEmpty( ) ) {
        if ( DirectoryExists( t->disk ) ) {
            TMessage msg;
            msg.Msg = WM_DEVICECHANGE;
            msg.WParam = 0x8000;
            WMDeviceChange( msg );
            t->Enabled = false;
        }
    }
    else {
        t->Enabled = false;
    }
}
// ---------------------------------------------------------------------------
// ...
timer_waits_for_explorer *t_wait_disk = NULL; // это желательно в классе формы, а в ее деструкторе освобождение
// ...
// ---------------------------------------------------------------------------
void __fastcall TMain::WMDeviceChange( TMessage &Message ) {
    if ( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000 )
    {
        // ...
        for ( int x = 1; x < 26; x++ ) {
            if ( ( dr >> x ) & 1 ) {
                // ...
                if ( ready )
                {
                    // ...
                }
                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 );
                }
            }
        }
    }
    // ...
 }
Вот в этом коде....

Добавлено через 7 часов 19 минут
Заметил баги в этом коде
если подключена флэшка в пк и подключаем другую, программа зависает на 5 секунд
В лог копируется по 2 - 3 раза одно и тоже...
ну и размер памяти увеличивается
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
15.07.2012, 17:49
Цитата Сообщение от Ddv122 Посмотреть сообщение
если подключена флэшка в пк и подключаем другую, программа зависает на 5 секунд
В лог копируется по 2 - 3 раза одно и тоже...
Дык, давно заметил, думал, фича такая .

Добавлено через 1 минуту
Видимо, не подвисает, а думает, а обработки думания нет.
Ну и логично, что добавляет, поскольку, видимо, код добавления у вас есть, а проверки на предмет наличия аналогичных строк - нет, что не смертельно, имхо.
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
15.07.2012, 18:13  [ТС]
LK, вот такой вот лог) флэшка вставлена 1 раз)
C++
1
2
3
4
5
6
7
8
9
MICROSO-A2HC8V9\DDv122 |  15.07.2012 17:12:25  | Подключен накопитель: (G:) A3cam
MICROSO-A2HC8V9\DDv122 |  15.07.2012 17:12:25  | Альтернативная защита ранее была скопирована на диск: (G:)
MICROSO-A2HC8V9\DDv122 |  15.07.2012 17:12:25  | Подключен накопитель: (G:) A3cam
MICROSO-A2HC8V9\DDv122 |  15.07.2012 17:12:25  | Альтернативная защита ранее была скопирована на диск: (G:)
MICROSO-A2HC8V9\DDv122 |  15.07.2012 17:12:25  | Подключен накопитель: (G:) A3cam
MICROSO-A2HC8V9\DDv122 |  15.07.2012 17:12:26  | Альтернативная защита ранее была скопирована на диск: (G:)
MICROSO-A2HC8V9\DDv122 |  15.07.2012 17:12:26  | Открыт диск: (G:)
MICROSO-A2HC8V9\DDv122 |  15.07.2012 17:12:26  | Открыт диск: (G:)
MICROSO-A2HC8V9\DDv122 |  15.07.2012 17:12:26  | Открыт диск: (G:)
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
15.07.2012, 18:24
Ну и я шас все брошу и начну гадать это у вас таймер глючит или где...

Добавлено через 1 минуту
по ходу
запускаю программу - флешка не подключна
Code
1
2
3
4
5
6
7
Утилита Flash Cleaner
lala\fafa |  13.07.2012 18:41:54  | Подключен накопитель: (L:) MINIPE
lala\fafa |  13.07.2012 18:42:00  | Защита уже установлена на диск: (L:)
lala\fafa |  13.07.2012 19:02:39  | Подключен накопитель: (L:) MINIPE
lala\fafa |  13.07.2012 19:02:40  | Защита уже установлена на диск: (L:)
lala\fafa |  13.07.2012 19:32:56  | Подключен накопитель: (L:) MINIPE
lala\fafa |  13.07.2012 19:32:59  | Защита уже установлена на диск: (L:)
Добавлено через 1 минуту
Подключаю флешку.
К стати, программа при этом не висит, таки действительно думает, что хорошо. Думающая программа - это всегда - хорошо .
Ну и фишка:
Code
1
2
3
4
5
6
7
8
9
10
Утилита Flash Cleaner
lala\fafa |  13.07.2012 18:41:54  | Подключен накопитель: (L:) MINIPE
lala\fafa |  13.07.2012 18:42:00  | Защита уже установлена на диск: (L:)
lala\fafa |  13.07.2012 19:02:39  | Подключен накопитель: (L:) MINIPE
lala\fafa |  13.07.2012 19:02:40  | Защита уже установлена на диск: (L:)
lala\fafa |  13.07.2012 19:32:56  | Подключен накопитель: (L:) MINIPE
lala\fafa |  13.07.2012 19:32:59  | Защита уже установлена на диск: (L:)
Подключение флешки
lala\fafa |  15.07.2012 17:22:20  | Подключен накопитель: (L:) MINIPE
lala\fafa |  15.07.2012 17:22:23  | Защита уже установлена на диск: (L:)
0
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
15.07.2012, 18:28  [ТС]
LK, я же и говорю всё так с этим вот кодом
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
class timer_waits_for_explorer
               : public TTimer {
public:
    AnsiString disk;
    __fastcall timer_waits_for_explorer( TComponent *owner )
                   : TTimer( owner ) {
        Interval = 500;
    };
    void __fastcall set_disk_and_start( AnsiString _disk ) {
        disk = _disk;
        Enabled = true;
    };
};
// ---------------------------------------------------------------------------
void __fastcall TMain::execute_t_wait_disk( TObject *Sender ) {
    timer_waits_for_explorer *t = dynamic_cast <timer_waits_for_explorer *> ( Sender );
    if ( ! t->disk.IsEmpty( ) ) {
        if ( DirectoryExists( t->disk ) ) {
            TMessage msg;
            msg.Msg = WM_DEVICECHANGE;
            msg.WParam = 0x8000;
            WMDeviceChange( msg );
            t->Enabled = false;
        }
    }
    else {
        t->Enabled = false;
    }
}
// ---------------------------------------------------------------------------
// ...
timer_waits_for_explorer *t_wait_disk = NULL; // это желательно в классе формы, а в ее деструкторе освобождение
// ...
// ---------------------------------------------------------------------------
void __fastcall TMain::WMDeviceChange( TMessage &Message ) {
    if ( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000 )
    {
        // ...
        for ( int x = 1; x < 26; x++ ) {
            if ( ( dr >> x ) & 1 ) {
                // ...
                if ( ready )
                {
                    // ...
                }
                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
15.07.2012, 21:00
Проблема по невнимательности была упущена мной. Я ж не тестировал код.

Это ж очевидно. В обработчике devicechange идет обход циклом всех накопителей. И, что критично, здесь же происходит обработка каждого отдельного накопителя. Это неверный подход. Если на каком-то из них DirectoryExists() возвращает false, запускается таймер на проверку этого накопителя, затем на срабатывании таймера опять вызывается WMDeviceChange и опять идет обход всех циклом и опять по кругу.
Дополнительно к этому при проходе цикла может получиться так, что DirectoryExists() даст отмашку на двух или более накопителях. В этом случае, если таймер уже работает по предыдущему, то будет подменен объект проверки и при следующем ontimer будет проверяться уже подмененный объект, что не есть верно.
Косяки с памятью, видать, тоже отсюда откуда-то растут.

Я ж говорил изначально - решение сырое, надо подгонять.
На вскидку, первое - следует разнести обход накопителей и обработку каждого по отдельным методам, чтобы в таймере уже вызывать метод обработки одного конкретного накопителя, а не запускать опять цикл. Второе - завести в таймере вместо переменной disk массив таких переменных, чтоб можно было в него добавлять объекты проверки, ничего не подменяя.
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
30.10.2012, 23:35  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
На вскидку, первое - следует разнести обход накопителей и обработку каждого по отдельным методам, чтобы в таймере уже вызывать метод обработки одного конкретного накопителя, а не запускать опять цикл. Второе - завести в таймере вместо переменной disk массив таких переменных, чтоб можно было в него добавлять объекты проверки, ничего не подменяя.
А можно не много подробнее??
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
31.10.2012, 22:50
Вот это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   // пытаемcя открыть корневую директорию
                    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))       //исключаем неизвестные диски
                    {
                    
                        Edit1->Text=disk;           //результат в Edit1
                        Button1Click(0) ;          //обновляем drevo
                        if ( Settings->CheckBox5->Checked ) {   //если стоит галочка на  CheckBox
                            Button4->Click( );                  //выполняется Button
                        }
в отдельный метод, скажем, по имени handle_disk(AnsiString disk). В обработчике WMDeviceChange вызываем, что логично, вот так:
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
void __fastcall TMain::WMDeviceChange( TMessage &Message ) {
    if ( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000 )
    {
        // ...
        for ( int x = 1; x < 26; x++ ) {
            if ( ( dr >> x ) & 1 ) {
                // ...
                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 );
                }
            }
        }
    }
    // ...
 }
А таймер соответственно переписываем вот так:
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
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 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;
        }
    }
}
Таким нехитрым образом мы отучаем таймер вызывать цикл обхода всех накопителей при наступлении готовности целевого.
Попутно я еще добавил множественное отслеживание дисков. Правда, не гарантирую отсутствие мелких косячков, код я не отлаживал.
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
01.11.2012, 11:18  [ТС]
спасибо.
Все работает, но проблема решена на 50%...
Подключаю телефон там 2 флэшки.
В програме в отчет идет 3 подключения почему то.
Как бы 1 флэшка, 2 флэшка, и 1 флэшка еще раз.хоть подключено 2.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
01.11.2012, 15:00
Три раза вызывается set_disk_and_start() или таймер неправильно отрабатывает?
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
01.11.2012, 20:01  [ТС]
BRcr, А логе
Code
1
2
3
4
5
6
7
8
9
01.11.2012 18:50:50  |  USB-накопитель отключен
01.11.2012 18:51:00  | Подключен накопитель: (F:) 
01.11.2012 18:51:00  | Подключен накопитель: (F:) 
01.11.2012 18:51:00  | Подключен накопитель: (J:) 
01.11.2012 18:57:04  |  USB-накопитель отключен
01.11.2012 18:57:07  | Подключен накопитель: (F:) 
01.11.2012 18:57:08  | Подключен накопитель: (K:) EnDi
01.11.2012 18:57:08  | Подключен накопитель: (F:) 
01.11.2012 19:03:42  |  USB-накопитель отключен
А код такой Cpp
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
void __fastcall TForm1::WMDeviceChange( TMessage &Message ) {
    if ( Message.Msg == WM_DEVICECHANGE && Message.WParam == 0x8000 )
    {
        timer_waits_for_explorer *t_wait_disk = NULL; // это желательно в классе формы, а в ее деструкторе освобождение
        WORD OldErrorMode;                   //отключаем показ ошибок
        AnsiString disk;                    //переменная disk типа  AnsiString
        DWORD dr = GetLogicalDrives( );    // функция возвращает битовую маску
        for ( int x = 1; 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
                {
                    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( );       // полный формат даты
        redtLog->Lines->Add(DateTimeToStr(dt) + "  | " + " USB-накопитель отключен");  //в отчёт отключение
}}
и код 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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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) {
 
                   // пытаем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");
                        }}
 
// ---------------------------------------------------------------------------
void __fastcall TForm1::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;
        }
    }
}
                        }}
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
01.11.2012, 23:29
Клево, только все это не дает ответа на мой вопрос. Смотри трассировщиком, где лишний вызов handle_disk() происходит.
1
Почемучка)
 Аватар для Ddv122
1244 / 304 / 30
Регистрация: 23.12.2010
Сообщений: 2,001
Записей в блоге: 1
08.11.2012, 00:45  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
. Смотри трассировщиком, где лишний вызов handle_disk() происходит.
А как...??
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
08.11.2012, 08:29
Ставь breakpoints на вызов set_disk_and_start() и handle_disk(), смотри, где и сколько раз они вызываются.
Как же ты до сих пор писал? Как отлаживал?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.11.2012, 08:29
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru