C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Button
Sweta
  Отправлено: 22.04.2004, 11:16


Не зарегистрирован







Hello!!! Как сделать, чтобы кнопка нажималась только один раз?
olegenty
Отправлено: 22.04.2004, 11:20


Ветеран

Группа: Модератор
Сообщений: 2412



в смысле? Ну в OnClick напиши Button->Enabled = false. или я что-то недопонял?
Admin
Отправлено: 22.04.2004, 15:06


Владимир

Группа: Администратор
Сообщений: 1190



или Button->Visible = false;
чтобы она вообще исчезла после клика
Valdemar
Отправлено: 22.04.2004, 16:32


Мастер участка

Группа: Участник
Сообщений: 433



А чтобы уж наверяка, то еще и удалить кнопку biggrin.gif
Asher
Отправлено: 22.04.2004, 17:29


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Тоже по участвую biggrin.gif

в обработчике кнопки
вариант 1:
Application->MainForm->Close();
вариант 2:
ExitWindowsEx(EWX_REBOOT, 0);

Отредактировано Asher — 22/04/2004, 19:31
Doga
Отправлено: 22.04.2004, 21:04


Мастер участка

Группа: Участник
Сообщений: 575



Тут токо спроси — тебе такого насоветуют! biggrin.gif biggrin.gif biggrin.gif
marconi
Отправлено: 22.04.2004, 21:15


Станционный диспетчер

Группа: Участник
Сообщений: 86



QUOTE (Asher @ 22/04/2004, 18:31)

вариант 2:
ExitWindowsEx(EWX_REBOOT, 0);

Заодно и я спрошу. А как перезагрузить сразу как бы нажали "Reset",
или с ХР такой вариант не проходит? wink.gif
Gedeon
Отправлено: 23.04.2004, 08:49


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (marconi @ 22/04/2004, 22:17)
Заодно и я спрошу. А как перезагрузить сразу как бы нажали "Reset",
или с ХР такой вариант не проходит? wink.gif

Проходит, только так, чтобы как бы нажали кнопку Reset вам одних программных средств будет недостаточно, тут нужна еще аппаратная часть, которая через какой-то порт получает команду, а там напротив кнопки Reset стоит прилада, которая ее нажимает. biggrin.gif
Ну а если серьезно, чтобы перезагрузить нужно получить привелегии:
Вот код выключения:
CODE

   HANDLE hToken;
   TOKEN_PRIVILEGES tkp; // Get a token for this process.
   OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
   LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
   tkp.PrivilegeCount = 1; // one privilege to set
   tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
   AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
   if (GetLastError() != ERROR_SUCCESS);
   if (!ExitWindowsEx(EWX_FORCE|    HANDLE hToken;
   TOKEN_PRIVILEGES tkp; // Get a token for this process.
   OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
   LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
   tkp.PrivilegeCount = 1; // one privilege to set
   tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
   AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
   if (GetLastError() != ERROR_SUCCESS);
   if (!ExitWindowsEx(EWX_FORCE|EWX_POWEROFF, NULL))
       Application->MessageBox("Не удалось выключить компьютер","Ошибка",MB_ICONERROR|MB_OK);
, NULL))
       Application->MessageBox("Не удалось выключить компьютер","Ошибка",MB_ICONERROR|MB_OK);

Для перезагрузки нужно EWX_POWEROFF заменить на EWX_REBOOT
marconi
Отправлено: 23.04.2004, 14:43


Станционный диспетчер

Группа: Участник
Сообщений: 86



Спасибо, попробую. smile.gif
Иван
Отправлено: 23.04.2004, 19:59


Машинист паровоза

Группа: Участник
Сообщений: 207



Бедная Света! biggrin.gif biggrin.gif biggrin.gif
marconi
Отправлено: 23.04.2004, 21:09


Станционный диспетчер

Группа: Участник
Сообщений: 86



Зато с кнопкой познакомились полностью.
marconi
Отправлено: 24.04.2004, 19:29


Станционный диспетчер

Группа: Участник
Сообщений: 86



QUOTE (Gedeon @ 23/04/2004, 09:51)

Ну а если серьезно, чтобы перезагрузить нужно получить привелегии:
Вот код выключения:
CODE

HANDLE hToken;
TOKEN_PRIVILEGES tkp; // Get a token for this process.
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS);
if (!ExitWindowsEx(EWX_FORCE| HANDLE hToken;
TOKEN_PRIVILEGES tkp; // Get a token for this process.
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS);
if (!ExitWindowsEx(EWX_FORCE|EWX_POWEROFF, NULL))
Application->MessageBox("Не удалось выключить компьютер","Ошибка",MB_ICONERROR|MB_OK);
, NULL))
Application->MessageBox("Не удалось выключить компьютер","Ошибка",MB_ICONERROR|MB_OK);

Для перезагрузки нужно EWX_POWEROFF заменить на EWX_REBOOT

Все прекрасно работает и перезагрузка и выключение.Только зачем код 2 раза.
Да и эта перезагрузка доволно корректная с завершением всех приложений.
Gedeon
Отправлено: 27.04.2004, 08:45


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (marconi @ 24/04/2004, 20:31)
Все прекрасно работает и перезагрузка и выключение.Только зачем код 2 раза.

Да хрен его как-то случайно получилось. Надо 1 раз.

Вернуться в Вопросы программирования в C++Builder