Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » VirtualTreeView

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

B2D

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Более менее с обычным деревом разобрался, теперь охота разобраться с "загодочным" VirtualTreeView. Все его хвалят и не могут нарадоваться на него. У меня возник вопрос- почему?
Одни говорят-строиться быстрее стнандартого, другие-визуально намного функционнальнее, третьи-"короче лучше".
Насчет того,что визуально функционнальнее согласен (видно даже моим невооруженным взгядом), но то, что быстрее-дудки, не смог увидеть на примере (дерево 20000 элементов).
Где почитать нормальных статей о преимуществах и способах использования ИМЕННО VirtualTreeView?
Может есть другие аналоги VirtualTreeView, которые могут составить конкуренцию ему?
 
Добавлено:
Да, мне деревья надо использовать при работе с БД

Всего записей: 35 | Зарегистр. 02-08-2006 | Отправлено: 13:53 10-08-2006
verhovetc

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Где почитать нормальных статей о преимуществах и способах использования ИМЕННО VirtualTreeView?  

для начала в помощи к этому компоненту и в демках с ним идущих  
 
а вот быстрота зависит не только от компонента

Всего записей: 116 | Зарегистр. 23-09-2005 | Отправлено: 16:16 10-08-2006 | Исправлено: verhovetc, 16:20 10-08-2006
unikum



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я в свое время делал тесты и должен сказать что обычный TTreeView в режиме virtual соизмеримо работал с этим TVirtualTreeView, но из-за визуальных фенечек отдал предпочтение второму контролу. Хотя безусловно, его заставить нармально работать чуть дольше.
Примеры идут очень толковые, не ленись смотреть, там же и хелпина.

Всего записей: 106 | Зарегистр. 23-07-2006 | Отправлено: 17:24 10-08-2006
mrrex



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
B2D

Цитата:
Насчет того,что визуально функционнальнее согласен (видно даже моим невооруженным взгядом), но то, что быстрее-дудки, не смог увидеть на примере (дерево 20000 элементов).

можешь не сомневаться.  
 
verhovetc

Цитата:
а вот быстрота зависит не только от компонента

абсолютая правда.
Если вставлять по 1 узлу, то выигрыш хоть и будет, но не сильный. а если в полной мере применять технологию вставки VT - мама не горюй стандартное дерево отдыхает.
Это как раз заметно на больших наборах данных.
 

Цитата:
Да, мне деревья надо использовать при работе с БД

да ради бога, я вот например вовсю VT юзаю. Типа свой универсальный каталогизатор  делаю и довольно успешно. Кстати я этот компонент не только как дерево но и как обычный грид использую. Супер. больше мне ничего не надо.
 
Если вопросы будут - пиши, можно в мыло сразу.
rexir(страшный пес) nm ru (думаю понятно.)
 

Всего записей: 110 | Зарегистр. 11-12-2005 | Отправлено: 22:38 10-08-2006
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
B2D

Цитата:
Одни говорят-строиться быстрее стнандартого

Из моего опыта со стандартным компонентом оказалось вполне очевидным отделять визуальный компонент от самого (программной сущности) дерева, так как фишка с заполнением естественно есть. Присваивание через LoadFromStream(TTreeStrings) всегда работало быстрее любых остальных методов. Т.е. готовится иерархический список строк с табуляциями, загружается, а уже потом заполняются картинки и т.д.
С VirtualTreeView надо разбираться именно ради визуальных эффектов. Думаю, что вопрос быстродействия решается так же - физика иерархии отдельно и визуальное поведение отдельно.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 13:04 11-08-2006
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
mrrex
Интересно было бы узнать о новинках, т.к. компонент наблюдал очень давно. Сейчас скачал новый, - по крайней мере демка вызывает интерес (что касается постепенного построения дерева).

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 11:34 14-08-2006 | Исправлено: Pinocchio, 11:55 14-08-2006
unikum



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
2Pinocchio

Цитата:
Из моего опыта со стандартным компонентом оказалось вполне очевидным отделять визуальный компонент от самого (программной сущности) дерева, так как фишка с заполнением естественно есть

