2009-04-27 86 views
0

我固定C++生成器5應用程序,我有這樣的代碼:GotoBookmark太慢了嗎?

void __fastcall TFPrincipal::DBGModuleStartDrag(TObject *Sender, 
     TDragObject *&DragObject) 
{ 
    m_pParentNodesDragDrop = NULL; 
    DragObject = NULL; 
    bool bAbort = false; 
    m_ListaModulosDragDrop->Clear(); 
    m_ListaContenedoresDragDrop->Clear(); 
    CInfoNode *pInfoNode = NULL; 
    CInfoModule *pInfoMod = NULL ; 
    long l_IdContainerParent = 0; 
    TDataSet * DataSet = NULL; 

    m_pLastDragNode = NULL; 
    m_bLastAccept = false; 

    try 
    { 
     IProductsPtr ProductsPtr = 
       m_pgServerConnection->Create<IProducts>(CLSID_CProducts); 
     if(DBGModules) 
     { 
      if (DBGModules->DataSource) 
      { 
       if (DBGModules->DataSource->DataSet) 
       { 
        DataSet = DBGModules->DataSource->DataSet; 
        DataSet->DisableControls(); 
       } 
       else return; 
      } 
      else return; 
     } 
     else return; 
     for (int i = 0; i < DBGModules->SelectedCount; i++) 
     { 
      DataSet->GotoBookmark(DBGModules->SelectedRows[i].c_str()); 


      pInfoMod = new CInfoModule(DataSet->FieldByName("IP")->AsString, 
        (long)DataSet->FieldByName("IdComputer")->AsInteger, 
        (Products)DataSet->FieldByName("IdProduct")->AsInteger, 
        DataSet->FieldByName("Host")->AsString, 
        DataSet->FieldByName("Instance")->AsString, 
        DataSet->FieldByName("Version")->AsString, 
        DataSet->FieldByName("AditionalInfo")->AsString, 
        (Antivirus)DataSet->FieldByName("IdAntivirus")->AsInteger, 
        DataSet->FieldByName("NumNotPadmin3AV")->AsInteger, 
        DataSet->FieldByName("NumPadmin3AV")->AsInteger, 
        false, 
        (long)DataSet->FieldByName("IdUnit")->AsInteger, 
        (long)DataSet->FieldByName("IdUnitForInstall")->AsInteger); 
      DataSet->FreeBookmark(DataSet->GetBookmark()); 

      pInfoNode = new CInfoNode(); 
      pInfoNode->m_pInfoModule = pInfoMod; 
     // Platree::TPlaTreeNode *pNodoSeleccionado = pInfoNode; 


     // if (pNodoSeleccionado) 
     { 
     // guardamos el padre de uno de los nodos seleccionados para 
     // el drag & drop para que usarlo luego para que aparezca desplegada 
     // la rama de origen del nodo movido y la rama de destino tras 
     // el refresco (parametro del ReloadTree) 
     // if (! m_pParentNodesDragDrop) 
     // m_pParentNodesDragDrop = pNodoSeleccionado->Parent; 

      //CInfoNode *pInfoNodoSeleccionado; 
      //pInfoNodoSeleccionado = (CInfoNode *)pNodoSeleccionado->Data; 


      if (pInfoNode->IsModule()) 
      { 
      long l_IdContainerParent = 0; 
      m_ListaModulosDragDrop->AddObject(pInfoMod->m_asDisplayName, 
               (TObject*)pInfoNode); 
     /* TESTHR(ProductsPtr->GetIDContainer(pInfoMod->m_lIdComputer, 
             pInfoMod->m_pdIDProduct, 
             WideString(pInfoMod->m_asInstance), 
             &l_IdContainerParent));*/ 

      CInfoDragNode *pInfoDragNode = new CInfoDragNode(); 
      pInfoDragNode->m_asInstance = pInfoMod->m_asInstance; 
      pInfoDragNode->m_lIdComputer = pInfoMod->m_lIdComputer; 
      pInfoDragNode->m_lIdContainerParent = /*l_IdContainerParent*/0; 
      pInfoDragNode->m_pdIDProduct = pInfoMod->m_pdIDProduct; 

      m_ListaContenedoresDragDrop->Add(
        reinterpret_cast<void*>(pInfoDragNode) 
      ); 
      } 
      else 
      { 
      bAbort = true; 
      break; 
      } 
     } 
    /* delete pInfoNode; 
     delete pInfoMod;*/ 
     DataSet->EnableControls(); 
     } 
     if (bAbort) 
     { 
     // alguno de los items seleccionados no es un módulo 
     m_ListaModulosDragDrop->Clear(); 
     } 
    } 
    catch (const nm_error::__com_error_ &e) 
    { 
     PutDebugMessage(COMError2str(e)); 
     m_ListaModulosDragDrop->Clear(); 
    } 
} 

我已經注意到線DataSet-> GotoBookmark(DBGModules-> SelectedRows [I] .c_str());正在執行緩慢。爲什麼會這樣?使用的網格是從DevExpress

+1

您正在使用哪個數據庫? – stukelly 2009-04-27 15:01:21

回答

1

它很可能是你的GotoBookmark導致查詢背後的數據集被反覆運行。根據所選行執行更具體的查詢可能會更好,而不是在更通用的查詢結果中查找書籤。

2

GotoBookmark功能和Delphi和C++ Builder中的數據集中過濾器的使用已知是非常嚴重的性能瓶頸。

我的建議是使用不同的機制跳轉到所需的記錄。也許只是使用查詢和ID。如果這不可行,請確保您在用作書籤密鑰的字段上有索引。