Помогите с тестированием компонента
Я написал компонент (сорцы далее) для действий завершения работы Windows
(ф-я ExitWindowsEx). Enumerated свойство EMode - режим завершения(выключение,
перезагрузка и т.п.) и метод WinEx - завершение работы в зависимости от
EMode . Компонент вроде работает, и свойство в ObjectInspector-e выбирается, но не
запоминаетс и при выборе разных значений свойства при работе компонента выбирается
первое в enum (т.е.LOGOFF) . Помогите, срочно нужно! Где ошибка? Вроде всё делал как в хелпе и книгах, но я только изучаю написание компонент. BCB v 5.0 . И вообще-где можно почитать ( книги и Инет) о разработке компонент, чтобы было толково и с примерами.
P.S. Как компоненту добавить обработчик события на WM_QUERYENDSESSION .
Заранее благодарен за ответы!!!
// winexit.cpp
#include <vcl.h>
#pragma hdrstop
#include "WinExit.h"
#pragma package(smart_init)
static inline void ValidCtrCheck(TWinExit *)
{
new TWinExit(NULL);
}
__fastcall TWinExitTWinExit(TComponent* Owner)
TComponent(Owner)
{ FMode=Sel(REBOOT);
}
void __fastcall TWinExitSetMode(Sel Value)
{
if(Value!=FMode)
FMode=Sel(Value);
}
void __fastcall TWinExitWinEx(void)
{ switch ( EMode)
{ case REBOOT ExitWindowsEx (EWX_REBOOT,0); break;
case LOGOFF ExitWindowsEx (EWX_LOGOFF,0); break;
case POWEROFF ExitWindowsEx (EWX_POWEROFF,0); break;
case SHUTDOWN ExitWindowsEx (EWX_SHUTDOWN,0); break; }
}
namespace Winexit
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TWinExit)};
RegisterComponents("MyCompon", classes, 0);
}
}
// winexit.h
#ifndef WinExitH
#define WinExitH
#include <SysUtils.hpp>
#include <Controls.hpp>
#include <Classes.hpp>
#include <Forms.hpp>
#include <windef.h>
#include <winuser.h>
enum Sel {LOGOFF, POWEROFF, REBOOT, SHUTDOWN };
class PACKAGE TWinExit public TComponent
{
private
Sel FMode;
protected
public void __fastcall SetMode (Sel Value);
__fastcall TWinExit(TComponent* Owner);
virtual void __fastcall WinEx (void);
__published
__property Sel EMode = {read = FMode, write = SetMode, default=REBOOT, stored=true };
};
#endif
void __fastcall TWinExit::SetMode(Sel Value)
{
if(Value!=FMode)
FMode=Sel(Value);
}
FMode типа Sel и Value того же типа. Почему бы просто не написать: FMode=Value ?
А вообще надо подебаггерить и посмотреть, как себя это значение ведет.