void TMainForm::CreateTreeView (void)
{
TADOStoredProc *Qu = new TADOStoredProc(this);
...
...
...
delete Qu;
}
Динамические объекты в *.dll
вобщем ситуация такая:
в приложении была некая (рабочая) ф-я в которой динамически создавались объекты:
Код:
хочу перенести эту ф-ю в dll, но возникла загвоздка, что вместо "this" ставить?
auto_ptr<TADOStoredProc>Qu(new TADOStoredProc(NULL));
ПЫСЫ: извините что сам с собой разговариваю :)
Пересмотреть архитектуру. Вынести подобные вещи в отдельную сущность за пределы класса. Организовать фабрикой например. ПРи необходимости передавать в функцию указатель на класс родительского окна (той самой мэйнформы например.)
есть главная форма, на ней TTreeView, хочу сделать так, что бы MainForm->TreeView заполнялось ф-ей из dll:
Код:
extern "C" void __export CreateTreeView (TADOStoredProc *ADOStoredProc1, TADOConnection *ADOConnection1, TTreeView *TreeView)
{
TTreeNode *Node;
ADOStoredProc1->Parameters->Clear();
ADOStoredProc1->Active = false;
ADOStoredProc1->Connection = ADOConnection1;
ADOStoredProc1->ProcedureName = "Create_TV";
ADOStoredProc1->Parameters->CreateParameter("@ItemLevel", ftInteger, pdInput, 4, 0);
ADOStoredProc1->Parameters->ParamByName("@ItemLevel")->Value = 0;
ADOStoredProc1->Active = true;
while (!ADOStoredProc1->Eof)
{
int id = ADOStoredProc1->FieldValues["IDKey"].intVal;
TTreeNode *Nod = TreeView->Items->Add(NULL, ADOStoredProc1->FieldByName("ItemName")->AsString);
Nod->Data = (void*)(int)id;
CreateChildNode(id, Nod, TreeView, ADOConnection1);
ADOStoredProc1->Next();
}
ADOStoredProc1->Active = false;
}
{
TTreeNode *Node;
ADOStoredProc1->Parameters->Clear();
ADOStoredProc1->Active = false;
ADOStoredProc1->Connection = ADOConnection1;
ADOStoredProc1->ProcedureName = "Create_TV";
ADOStoredProc1->Parameters->CreateParameter("@ItemLevel", ftInteger, pdInput, 4, 0);
ADOStoredProc1->Parameters->ParamByName("@ItemLevel")->Value = 0;
ADOStoredProc1->Active = true;
while (!ADOStoredProc1->Eof)
{
int id = ADOStoredProc1->FieldValues["IDKey"].intVal;
TTreeNode *Nod = TreeView->Items->Add(NULL, ADOStoredProc1->FieldByName("ItemName")->AsString);
Nod->Data = (void*)(int)id;
CreateChildNode(id, Nod, TreeView, ADOConnection1);
ADOStoredProc1->Next();
}
ADOStoredProc1->Active = false;
}
в строке TTreeNode *Nod = TreeView->Items->Add(NULL, ADOStoredProc1->FieldByName("ItemName")->AsString); вылетает AV по адресу...
ADOStoredProc1->FieldByName("ItemName")->AsString - нормально работает
как правильно передеать объект в ф-ю dll
Цитата: oxotnik333
еще один вопрос:
есть главная форма, на ней TTreeView, хочу сделать так, что бы MainForm->TreeView заполнялось ф-ей из dll:
в строке TTreeNode *Nod = TreeView->Items->Add(NULL, ADOStoredProc1->FieldByName("ItemName")->AsString); вылетает AV по адресу...
ADOStoredProc1->FieldByName("ItemName")->AsString - нормально работает
как правильно передеать объект в ф-ю dll
есть главная форма, на ней TTreeView, хочу сделать так, что бы MainForm->TreeView заполнялось ф-ей из dll:
Код:
extern "C" void __export CreateTreeView (TADOStoredProc *ADOStoredProc1, TADOConnection *ADOConnection1, TTreeView *TreeView)
{
TTreeNode *Node;
ADOStoredProc1->Parameters->Clear();
ADOStoredProc1->Active = false;
ADOStoredProc1->Connection = ADOConnection1;
ADOStoredProc1->ProcedureName = "Create_TV";
ADOStoredProc1->Parameters->CreateParameter("@ItemLevel", ftInteger, pdInput, 4, 0);
ADOStoredProc1->Parameters->ParamByName("@ItemLevel")->Value = 0;
ADOStoredProc1->Active = true;
while (!ADOStoredProc1->Eof)
{
int id = ADOStoredProc1->FieldValues["IDKey"].intVal;
TTreeNode *Nod = TreeView->Items->Add(NULL, ADOStoredProc1->FieldByName("ItemName")->AsString);
Nod->Data = (void*)(int)id;
CreateChildNode(id, Nod, TreeView, ADOConnection1);
ADOStoredProc1->Next();
}
ADOStoredProc1->Active = false;
}
{
TTreeNode *Node;
ADOStoredProc1->Parameters->Clear();
ADOStoredProc1->Active = false;
ADOStoredProc1->Connection = ADOConnection1;
ADOStoredProc1->ProcedureName = "Create_TV";
ADOStoredProc1->Parameters->CreateParameter("@ItemLevel", ftInteger, pdInput, 4, 0);
ADOStoredProc1->Parameters->ParamByName("@ItemLevel")->Value = 0;
ADOStoredProc1->Active = true;
while (!ADOStoredProc1->Eof)
{
int id = ADOStoredProc1->FieldValues["IDKey"].intVal;
TTreeNode *Nod = TreeView->Items->Add(NULL, ADOStoredProc1->FieldByName("ItemName")->AsString);
Nod->Data = (void*)(int)id;
CreateChildNode(id, Nod, TreeView, ADOConnection1);
ADOStoredProc1->Next();
}
ADOStoredProc1->Active = false;
}
в строке TTreeNode *Nod = TreeView->Items->Add(NULL, ADOStoredProc1->FieldByName("ItemName")->AsString); вылетает AV по адресу...
ADOStoredProc1->FieldByName("ItemName")->AsString - нормально работает
как правильно передеать объект в ф-ю dll
работая с указателем на объект обязательно надо проверять его валидность - что объект на который указатель указывает действительно существует и доступен.
каким способом проверить можно?
Цитата: oxotnik333
каким способом проверить можно?
Код:
if(!TreeView){
//Здесь выполняешь действия если объект не создан.
ShowMessage("Error!!!!");
}
//Здесь выполняешь действия если объект не создан.
ShowMessage("Error!!!!");
}