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

 
QReport
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 &&
и далее — другое название формы или её компонентов.
Метод можно применять для перехватывание кнопок чужих форм.

Вернуться в Работа с базами данных в C++Builder