Smile |
Отправлено: 14.05.2004, 11:44 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 13
|
Может кто-нибудь подсказать можно ли перехватывать события нажатия на кнопки в заголовке QReport'а (сохранение, загрузка, печать, следующая страница...)? |
|
AVC |
Отправлено: 19.05.2004, 14:06 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Спасибо за толчок (в смысле подталкивания) давно чесались руки поковыряться. У меня получилось так (код совсем сырой, буду благодарен за любые замечания):
Fmain.c
(Win2000, Builder5)
CODE |
//-------
TControl* __fastcall AxControlByName (TControl* pctl, const AnsiString &pname)
{
if (!pctl) return NULL;
AnsiString name = pname.Trim().UpperCase();
if (name.IsEmpty()) return NULL;
AnsiString str = pctl->Name.Trim().UpperCase();
if (!str.IsEmpty() && str == name) return pctl;
TwinControl *wctl = dynamic_cast<TWinControl*>(pctl);
if (!wctl) return NULL;
Tcontrol *ctl = NULL;
for (int i=0; i < wctl->ControlCount; i++)
{ ctl = AxControlByName(wctl->Controls[i], pname);
if (ctl) break;
}
return ctl;
}
//========
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
FOldAppMessage = Application->OnMessage;
FQRPControls = new TList();
}
//-------
__fastcall TForm1::~TForm1(void)
{
TMyControl *ctl;
for (int i=0; i < FQRPControls->Count; i++)
{ ctl = (TMyControl*)FQRPControls->Items[i];
delete ctl;
}
FQRPControls->Clear();
delete FQRPControls;
}
//---------
void __fastcall TForm1::QRPTestClick(TObject *Sender)
{
FNeedQRPScan = true;
Application->OnMessage = AppMessage;
try { QRep->QuickRep1->Preview(); }
__finally { Application->OnMessage = FOldAppMessage; }
}
//---------
void __fastcall TForm1::AppMessage (tagMSG &msg, bool &handled)
{
if (msg.message == WM_LBUTTONDOWN && FNeedQRPScan)
{ TForm *frm = Screen->ActiveForm;
if (frm &&
frm->Name.UpperCase().Pos(UpperCase("QRStandardPreview")) == 1 &&
frm->Visible )
{ FNeedQRPScan = false;
TmyControl *ctl;
for (int i=0; i < FQRPControls->Count; i++)
{ ctl = (TMyControl*)FQRPControls->Items[i];
delete ctl;
}
FQRPControls->Clear();
// SetMyClick(frm, "ToolButton1" );
// SetMyClick(frm, "ToolButton2" );
SetMyClick(frm, "ZoomFit" );
SetMyClick(frm, "Zoom100" );
SetMyClick(frm, "ZoomToWidth" );
// SetMyClick(frm, "Separator1" );
SetMyClick(frm, "FirstPage" );
SetMyClick(frm, "PreviousPage" );
SetMyClick(frm, "LastPage" );
// SetMyClick(frm, "Separator2" );
SetMyClick(frm, "PrintSetup" );
SetMyClick(frm, "Print" );
// SetMyClick(frm, "Separator3" );
SetMyClick(frm, "SaveReport" );
SetMyClick(frm, "LoadReport" );
// SetMyClick(frm, "Separator4" );
// SetMyClick(frm, "ExitButton" );
} // frm && ...
} // MouseDown
if (FOldAppMessage) FOldAppMessage(msg, handled);
}
//-----------
void __fastcall TForm1::SetMyClick (TForm *frm, const AnsiString &name)
{
Tcontrol *ctl = AxControlByName(frm, name);
TtoolButton *bt = dynamic_cast<TToolButton*>(ctl);
if (!bt) return;
TmyControl *myctl = new TMyControl(this);
myctl->OnClick = bt->OnClick;
bt->Tag = FQRPControls->Add(myctl);
bt->OnClick = QRPClick;
bt->Caption = name;
}
//-----------
void __fastcall TForm1::QRPClick(TObject *Sender)
{
TtoolButton *bt = dynamic_cast<TToolButton*>(Sender);
if (!bt) return;
ShowMessage(bt->Caption); // Нужная функция до стандартной
TMyControl *myctl = (TMyControl*)FQRPControls->Items[bt->Tag];
if (myctl->OnClick) myctl->OnClick(Sender);
// Нужная функция после стандартной
}
|
Fmain.h
CODE |
class TMyControl : public TControl
{
__published:
__property OnClick;
public:
#pragma option push -w-inl
inline __fastcall virtual TMyControl(Classes::TComponent* AOwner) : TControl(AOwner) { }
inline __fastcall virtual ~TMyControl(void) { }
#pragma option pop
};
//----------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TDatabase *DataBase1;
TDataSource *DataSource1;
TTable *Table1;
TMemo *Memo1;
TButton * QRPTest;
void __fastcall QRPTestClick (TObject *Sender);
private: // User declarations
TMessageEvent FOldAppMessage;
void __fastcall AppMessage (tagMSG &msg, bool &handled);
bool FNeedQRPScan;
void __fastcall SetMyClick (TForm *frm, const AnsiString &name);
void __fastcall QRPClick (TObject *Sender);
TList *FQRPControls;
public: // User declarations
__fastcall TForm1(TComponent* Owner);
__fastcall ~TForm1(void);
};
|
Возможные причины неработоспособности
строка: frm->Name.UpperCase().Pos(UpperCase("QRStandardPreview")) == 1 &&
и далее — другое название формы или её компонентов.
Метод можно применять для перехватывание кнопок чужих форм.
|
|
|