А в какой тогда структуре ты хранишь древовидные данные?

Всего записей: 106 | Зарегистр. 23-07-2006 | Отправлено: 11:57 15-08-2006
LulumbaZ



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dynamic DBTreeView controls (нттп://www.table-report.com/products.php)
 
Dynamic DBTreeView controls are based on Virtual TreeView control. They are using clone dataset for internal data manipulation when dynamically building tree nodes and a binary search list for detecting existing nodes. They reflect all changes of underlining dataset (record insertion, deletion, field value change) and support drag and drop operation. There are three controls: TDTADOTree, TDTClientTree, TDTTableTree for TCustomADODataSet, TCustomClientDataSet and TTable accordingly. If your dataset supports filtering and you can create its clone dataset, you can derive your own treeview by overriding CreateCloneDataSet method of the TDTCustomDBTreeView control.  
 
Freeware. Full source included. File size 896 KB.  
 

Всего записей: 1051 | Зарегистр. 12-09-2003 | Отправлено: 12:09 15-08-2006
anat75



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mrrex
А можешь сюда запостить примерчики?
Тоже хотелось-бы использовать.....

Всего записей: 128 | Зарегистр. 24-02-2004 | Отправлено: 15:04 15-08-2006
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
unikum
В пределах процесса в глобальном массиве, хотя такое требуется не часто.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 16:04 15-08-2006
unikum



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
В пределах процесса в глобальном массиве, хотя такое требуется не часто.

Ну дык массив то не дерево. Или у элементов хранишь инфо типа parent/childs для построения дерева?

Всего записей: 106 | Зарегистр. 23-07-2006 | Отправлено: 18:42 15-08-2006
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Ну дык массив то не дерево.

Если массив Tree назвал, cтало быть инфо для построения в массиве.

Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 16:41 16-08-2006
unikum



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
т.е. в масиве инфо как ноды в распахнутом дереве?  
А как ты поступаешь в случае дабавления/удаления нодов, массив колбасишь?

Всего записей: 106 | Зарегистр. 23-07-2006 | Отправлено: 18:52 16-08-2006
mrrex



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
anat75
примерчики чего?
давайте просьбы в аську. 257892099 мане не жалко.

Всего записей: 110 | Зарегистр. 11-12-2005 | Отправлено: 20:43 16-08-2006 | Исправлено: mrrex, 20:46 16-08-2006
Pinocchio

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
С массивом - детали,

Цитата:
Думаю, что вопрос быстродействия решается...


Всего записей: 683 | Зарегистр. 18-11-2002 | Отправлено: 16:22 17-08-2006
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mrrex

Цитата:
Кстати я этот компонент ... и как обычный грид использую.  

 
ячейки грида делал редактируемыми? вполне хватило бы чисел и строк...
можешь примером поделиться? а то поставляемый как-то не очень...
можно прям в мыло:
akagm на yandex.ru
 
--------
прошу пардону, аськи сейчас временно нет, комп -- казённый...

Всего записей: 24116 | Зарегистр. 06-12-2002 | Отправлено: 16:24 22-08-2006 | Исправлено: akaGM, 16:25 22-08-2006
mrrex



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
akaGM

Цитата:
ячейки грида делал редактируемыми? вполне хватило бы чисел и строк...  
можешь примером поделиться? а то поставляемый как-то не очень...

 
Все делал. Все.... тока яичницу не жарил на этом дереве...
похож я сюда один заглядываю с возможностями поделиться примерами.
братцы, у меня работы ща, жуть! так что если слегка торможу с ответами - не обессудьте, плиз.  
 
вот тут анату75 замылил ответ, чтоб втуне не пропадало повторяю здесь.
немного не в тему akaGM, сорри
 
> 1. Есть список имён с номерами для каждого. Например
> Иванов(1-25,1-36), Петров(6-36, 7-48), Сидоров (8-48,9-21).
не совсем понятно, но я предполагаю, что это номера служебных
телефонов. Это просто уточнение структуры
хранимой информации. т.е. каждый чел имеет два номера.
>  Как организовать дерево? Что объявить? Что-куда "запихивать"?
 
для начала, создаем структуру, которая описывате хранимые данные.
количество и типы полей НЕ обязателно соответсвуют столбцам таблицы.
просто в большинстве случаев это (их соответсявие) гораздо ....
ээээ.... проще.
Итак.
в начале Cpp файла (апосля инклюдов и прагм) объявляем (применительно
к твоему примеру ):

Код:
 
typedef struct
{
 Ansistring Name; //-- ФИО
 Ansistring tel1, tel2; //-- телефоны
}TPeople;
 

 
далее, как строить дерево.
 
где - сам решай. как:

Код:
 
__fastcall Func()
{
 TVirtualNode *Node;
 TPeople *dat;
 
 trPep->RootNodeCount=0;    ///------>>>>>trPep - твое дерево VirtualStringTree
 trPep->NodeDataSize=sizeof(TPeop);
 int cnt=???; //-- количество людей
  for (int i=0; i <cnt; i++)
  {
   Node=trPep->AddChild(NULL,NULL);
   dat= (TPeop*)trPep->GetNodeData(Node);
   dat->Name = "XXXXXXXXX";
   dat->tel1 = "111111111";
   dat->tel2 = "222222222";
  }
  //-- далее необязательные но логичные по сути телодвижения
  //-- 1. принудительная сортировка
  trPep->SortTree(0/*колонка дерева*/,trPep->Header->SortDirection,true);
  //--2. первый элемент делаем текущим
  trPep->FocusedNode=trPep->GetFirst();
  trPep->Selected[trPep->FocusedNode]=true;
  //-- 3. скролл дерева для показа в области отображения текущего элемента
  trPep->ScrollIntoView(trPep->FocusedNode,true,true);
  //-- управление командами редактирования
  if (trPep->RootNodeCount==0)
  {
   cmEdit->Enabled=false;
   cmDel->Enabled=false;
  }
 

 
 
>>>   Node=trPep->AddChild(NULL,NULL);
   !!!! в этой строке задается структура дерева. если вместо первого
   параметра давать не NULL а ссылку на узел ( TVirtualNode *Node), то
   указанный узел будет родителем для вставляемого.
 
  ну, я думаю, что колонки в дерево ты сможешь добавить сам.
 
  далее, как дерево будет сортировать данные. Тут я немного сокращу
  повествование, устал после работы, но думаю будет понятно.
 
  извини, адаптируй к примеру сам. событие OnCompareNodes дерева:
 

Код:
 
void __fastcall TwinAgents::trAgCompareNodes(TBaseVirtualTree *Sender,
      PVirtualNode Node1, PVirtualNode Node2, TColumnIndex Column,
      int &Result)
{
 TAg* dat1= (TAg*)trAg->GetNodeData(Node1);
 TAg* dat2= (TAg*)trAg->GetNodeData(Node2);
 if (Column>0)
 {
  Result=CompareText(dat1->Name,dat2->Name);
 }
 else
 {
  Result=dat1->ID-dat2->ID;
 }
 
}
 

 
отображение СТРОКОВЫХ (И ТОЛЬКО!!!) данных в ячейках:
событие - OnGetText
 

Код:
 
void __fastcall TwinAgents::trAgGetText(TBaseVirtualTree *Sender,
      PVirtualNode Node, TColumnIndex Column, TVSTTextType TextType,
      WideString &CellText)
{
  TAg* dat= (TAg*)trAg->GetNodeData(Node);
 
  switch (Column)
  {
   case 0:
    {
     CellText=IntToStr(dat->ID);
     break;
    }
   case 1:
    {
     CellText=dat->Name;
     break;
    }
   case 2:
    {
     CellText=dat->Tel;
     break;
    }
  }
}
 

 
событие смены текущей строки - OnFocusChange
 
Внимание, парни. если есть вопросы прошу в мыло (я указал чуть выше) либо прямо в аську. Единственная просьба,  представляйтесь в начале разговора нормальными именами.
 
Да, еще, чтоб потом обид не было и разочарований. ВСЕ примеры ТОЛЬКО на С++ Builder. Дельфями не пользуюсь.
 
akaGM
с учетом вышесказанного разберешся, в исходнике на С++? У меня сейчас времени не хватает подробно расписывать.... вот после 20-23 сентября будет... сейчас могу скинуть кусок проекта (один из файлов) там все есть.
 
мугу сразу сюда запостить. Либо, если народ простит, то чуть позже с комментариями...
хотя там их будет просто куча. стока граблей, сразу все и не вспомниш.

Всего записей: 110 | Зарегистр. 11-12-2005 | Отправлено: 21:10 22-08-2006
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mrrex
ясн, спас...
т.к. я триВью вообще не знаю, мне всё равно на чём исходники...
лично я подожду до сентября...

Всего записей: 24116 | Зарегистр. 06-12-2002 | Отправлено: 22:17 22-08-2006
mrrex



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
akaGM
млин, да мне ж потом стыдна будет!
 
Пример будет слегка изменен, относительно того, как я видел в авторском тексте.
Это реально работающий код для C++ Builder 5/6/2006
 
сперва создаем файл, который будет описывать 'внедряемый' объект редактирования
 
назовем его unt_PropEdit.h
 

Код:
 
#include "VirtualTrees.hpp"
 
#ifndef unt_PropEditH
#define unt_PropEditH
//---------------------------------------------------------------------------
//-- редактор свойств для дерева характеристик экземпляров
class TEditLink : public IVTEditLink {
   ULONG FRefCount;                    //  used by our own implementation of the interface
protected:
   // private members
   void __fastcall EditWindowProc                 (TMessage &Message);
   void __fastcall EditKeyDown                    (TObject* Sender, WORD &Key, TShiftState Shift);
public:
   TWinControl*        FEdit;          //  regardless of the type of edit control we use
   int   FColumn;                      //  we save our own info about,
   TBaseVirtualTree*   FTree;          //  parent, tree, node, column and our data
   TVirtualNode*       FNode;
   TWndMethod          FOldEditProc;   //  used to capture some important messages
   TColor              FColor;         //-- цвет элемента управления
   bool  FStopping;                    //  local merker
    // Constructor/Destructor
    __fastcall TEditLink(TBaseVirtualTree* Tree, TVirtualNode* Node, TColumnIndex Column,TColor Color=clWhite);
    //-- параметр TColor - моя художественная вольность
    // IUnknown members
    virtual ULONG    __stdcall AddRef         ();
    virtual ULONG    __stdcall Release        ();
    virtual HResult  __stdcall QueryInterface (const GUID& IID, void** ppv);
    // IVTEditLink members
    virtual bool     __stdcall BeginEdit      (void);
    virtual bool     __stdcall CancelEdit     (void);
    virtual bool     __stdcall EndEdit        (void){return true;};
    virtual bool     __stdcall PrepareEdit    (TBaseVirtualTree* Tree, PVirtualNode Node, TColumnIndex Column) {return false;};
    virtual TRect    __stdcall GetBounds      (void);
    virtual void     __stdcall SetBounds      (const TRect R);
    virtual void     __stdcall ProcessMessage (Messages::TMessage &Message);
};
 
#endif
 

 
практически это просто шаблон класса, который, если вы используете подобные редакторы во множестве мест, позволит
вам существенно упростить код проекта.
 
далее идет собственно реализация. Да, обратите внимание на комментарии со словом ГРАБЛИ.
Это критичные места, на которых я спотыкался.
 
да, еще, этот файл - называется unt_PropEdit.cpp

Код:
 
//---------------------------------------------------------------------------
#include <ComCtrls.hpp>
#include "unt_PropEdit.h"
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma package(smart_init)
//===========================================================================
//----------------- Редактор свойств ТТХ -------------------------------------------
__fastcall TEditLink::TEditLink(TBaseVirtualTree* Tree, TVirtualNode* Node, TColumnIndex Column, TColor Color)
{
 FRefCount = 0;
 FTree     = Tree;
 FNode     = Node;
 FColumn   = Column;
 FStopping = false;
 FEdit     = NULL;
 FColor    = Color;   //-- цвет элемента управления по умолчанию "белый"
}
 
void __fastcall TEditLink::EditWindowProc(TMessage &Message)
{
 // here we can capture some messages for keeping track of focus changes
 AnsiString ControlClass=FEdit->ClassName();
 switch (Message.Msg)
 {
  case WM_KILLFOCUS:
   if (ControlClass!="TDateTimePicker")
   {
    //### для обычных контролов!
    //-- если у нас не ввод даты (с выпадающим списком)
    EndEdit();
    if ((int)FTree->Handle != Message.WParam)
     SetFocus((HWND)Message.WParam);
   }
   else
   {
    //-- ГРАБЛИ!
    //-- если у нас ввод даты то при потере фокуса получим фокус (!!)
    //-- для предотвращения приколов (когда мы не можем воспользоваться выпадающим
    //-- диалоговым окном) введено это условие.
    if (((TDateTimePicker*)FEdit)->DroppedDown)
    {
     FOldEditProc(Message);
    }
    else
    {
     //-- если дата без выпадающего списка и теряем фокус ввода, тогда по старой схеме -
     //-- конец редактирования.
     EndEdit();
     if ((int)FTree->Handle != Message.WParam)
      SetFocus((HWND)Message.WParam);
    }
   }
   break;
  default:
   FOldEditProc(Message);
 }
}
//---------------------------------------------------------------------------
 
#pragma argsused
void __fastcall TEditLink::EditKeyDown(TObject* Sender, WORD &Key, TShiftState Shift)
{
 //  als Key hat man hier: VK_HOME VK_END VK_UP VK_DOWN VK_PRIOR VK_NEXT VK_ESCAPE VK_RETURN
 AnsiString ControlClass=FEdit->ClassName();
 bool Handled = false;
 if (FTree->FocusedNode && (Key == VK_ESCAPE))
 {
  CancelEdit();
  FTree->Selected[FTree->FocusedNode] = true;
  Handled = true;
 }
 if (FTree->FocusedNode && (Key == VK_RETURN))
 {
  EndEdit();
  FTree->Selected[FTree->FocusedNode] = true;
  Handled = true;
 }
 //-- здесь мы обработаем нажатие на клавишу Del для ссылочного типа
 //-- ГРАБЛИ!
 //-- это просте пример недефолтовой обработки клавиш во встраиваемом редакторе
 if ((!Handled) && (ControlClass== "TComboBoxEx") && (Key==46))
 {
  ((TComboBoxEx*)Sender)->ItemIndex=-1;
  Handled = true;
 }
 if (Handled) Key = 0;
}
//---------------------------------------------------------------------------
 
bool __stdcall TEditLink::BeginEdit(void)
{
 bool Result = !FStopping;
 if (Result && (FEdit != NULL))
 {
  FEdit->Show();
  FEdit->SetFocus();
  FOldEditProc = FEdit->WindowProc;
  FEdit->WindowProc = &EditWindowProc;
 }
 return(Result);
}
//---------------------------------------------------------------------------
 
bool __stdcall TEditLink::CancelEdit(void)
{
 bool Result = FStopping;
 if (!FStopping)
 {
  FStopping = true;
  if (FEdit != NULL)
  {
   FEdit->WindowProc = FOldEditProc;
   FEdit->Hide();
  }
  FTree->CancelEditNode();
 }
 return(Result);
}
//---------------------------------------------------------------------------
 
TRect __stdcall TEditLink::GetBounds(void)
{
 TRect R;
 if (FEdit != NULL) R = FEdit->BoundsRect;  else  memset(&R, 0, sizeof(TRect));
 return(R);
}
//---------------------------------------------------------------------------
 
void __stdcall TEditLink::SetBounds(const TRect R)
{
 //--ГРАБЛИ!!!
 //-- эта функция управляет как встраиваемый компонент редактирования  
 //-- вписывается в ячейку дерева.
 //-- небольшая поправка для редактирования текста
 if (!FStopping && (FEdit != NULL))
 {
  //-- коррекция позиции элемента редактирования
  int Left,Right;
  TRect Ro;
  AnsiString ClassControl=FEdit->ClassName();
  if (ClassControl=="TMemo")
  {
   FEdit->BoundsRect = ((TVirtualDrawTree*)FTree)->Header->Columns->Items[1]->GetRect() ;
   FEdit->Left-=2;
   FEdit->Top-=2;
   FEdit->Width+=2;
   FEdit->Height=((TVirtualDrawTree*)FTree)->Height-((TVirtualDrawTree*)FTree)->Header->Height-2;
  }
  else
  {
   ClassControl=FTree->ClassName();
   //-- для точного позиционирования необходимо узнать ТОЧНОЕ расположение
   //-- колонки в окне, с учетом возможного сдвига полосой скроллинга
   if (ClassControl=="TVirtualDrawTree")
   {
    ((TVirtualDrawTree*)FTree)->Header->Columns->GetColumnBounds(FColumn,Left,Right);
    Ro=((TVirtualDrawTree*)FTree)->Header->Columns->Items[FColumn]->GetRect();
   }
   else
   {
    ((TVirtualStringTree*)FTree)->Header->Columns->GetColumnBounds(FColumn,Left,Right);
    Ro=((TVirtualStringTree*)FTree)->Header->Columns->Items[FColumn]->GetRect();
   }
   //-- установка откорректированной позиции слева и справа (точно по границам включая и сами границы)
   Ro.Left=Left;
   Ro.Right=Right;
   //-- чтобы максимально раздвинуть вверх и вниз захватываем границы ячейки
   Ro.Top=R.Top-1;
   Ro.Bottom=R.Bottom+1;
   FEdit->BoundsRect = Ro;
  }
   
  //-- ВНИМАНИЕ!!!! В этом блоке комментариев соджержится текст, который изначально был в примере
  //-- автора компонента.
  /*  //-- коррекция позиции элемента редактирования
  TRect Ro=FTree->Header->Columns->Items[FColumn]->GetRect();
  Ro.Top=R.Top-1;
  Ro.Left-=2;
  Ro.Right-=2;
  Ro.Bottom=R.Bottom+1;
  FEdit->BoundsRect = Ro;*/
 }
}
//---------------------------------------------------------------------------
 
void __stdcall TEditLink::ProcessMessage(Messages::TMessage &Message)
{
 FEdit->WindowProc(Message);
}
//---------------------------------------------------------------------------
 
ULONG __stdcall TEditLink::AddRef()
{                  //  Implement IUnknown interface
 return InterlockedIncrement((LPLONG)&FRefCount);        //  thread safe increment
}
//---------------------------------------------------------------------------
 
ULONG __stdcall TEditLink::Release()
{                 //  Implement IUnknown interface
 InterlockedDecrement((LPLONG)&FRefCount);               //  thread safe decrement
 if (FRefCount == 0)
 {                                   //  if last user then
  delete this;                                        //    delete myself
  return 0;                                           //    => 0 !
 }
 return FRefCount;                                       //  return internal counter
}
//---------------------------------------------------------------------------
 
HResult  __stdcall TEditLink::QueryInterface(const GUID& IID, void**ppv)
{
 if (IID == __uuidof(IUnknown))                          //  IUnknown as basic interface
  *ppv = (IUnknown*)this;
 else
  if (IID == __uuidof(IVTEditLink))                  //  i am self
   *ppv = (IVTEditLink*)this;
  else
  {
   *ppv = NULL;                                        //  unknowm interface
   return E_NOINTERFACE;
  }
 ((IUnknown*)(*ppv))->AddRef();                          //  increment if used
 return S_OK;                                            //  Ok !
}
 

 
ПРОДОЛЖЕНИЕ СЛЕДУЕТ....

Всего записей: 110 | Зарегистр. 11-12-2005 | Отправлено: 23:14 22-08-2006 | Исправлено: mrrex, 23:15 22-08-2006
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ок, демку запросил...
 
ты эта... код под псевдотегом "more" скрывай, а то обидятся ещё...
 
самый последний в:
http://i.ru-board.com/codes.html

Всего записей: 24116 | Зарегистр. 06-12-2002 | Отправлено: 23:28 22-08-2006
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » VirtualTreeView


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru