----------------------------Хидер---------------------------------
#ifndef LISTCIRK_RASS_H
#define LISTCIRK_RASS_H
#include <qlistview.h>
#include <qpushbutton.h>
#include <qmainwindow.h>
#include <qapplication.h>
#include "pibd.h"
#include "pgaddrbook.h"
#include "n_webbr.h"
#include "ListView.h"
#include <qaction.h>
#include <qpopupmenu.h>
#include <qdialog.h>
#include <qlineedit.h>
#include <qpushbutton.h>
#include <qmessagebox.h>
#include <qheader.h>
class ListCirkRass : public QMainWindow
{
Q_OBJECT
public:
ListCirkRass (DBHANDLE, int, QString*, N_WebBr*);
~ListCirkRass ();
public slots:
void slot_accept();
void slot_cancel();
void slotPopupMenu (QListViewItem*, const QPoint&, int);
void slotAddNewList ();
void slotAddNewDolj ();
void slotADDNewDolj_continue ();
void slotDelDolj ();
void slotDelList ();
void slotDelAll();
private:
void buildTree ();
void buildTree_2level (QListViewItem*);
QListView* lv;
QListViewItem* myQlvi;
QPushButton* accept;
QPushButton* cancel;
int (*Init_AddrBook)(DBHANDLE);
int (*BuildTree)(QListView, int);
void resizeEvent (QResizeEvent *);
ADDRLIST AddrList;
QString* This_textBr;
N_WebBr* hereWebBr;
DBHANDLE dbh1; //Дескриптор БД
int dolj_num; //Должность ДЛ на АРМ
int num_dolj; //Должность для добавления адресата в список рассылки
myListView* Addr_View;
};
class addList_rass : public QDialog
{
Q_OBJECT
public:
addList_rass (QWidget *parent, char **_Group, int *_Answer);
~addList_rass();
public slots:
void slotOkClicked();
void slotCancelClicked();
private:
QLineEdit *le;
QPushButton *OkBtn, *CancelBtn;
char **Group;
int *Answer;
};
//Потом стал классом исключения не только для SQL (определяется флагом)
class SQL_Exseption
{
public:
SQL_Exseption(char*, int, QString, int);
~SQL_Exseption();
QString myMessage;
int myFlag;
};
int SetParam_intoDoc (QString* const, const QString, const QString, const QString, const bool);
QString Get_full_name_dolj (const int num, const int flag_skl);
#endif
QMessageBox то работает, то нет
В одних местах QMessageBox работает как ему и полагается по справочнику, а в других абсолютно так-же прописанный вызывает падение программы. Каких только не перепробовал вариантов, в том числе пытался подогнать все условия функции где падает под ту функцию где работает.
Смотрели код ещё 2 программиста, не помогли.
Вот код с комментариями работы QMessageBox-а написанных в "блокноте".
Qt 3.3.3
IDE - KDevelop
Код:
Код:
------------------------------------ЦПП-шник-----------------------
#define test
#include "ListCirk_rass.h"
ListCirkRass::ListCirkRass (DBHANDLE dbh, int dolj, QString* text_Br, N_WebBr* WebBr) : QMainWindow(0, 0, Qt::WShowModal)
{
#ifdef test
printf("Внутри конструктора myListCirkRass(), dbh= %d, dolj= %d\n", dbh, dolj);
#endif
This_textBr = text_Br;
hereWebBr = WebBr;
dbh1 = dbh;
dolj_num = dolj;
setCaption(tr("Списки рассылки"));
int x = QApplication::desktop()->width();
int y = QApplication::desktop()->height();
setGeometry(x/2-x/3, y/2-y/3, x/4*2, y/4*2);
setMinimumWidth (500);
QFont font("helvetica_mcbc", 12);
font.setBold(true);
setFont(font);
lv = new QListView (this);
lv->clear();
lv->setGeometry(10, 30, width()-20, height() - 70);
lv->addColumn(tr("name"), -1);
lv->addColumn(tr("num"), -1);
lv->addColumn("dolj_id", -1);
lv->header()->setClickEnabled(false);
lv->header()->hide();
lv->setRootIsDecorated (true);
lv->setSorting(-1);
buildTree ();
accept = new QPushButton(tr("Принять"),this);
accept->setGeometry(width()/2 - 195, height() - 30, 90, 25);
accept->setFont(font);
connect(accept, SIGNAL(clicked()), this, SLOT(slot_accept()));
cancel = new QPushButton(tr("Отмена"),this);
cancel->setGeometry(width()/2 + 105, height() - 30, 90, 25);
cancel->setFont(font);
connect(cancel, SIGNAL(clicked()), this, SLOT(slot_cancel()));
connect(lv, SIGNAL (rightButtonClicked (QListViewItem*, const QPoint&, int)), this, SLOT (slotPopupMenu (QListViewItem*, const QPoint&, int)));
}
ListCirkRass::~ListCirkRass ()
{
}
void ListCirkRass::slot_accept()
{
#ifdef test
printf("Внутри ListCirkRass::slot_accept()\n");
#endif
//Здесь не смотрите, еще этот слот не реализовал
close();
}
void ListCirkRass::slot_cancel()
{
close();
}
void ListCirkRass::slotPopupMenu (QListViewItem* qlvi, const QPoint& p, int col)
{
#ifdef test
printf ("Внутри slotPopupMenu ()\n");
printf ("qlvi= %d, col= %d\n", qlvi, col);
#endif
myQlvi = qlvi;
QPopupMenu *pm;
pm = new QPopupMenu(lv);
pm->setFont(QFont("helvetiva",10));
QAction *AddNew, *AddDolj, *DelDolj, *DelList, *DelAll;
if( col == -1 || (col == 0 && qlvi->parent() == 0) )
{
AddNew = new QAction (tr("Добавить"), tr("Добавить список"), 0, this);
connect(AddNew, SIGNAL(activated()), this, SLOT(slotAddNewList()));
AddNew->addTo(pm);
}
if( col == 0 /*&& qlvi->parent() == 0*/)
{
AddDolj = new QAction (tr("Добавить"), tr("Добавить адресата"), 0, this);
connect(AddDolj, SIGNAL(activated()), this, SLOT(slotAddNewDolj ()));
AddDolj->addTo(pm);
}
if( col == 0 && qlvi->parent() != 0)
{
DelDolj = new QAction (tr("Удалить"), tr("Удалить адресата"), 0, this);
connect(DelDolj, SIGNAL(activated()), this, SLOT(slotDelDolj ()));
DelDolj->addTo(pm);
}
if( col == 0 && qlvi->parent() == 0 )
{
DelList = new QAction (tr("Удалить"), tr("Удалить список"), 0, this);
connect(DelList, SIGNAL(activated()), this, SLOT(slotDelList ()));
DelList->addTo(pm);
}
if( col == -1 && !(col == 0 && qlvi->parent() == 0) )
{
DelAll = new QAction (tr("Удалить"), tr("Удалить всё"), 0, this);
connect(DelAll, SIGNAL(activated()), this, SLOT(slotDelAll()));
DelAll->addTo(pm);
}
pm->popup(p);
}
void ListCirkRass::slotAddNewList ()
{
#ifdef test
printf ("Внутри slotAddNewList ()\n");
#endif
try
{
char *buf = NULL;
int *Answer;
addList_rass *adlr = new addList_rass (this, &buf, Answer);
adlr->exec();
//*Answer == 1 - нажата кнопка "Отмена" ввода названия списка рассылки
if (*Answer == 1)
return;
if ( buf == NULL || strlen(buf) <= 1)
throw (SQL_Exseption ("Вы не набрали название списка рассылки", 0, tr("Ошибка ввода названия"), 1 ));
char StrSQL[1000];
int res;
tagMETAOBJECT * pmobj=new tagMETAOBJECT;
tagOBJECTLIST * pobjlist=new tagOBJECTLIST;
LPOBJECT pobj;
VTRESULT pVariant;
//Узнаем максимальный num из tdc_cirk_rass для ДЛ на АРМ
sprintf(StrSQL, "select max(num) from tdc_cirk_rass where sndr=%d", dolj_num);
res = OpenSQLObjectList(dbh1, (LPCSTR)StrSQL, pmobj , pobjlist);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка добавления списка рассылки"), 0 ));
pobj=pobjlist->lpObjHead;
int numIntoTable = 0;
while (pobj!=NULL)
{
GetObjectParamByIndex(*pmobj,*pobj, 0,&pVariant);
VtToInt(pVariant, &numIntoTable);
ReleaseVariant(pVariant);
pobj = pobj->lpNext;
}
sprintf(StrSQL, "insert into tdc_cirk_rass (num, name, dolj_id, sndr) values (%d, \'%s\', -1, %d)", numIntoTable + 1, buf, dolj_num);
res = ExecuteSQLQuery (dbh1, StrSQL);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка добавления списка рассылки"), 0 ));
lv->clear();
buildTree ();
CloseObjectList(pobjlist);
delete pmobj;
delete pobjlist;
printf ("Место667\n");
}
catch (SQL_Exseption e)
{
---------------ВОТ ЗДЕСЬ РАБОТАЕТ БЕЗ ПРОБЛЕМ------------------
if (e.myFlag == 0)
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
else
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка ввода"), e.myMessage);
return;
}
}
void ListCirkRass::slotAddNewDolj ()
{
#ifdef test
printf ("Внутри slotAddNewDolj ()\n");
#endif
num_dolj = 0; //Сюда поместить выбранного адресата
Addr_View = new myListView (dbh1, dolj_num, 1, NULL, 0, NULL, &num_dolj);
Addr_View->show ();
connect (Addr_View, SIGNAL (destroyed ()), this, SLOT (slotADDNewDolj_continue ()) );
}
void ListCirkRass::slotADDNewDolj_continue ()
{
if ( num_dolj == -1)
return;
printf ("ListCirkRass::slotADDNewDolj_continue (): num_dolj= %d\n", num_dolj);
//Сейчас есть QListViewItem* myQlvi, dolj_num
try
{
char StrSQL[1000];
int res;
//Помещаем запись нового адресата для выбранного списка рассылки в БД
int num;
num = myQlvi->text(1).toInt();
if ( num == -2)
{
num = myQlvi->parent()->text(1).toInt();
myQlvi = myQlvi->parent();
}
//Проверяем наличие такого адресата в списке, здесь myQlvi - указатель на список
QListViewItem * tmpItem = myQlvi->firstChild();
while (tmpItem)
{
if( tmpItem->text(2) == tr("").number(num_dolj) )
{
------------------------------ЗДЕСЬ ТОЖЕ РАБОТАЕТ-------------
QMessageBox::warning (0, QString::fromLocal8Bit("Внимание"), QString::fromLocal8Bit("Такой адресат в данном списке уже есть"));
return;
}
tmpItem = tmpItem->nextSibling();
}
sprintf(StrSQL, "insert into tdc_cirk_rass (num, parent, dolj_id, sndr) VALUES (-1, %d, %d, %d)", num, num_dolj, dolj_num);
res = ExecuteSQLQuery (dbh1, StrSQL);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка добавления нового адресата в список"), 0 ));
lv->clear();
buildTree ();
printf ("Место 1098\n");
}
catch (SQL_Exseption e)
{
-------------ЗДЕСЬ НЕ ПОМНЮ, КАЖЕТСЯ ТОЖЕ РАБОТАЕТ--------------
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
return;
}
}
void ListCirkRass::resizeEvent ( QResizeEvent * )
{
lv->setGeometry(10, 30, width()-20, height()-70);
accept->setGeometry(width()/2 - 195, height() - 30, 90, 25);
cancel->setGeometry((int)width()/2 + 105, height() - 30, 90, 25);
}
void ListCirkRass::buildTree ()
{
#ifdef test
printf("Внутри ListCirkRass::buildTree ()\n");
#endif
//Есть: dolj_num - ДЛ на АРМ, QListView* lv
try
{
char StrSQL[1000];
char str[256];
int res;
char num[50];
char dolj1[50];
tagMETAOBJECT * pmobj = new tagMETAOBJECT;
tagOBJECTLIST * pobjlist = new tagOBJECTLIST;
LPOBJECT pobj;
VTRESULT pVariant;
QListViewItem *qlvi = NULL;
//Узнаем максимальный num из tdc_cirk_rass для ДЛ на АРМ
sprintf(StrSQL, "select num, name, dolj_id from tdc_cirk_rass where dolj_id=-1 and sndr=%d order by num", dolj_num);
res = OpenSQLObjectList(dbh1, (LPCSTR)StrSQL, pmobj , pobjlist);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка построения дерева списков рассылки"), 0 ));
pobj=pobjlist->lpObjHead;
while (pobj!=NULL)
{
GetObjectParamByIndex(*pmobj, *pobj, 1,&pVariant);
VtToString(pVariant, str);
ReleaseVariant(pVariant);
GetObjectParamByIndex(*pmobj, *pobj, 0,&pVariant);
VtToString(pVariant, num);
ReleaseVariant(pVariant);
/*GetObjectParamByIndex(*pmobj, *pobj, 2,&pVariant);
VtToString(pVariant, dolj1);
ReleaseVariant(pVariant);*/
if( qlvi == NULL )
{
qlvi = new QListViewItem(lv, tr(str), tr(num)/*, tr(dolj1)*/);
buildTree_2level (qlvi);
}
else
{
qlvi = new QListViewItem(lv, qlvi, tr(str), tr(num)/*, tr(dolj1)*/);
buildTree_2level (qlvi);
}
pobj = pobj->lpNext;
}
CloseObjectList(pobjlist);
delete pmobj;
delete pobjlist;
}
catch (SQL_Exseption e)
{
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
return;
}
}
#define test
#include "ListCirk_rass.h"
ListCirkRass::ListCirkRass (DBHANDLE dbh, int dolj, QString* text_Br, N_WebBr* WebBr) : QMainWindow(0, 0, Qt::WShowModal)
{
#ifdef test
printf("Внутри конструктора myListCirkRass(), dbh= %d, dolj= %d\n", dbh, dolj);
#endif
This_textBr = text_Br;
hereWebBr = WebBr;
dbh1 = dbh;
dolj_num = dolj;
setCaption(tr("Списки рассылки"));
int x = QApplication::desktop()->width();
int y = QApplication::desktop()->height();
setGeometry(x/2-x/3, y/2-y/3, x/4*2, y/4*2);
setMinimumWidth (500);
QFont font("helvetica_mcbc", 12);
font.setBold(true);
setFont(font);
lv = new QListView (this);
lv->clear();
lv->setGeometry(10, 30, width()-20, height() - 70);
lv->addColumn(tr("name"), -1);
lv->addColumn(tr("num"), -1);
lv->addColumn("dolj_id", -1);
lv->header()->setClickEnabled(false);
lv->header()->hide();
lv->setRootIsDecorated (true);
lv->setSorting(-1);
buildTree ();
accept = new QPushButton(tr("Принять"),this);
accept->setGeometry(width()/2 - 195, height() - 30, 90, 25);
accept->setFont(font);
connect(accept, SIGNAL(clicked()), this, SLOT(slot_accept()));
cancel = new QPushButton(tr("Отмена"),this);
cancel->setGeometry(width()/2 + 105, height() - 30, 90, 25);
cancel->setFont(font);
connect(cancel, SIGNAL(clicked()), this, SLOT(slot_cancel()));
connect(lv, SIGNAL (rightButtonClicked (QListViewItem*, const QPoint&, int)), this, SLOT (slotPopupMenu (QListViewItem*, const QPoint&, int)));
}
ListCirkRass::~ListCirkRass ()
{
}
void ListCirkRass::slot_accept()
{
#ifdef test
printf("Внутри ListCirkRass::slot_accept()\n");
#endif
//Здесь не смотрите, еще этот слот не реализовал
close();
}
void ListCirkRass::slot_cancel()
{
close();
}
void ListCirkRass::slotPopupMenu (QListViewItem* qlvi, const QPoint& p, int col)
{
#ifdef test
printf ("Внутри slotPopupMenu ()\n");
printf ("qlvi= %d, col= %d\n", qlvi, col);
#endif
myQlvi = qlvi;
QPopupMenu *pm;
pm = new QPopupMenu(lv);
pm->setFont(QFont("helvetiva",10));
QAction *AddNew, *AddDolj, *DelDolj, *DelList, *DelAll;
if( col == -1 || (col == 0 && qlvi->parent() == 0) )
{
AddNew = new QAction (tr("Добавить"), tr("Добавить список"), 0, this);
connect(AddNew, SIGNAL(activated()), this, SLOT(slotAddNewList()));
AddNew->addTo(pm);
}
if( col == 0 /*&& qlvi->parent() == 0*/)
{
AddDolj = new QAction (tr("Добавить"), tr("Добавить адресата"), 0, this);
connect(AddDolj, SIGNAL(activated()), this, SLOT(slotAddNewDolj ()));
AddDolj->addTo(pm);
}
if( col == 0 && qlvi->parent() != 0)
{
DelDolj = new QAction (tr("Удалить"), tr("Удалить адресата"), 0, this);
connect(DelDolj, SIGNAL(activated()), this, SLOT(slotDelDolj ()));
DelDolj->addTo(pm);
}
if( col == 0 && qlvi->parent() == 0 )
{
DelList = new QAction (tr("Удалить"), tr("Удалить список"), 0, this);
connect(DelList, SIGNAL(activated()), this, SLOT(slotDelList ()));
DelList->addTo(pm);
}
if( col == -1 && !(col == 0 && qlvi->parent() == 0) )
{
DelAll = new QAction (tr("Удалить"), tr("Удалить всё"), 0, this);
connect(DelAll, SIGNAL(activated()), this, SLOT(slotDelAll()));
DelAll->addTo(pm);
}
pm->popup(p);
}
void ListCirkRass::slotAddNewList ()
{
#ifdef test
printf ("Внутри slotAddNewList ()\n");
#endif
try
{
char *buf = NULL;
int *Answer;
addList_rass *adlr = new addList_rass (this, &buf, Answer);
adlr->exec();
//*Answer == 1 - нажата кнопка "Отмена" ввода названия списка рассылки
if (*Answer == 1)
return;
if ( buf == NULL || strlen(buf) <= 1)
throw (SQL_Exseption ("Вы не набрали название списка рассылки", 0, tr("Ошибка ввода названия"), 1 ));
char StrSQL[1000];
int res;
tagMETAOBJECT * pmobj=new tagMETAOBJECT;
tagOBJECTLIST * pobjlist=new tagOBJECTLIST;
LPOBJECT pobj;
VTRESULT pVariant;
//Узнаем максимальный num из tdc_cirk_rass для ДЛ на АРМ
sprintf(StrSQL, "select max(num) from tdc_cirk_rass where sndr=%d", dolj_num);
res = OpenSQLObjectList(dbh1, (LPCSTR)StrSQL, pmobj , pobjlist);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка добавления списка рассылки"), 0 ));
pobj=pobjlist->lpObjHead;
int numIntoTable = 0;
while (pobj!=NULL)
{
GetObjectParamByIndex(*pmobj,*pobj, 0,&pVariant);
VtToInt(pVariant, &numIntoTable);
ReleaseVariant(pVariant);
pobj = pobj->lpNext;
}
sprintf(StrSQL, "insert into tdc_cirk_rass (num, name, dolj_id, sndr) values (%d, \'%s\', -1, %d)", numIntoTable + 1, buf, dolj_num);
res = ExecuteSQLQuery (dbh1, StrSQL);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка добавления списка рассылки"), 0 ));
lv->clear();
buildTree ();
CloseObjectList(pobjlist);
delete pmobj;
delete pobjlist;
printf ("Место667\n");
}
catch (SQL_Exseption e)
{
---------------ВОТ ЗДЕСЬ РАБОТАЕТ БЕЗ ПРОБЛЕМ------------------
if (e.myFlag == 0)
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
else
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка ввода"), e.myMessage);
return;
}
}
void ListCirkRass::slotAddNewDolj ()
{
#ifdef test
printf ("Внутри slotAddNewDolj ()\n");
#endif
num_dolj = 0; //Сюда поместить выбранного адресата
Addr_View = new myListView (dbh1, dolj_num, 1, NULL, 0, NULL, &num_dolj);
Addr_View->show ();
connect (Addr_View, SIGNAL (destroyed ()), this, SLOT (slotADDNewDolj_continue ()) );
}
void ListCirkRass::slotADDNewDolj_continue ()
{
if ( num_dolj == -1)
return;
printf ("ListCirkRass::slotADDNewDolj_continue (): num_dolj= %d\n", num_dolj);
//Сейчас есть QListViewItem* myQlvi, dolj_num
try
{
char StrSQL[1000];
int res;
//Помещаем запись нового адресата для выбранного списка рассылки в БД
int num;
num = myQlvi->text(1).toInt();
if ( num == -2)
{
num = myQlvi->parent()->text(1).toInt();
myQlvi = myQlvi->parent();
}
//Проверяем наличие такого адресата в списке, здесь myQlvi - указатель на список
QListViewItem * tmpItem = myQlvi->firstChild();
while (tmpItem)
{
if( tmpItem->text(2) == tr("").number(num_dolj) )
{
------------------------------ЗДЕСЬ ТОЖЕ РАБОТАЕТ-------------
QMessageBox::warning (0, QString::fromLocal8Bit("Внимание"), QString::fromLocal8Bit("Такой адресат в данном списке уже есть"));
return;
}
tmpItem = tmpItem->nextSibling();
}
sprintf(StrSQL, "insert into tdc_cirk_rass (num, parent, dolj_id, sndr) VALUES (-1, %d, %d, %d)", num, num_dolj, dolj_num);
res = ExecuteSQLQuery (dbh1, StrSQL);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка добавления нового адресата в список"), 0 ));
lv->clear();
buildTree ();
printf ("Место 1098\n");
}
catch (SQL_Exseption e)
{
-------------ЗДЕСЬ НЕ ПОМНЮ, КАЖЕТСЯ ТОЖЕ РАБОТАЕТ--------------
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
return;
}
}
void ListCirkRass::resizeEvent ( QResizeEvent * )
{
lv->setGeometry(10, 30, width()-20, height()-70);
accept->setGeometry(width()/2 - 195, height() - 30, 90, 25);
cancel->setGeometry((int)width()/2 + 105, height() - 30, 90, 25);
}
void ListCirkRass::buildTree ()
{
#ifdef test
printf("Внутри ListCirkRass::buildTree ()\n");
#endif
//Есть: dolj_num - ДЛ на АРМ, QListView* lv
try
{
char StrSQL[1000];
char str[256];
int res;
char num[50];
char dolj1[50];
tagMETAOBJECT * pmobj = new tagMETAOBJECT;
tagOBJECTLIST * pobjlist = new tagOBJECTLIST;
LPOBJECT pobj;
VTRESULT pVariant;
QListViewItem *qlvi = NULL;
//Узнаем максимальный num из tdc_cirk_rass для ДЛ на АРМ
sprintf(StrSQL, "select num, name, dolj_id from tdc_cirk_rass where dolj_id=-1 and sndr=%d order by num", dolj_num);
res = OpenSQLObjectList(dbh1, (LPCSTR)StrSQL, pmobj , pobjlist);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка построения дерева списков рассылки"), 0 ));
pobj=pobjlist->lpObjHead;
while (pobj!=NULL)
{
GetObjectParamByIndex(*pmobj, *pobj, 1,&pVariant);
VtToString(pVariant, str);
ReleaseVariant(pVariant);
GetObjectParamByIndex(*pmobj, *pobj, 0,&pVariant);
VtToString(pVariant, num);
ReleaseVariant(pVariant);
/*GetObjectParamByIndex(*pmobj, *pobj, 2,&pVariant);
VtToString(pVariant, dolj1);
ReleaseVariant(pVariant);*/
if( qlvi == NULL )
{
qlvi = new QListViewItem(lv, tr(str), tr(num)/*, tr(dolj1)*/);
buildTree_2level (qlvi);
}
else
{
qlvi = new QListViewItem(lv, qlvi, tr(str), tr(num)/*, tr(dolj1)*/);
buildTree_2level (qlvi);
}
pobj = pobj->lpNext;
}
CloseObjectList(pobjlist);
delete pmobj;
delete pobjlist;
}
catch (SQL_Exseption e)
{
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
return;
}
}
Код:
void ListCirkRass::buildTree_2level (QListViewItem* ptrQlvi)
{
#ifdef test
printf("Внутри ListCirkRass::buildTree_2level ()\n");
#endif
QListViewItem *qlvi = NULL;
//Запрос на детей от столбца 1 ptrQlvi
-----ЭТОТ QMessageBox (ВСТАВЛЕН ДЛЯ ЭКСПЕРИМЕНТА) НЕ РАБОТАЕТ И ПРОГРАММА ПАДАЕТ----------
QMessageBox::warning (0, QString::fromLocal8Bit("Ошибка базы данных"), QString(""));
try
{
char StrSQL[1000];
int answ;
int res;
char num[50];
tagMETAOBJECT * pmobj = new tagMETAOBJECT;
tagOBJECTLIST * pobjlist = new tagOBJECTLIST;
LPOBJECT pobj;
VTRESULT pVariant;
printf ("buildTree_2level Место 001\n");
sprintf(StrSQL, "select dolj_id from tdc_cirk_rass where sndr=%d and parent=%d order by id", dolj_num, ptrQlvi->text(1).toInt());
printf ("StrSQL: %s\n", StrSQL);
res = OpenSQLObjectList(dbh1, (LPCSTR)StrSQL, pmobj , pobjlist);
printf ("buildTree_2level Место 002\n");
printf ("res= %d\n", res);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка построения дерева списков рассылки"), 0 ));
pobj = pobjlist->lpObjHead;
printf ("pobj= %d\n", pobj);
while ( pobj != NULL )
{
printf ("buildTree_2level Место 003\n");
GetObjectParamByIndex(*pmobj, *pobj, 0, &pVariant);
VtToInt(pVariant, &answ);
ReleaseVariant(pVariant);
if ( qlvi == NULL )
{
qlvi = new QListViewItem(ptrQlvi, tr(Get_full_name_dolj (answ, 0)), tr ("-2"), tr("").number(answ));
}
else
{
qlvi = new QListViewItem(ptrQlvi, qlvi, tr(Get_full_name_dolj (answ, 0)), tr ("-2"), tr("").number(answ));
}
pobj = pobj->lpNext;
}
CloseObjectList(pobjlist);
delete pmobj;
delete pobjlist;
}
catch (SQL_Exseption e)
{
--------------QMessageBox НЕ РАБОТАЕТ НИ В КАКУЮ (И ПРОГРАММА ПАДАЕТ)-------------------------------------
//if (e.myFlag == 0)
printf ("catch (SQL_Exseption e) Место 008\n");
printf ("e.myMessage= %s\n", (const char*)e.myMessage.local8Bit());
QMessageBox::critical (this, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
//QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), QString("kjgjklgl"));
printf ("catch (SQL_Exseption e) Место 009\n");
//else
//QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка ввода"), e.myMessage);
return;
}
}
void ListCirkRass::slotDelDolj ()
{
#ifdef test
printf("Внутри ListCirkRass::slotDelDolj ()\n");
#endif
int dolj_rcvr, parent;
dolj_rcvr = myQlvi->text(2).toInt();
parent = myQlvi->parent()->text(1).toInt();
printf ("dolj_rcvr= %d, parent= %d\n", dolj_rcvr, parent);
try
{
char StrSQL[1000];
int res;
//Удаляем адресата
sprintf(StrSQL, "delete from tdc_cirk_rass where sndr=%d and parent=%d and dolj_id=%d", dolj_num, parent, dolj_rcvr);
res = ExecuteSQLQuery (dbh1, StrSQL);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка удаления адресата из списка"), 0 ));
lv->clear();
buildTree ();
printf ("Место 1100\n");
}
catch (SQL_Exseption e)
{
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
return;
}
}
void ListCirkRass::slotDelList ()
{
#ifdef test
printf("Внутри ListCirkRass::slotDelList ()\n");
#endif
int num;
num = myQlvi->text(1).toInt();
printf ("num= %d\n", num);
try
{
char StrSQL[1000];
int res;
//Удаляем список и детей списка
sprintf(StrSQL, "delete from tdc_cirk_rass where (sndr=%d and num=%d and dolj_id=-1) OR (sndr=%d and parent=%d and num=-1)", dolj_num, num, dolj_num, num);
res = ExecuteSQLQuery (dbh1, StrSQL);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка удаления списка"), 0 ));
lv->clear();
buildTree ();
printf ("Место 1100\n");
}
catch (SQL_Exseption e)
{
-------НЕ ПОМНЮ, КАЖЕТСЯ ТОЖЕ НЕ РАБОТАЕТ ИЛИ НЕ ПРОВЕРЯЛ------
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
return;
}
}
void ListCirkRass::slotDelAll()
{
#ifdef test
printf("Внутри ListCirkRass::slotDelAll ()\n");
#endif
---------------QMessageBox РАБОТАЕТ---------------------------------
int resQuestion = QMessageBox::question(this,tr("Подтверждение"), tr("Вы действительно желаете удалить все списки рассылки?"), tr("Да"), tr("Нет"));
#ifdef test
fprintf(stderr, "resQuestion вопроса = %d\n", resQuestion);
#endif
if (resQuestion!=0)
return;
try
{
char StrSQL[1000];
int res;
//Ну если так хочется, то удаляем всё нафиг
sprintf(StrSQL, "delete from tdc_cirk_rass where sndr=%d", dolj_num);
res = ExecuteSQLQuery (dbh1, StrSQL);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка добавления нового адресата в список"), 0 ));
printf ("Место 0112\n");
lv->clear();
buildTree ();
printf ("Место 1112\n");
}
catch (SQL_Exseption e)
{
----------НЕ ПОМНЮ, НАДОЕЛО ПЯЛИТЬСЯ В ЭКРАН, КАЖЕТСЯ ЗДЕСЬ НЕ ПРОВЕРЯЛ РАБОТУ QMessageBox---------------
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
return;
}
}
//Класс добавления группы (окно ввода названия списка рассылки)
addList_rass::addList_rass(QWidget *parent, char **_Group, int *_Answer):QDialog(parent, "", true, WDestructiveClose)
{
Answer = _Answer;
Group = _Group;
setCaption(tr("Добавление списка рассылки"));
resize(300,100);
setFixedSize(300,100);
le = new QLineEdit(this);
if(_Group!=NULL)
le->setText(tr(*_Group));
le->setGeometry(0,5,width(),22);
OkBtn = new QPushButton("OK",this);
CancelBtn = new QPushButton(tr("Отмена"),this);
OkBtn->setGeometry(10,35,60,25);
CancelBtn->setGeometry(80,35,60,25);
connect(OkBtn,SIGNAL(clicked()),this,SLOT(slotOkClicked()));
connect(CancelBtn,SIGNAL(clicked()),this,SLOT(slotCancelClicked()));
}
addList_rass::~addList_rass()
{
}
void addList_rass::slotOkClicked()
{
*Group = (char*)realloc((char*)*Group, strlen(le->text())+1);
strcpy(*Group, (const char*)le->text().local8Bit());
*Answer = 0;
close();
}
void addList_rass::slotCancelClicked()
{
*Answer = 1;
close();
}
//Класс ошибки БД
SQL_Exseption::SQL_Exseption(char *StrSQL, int res, QString str, int flag)
{
myFlag = flag;
QString str1 = QString::fromLocal8Bit(StrSQL);
printf ("SQL_Exseption::SQL_Exseption Место 001\n");
switch (myFlag)
{
case 0:
{
printf ("SQL_Exseption::SQL_Exseption Место 002\n");
QString str_e;
uint len = str1.length();
uint col = len/80;
printf ("len= %d, col= %d\n", len, col);
for (int i = 0; i < col ; ++i)
{
str_e += str1.mid(i * 80, 80) + QString::fromLocal8Bit("\n");
printf ("str_e: %s\n", (const char*)str_e.local8Bit());
}
//Конец строки
str_e += str1.mid(col * 80, len - col * 80);
printf ("str_e последний: %s\n", (const char*)str_e.local8Bit());
myMessage = str + QString::fromLocal8Bit("\n SQL-запрос: ") + str_e + QString::fromLocal8Bit("\n Ответ БД: ") + QString::fromLocal8Bit("").number(res);
}
break;
case 1:
myMessage = str + QString::fromLocal8Bit("\n") + str1;
break;
}
printf ("myMessage: %s\n", (const char*)myMessage.local8Bit());
}
SQL_Exseption::~SQL_Exseption()
{
}
{
#ifdef test
printf("Внутри ListCirkRass::buildTree_2level ()\n");
#endif
QListViewItem *qlvi = NULL;
//Запрос на детей от столбца 1 ptrQlvi
-----ЭТОТ QMessageBox (ВСТАВЛЕН ДЛЯ ЭКСПЕРИМЕНТА) НЕ РАБОТАЕТ И ПРОГРАММА ПАДАЕТ----------
QMessageBox::warning (0, QString::fromLocal8Bit("Ошибка базы данных"), QString(""));
try
{
char StrSQL[1000];
int answ;
int res;
char num[50];
tagMETAOBJECT * pmobj = new tagMETAOBJECT;
tagOBJECTLIST * pobjlist = new tagOBJECTLIST;
LPOBJECT pobj;
VTRESULT pVariant;
printf ("buildTree_2level Место 001\n");
sprintf(StrSQL, "select dolj_id from tdc_cirk_rass where sndr=%d and parent=%d order by id", dolj_num, ptrQlvi->text(1).toInt());
printf ("StrSQL: %s\n", StrSQL);
res = OpenSQLObjectList(dbh1, (LPCSTR)StrSQL, pmobj , pobjlist);
printf ("buildTree_2level Место 002\n");
printf ("res= %d\n", res);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка построения дерева списков рассылки"), 0 ));
pobj = pobjlist->lpObjHead;
printf ("pobj= %d\n", pobj);
while ( pobj != NULL )
{
printf ("buildTree_2level Место 003\n");
GetObjectParamByIndex(*pmobj, *pobj, 0, &pVariant);
VtToInt(pVariant, &answ);
ReleaseVariant(pVariant);
if ( qlvi == NULL )
{
qlvi = new QListViewItem(ptrQlvi, tr(Get_full_name_dolj (answ, 0)), tr ("-2"), tr("").number(answ));
}
else
{
qlvi = new QListViewItem(ptrQlvi, qlvi, tr(Get_full_name_dolj (answ, 0)), tr ("-2"), tr("").number(answ));
}
pobj = pobj->lpNext;
}
CloseObjectList(pobjlist);
delete pmobj;
delete pobjlist;
}
catch (SQL_Exseption e)
{
--------------QMessageBox НЕ РАБОТАЕТ НИ В КАКУЮ (И ПРОГРАММА ПАДАЕТ)-------------------------------------
//if (e.myFlag == 0)
printf ("catch (SQL_Exseption e) Место 008\n");
printf ("e.myMessage= %s\n", (const char*)e.myMessage.local8Bit());
QMessageBox::critical (this, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
//QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), QString("kjgjklgl"));
printf ("catch (SQL_Exseption e) Место 009\n");
//else
//QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка ввода"), e.myMessage);
return;
}
}
void ListCirkRass::slotDelDolj ()
{
#ifdef test
printf("Внутри ListCirkRass::slotDelDolj ()\n");
#endif
int dolj_rcvr, parent;
dolj_rcvr = myQlvi->text(2).toInt();
parent = myQlvi->parent()->text(1).toInt();
printf ("dolj_rcvr= %d, parent= %d\n", dolj_rcvr, parent);
try
{
char StrSQL[1000];
int res;
//Удаляем адресата
sprintf(StrSQL, "delete from tdc_cirk_rass where sndr=%d and parent=%d and dolj_id=%d", dolj_num, parent, dolj_rcvr);
res = ExecuteSQLQuery (dbh1, StrSQL);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка удаления адресата из списка"), 0 ));
lv->clear();
buildTree ();
printf ("Место 1100\n");
}
catch (SQL_Exseption e)
{
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
return;
}
}
void ListCirkRass::slotDelList ()
{
#ifdef test
printf("Внутри ListCirkRass::slotDelList ()\n");
#endif
int num;
num = myQlvi->text(1).toInt();
printf ("num= %d\n", num);
try
{
char StrSQL[1000];
int res;
//Удаляем список и детей списка
sprintf(StrSQL, "delete from tdc_cirk_rass where (sndr=%d and num=%d and dolj_id=-1) OR (sndr=%d and parent=%d and num=-1)", dolj_num, num, dolj_num, num);
res = ExecuteSQLQuery (dbh1, StrSQL);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка удаления списка"), 0 ));
lv->clear();
buildTree ();
printf ("Место 1100\n");
}
catch (SQL_Exseption e)
{
-------НЕ ПОМНЮ, КАЖЕТСЯ ТОЖЕ НЕ РАБОТАЕТ ИЛИ НЕ ПРОВЕРЯЛ------
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
return;
}
}
void ListCirkRass::slotDelAll()
{
#ifdef test
printf("Внутри ListCirkRass::slotDelAll ()\n");
#endif
---------------QMessageBox РАБОТАЕТ---------------------------------
int resQuestion = QMessageBox::question(this,tr("Подтверждение"), tr("Вы действительно желаете удалить все списки рассылки?"), tr("Да"), tr("Нет"));
#ifdef test
fprintf(stderr, "resQuestion вопроса = %d\n", resQuestion);
#endif
if (resQuestion!=0)
return;
try
{
char StrSQL[1000];
int res;
//Ну если так хочется, то удаляем всё нафиг
sprintf(StrSQL, "delete from tdc_cirk_rass where sndr=%d", dolj_num);
res = ExecuteSQLQuery (dbh1, StrSQL);
if ( res != 0 )
throw (SQL_Exseption (StrSQL, res, tr("Ошибка добавления нового адресата в список"), 0 ));
printf ("Место 0112\n");
lv->clear();
buildTree ();
printf ("Место 1112\n");
}
catch (SQL_Exseption e)
{
----------НЕ ПОМНЮ, НАДОЕЛО ПЯЛИТЬСЯ В ЭКРАН, КАЖЕТСЯ ЗДЕСЬ НЕ ПРОВЕРЯЛ РАБОТУ QMessageBox---------------
QMessageBox::critical (0, QString::fromLocal8Bit("Ошибка базы данных"), e.myMessage);
return;
}
}
//Класс добавления группы (окно ввода названия списка рассылки)
addList_rass::addList_rass(QWidget *parent, char **_Group, int *_Answer):QDialog(parent, "", true, WDestructiveClose)
{
Answer = _Answer;
Group = _Group;
setCaption(tr("Добавление списка рассылки"));
resize(300,100);
setFixedSize(300,100);
le = new QLineEdit(this);
if(_Group!=NULL)
le->setText(tr(*_Group));
le->setGeometry(0,5,width(),22);
OkBtn = new QPushButton("OK",this);
CancelBtn = new QPushButton(tr("Отмена"),this);
OkBtn->setGeometry(10,35,60,25);
CancelBtn->setGeometry(80,35,60,25);
connect(OkBtn,SIGNAL(clicked()),this,SLOT(slotOkClicked()));
connect(CancelBtn,SIGNAL(clicked()),this,SLOT(slotCancelClicked()));
}
addList_rass::~addList_rass()
{
}
void addList_rass::slotOkClicked()
{
*Group = (char*)realloc((char*)*Group, strlen(le->text())+1);
strcpy(*Group, (const char*)le->text().local8Bit());
*Answer = 0;
close();
}
void addList_rass::slotCancelClicked()
{
*Answer = 1;
close();
}
//Класс ошибки БД
SQL_Exseption::SQL_Exseption(char *StrSQL, int res, QString str, int flag)
{
myFlag = flag;
QString str1 = QString::fromLocal8Bit(StrSQL);
printf ("SQL_Exseption::SQL_Exseption Место 001\n");
switch (myFlag)
{
case 0:
{
printf ("SQL_Exseption::SQL_Exseption Место 002\n");
QString str_e;
uint len = str1.length();
uint col = len/80;
printf ("len= %d, col= %d\n", len, col);
for (int i = 0; i < col ; ++i)
{
str_e += str1.mid(i * 80, 80) + QString::fromLocal8Bit("\n");
printf ("str_e: %s\n", (const char*)str_e.local8Bit());
}
//Конец строки
str_e += str1.mid(col * 80, len - col * 80);
printf ("str_e последний: %s\n", (const char*)str_e.local8Bit());
myMessage = str + QString::fromLocal8Bit("\n SQL-запрос: ") + str_e + QString::fromLocal8Bit("\n Ответ БД: ") + QString::fromLocal8Bit("").number(res);
}
break;
case 1:
myMessage = str + QString::fromLocal8Bit("\n") + str1;
break;
}
printf ("myMessage: %s\n", (const char*)myMessage.local8Bit());
}
SQL_Exseption::~SQL_Exseption()
{
}
QMessageBox падал т. к. вызов функций где он живет производился из конструктора. Переделал, теперь всё ОК.
Но почему его нельзя вызывать из конструктора для меня пока загадка?