Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > C++ Builder
Перезагрузить страницу Как перетащить поддерево из одного в другое
Закрытая тема
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию Как перетащить поддерево из одного в другое - 02.10.2003, 15:48

Люди, помогите, плиз! Всю жизнь работал с математикой (минимум интерфейса ),а сейчас встала проблема - есть два представления, оба TreeView, надо перетащить поддерево из одного в другое (при этом возможен Multiselect). Как это сделать?
Заранее благодарен
  (#2 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 02.10.2003, 18:05

ну значит если ты собираешься перетаскивать в приделах одного приложения то все достаточно просто.

1) у дерева из которого собираешься перетягивать ставишь свойство DragMode=dmAutomatic
2) у того в которое собираешься бросать обрабатываешь событие OnDragOver. Примерно так:
Код:
void __fastcall TForm1::TreeView1DragOver(TObject *Sender, TObject *Source,
      int X, int Y, TDragState State, bool &Accept)
{
 if(String(Source->ClassName())=="TTreeNode"){
   Accept=true;
 };
}
в обработчике проверяешь что тащат и если то что тащат тебе в принципе подходит говоришь Accept=true;
3) у того в кого бросаешь обрабатываешь событие OnDragDrop.

вот в принципе в общих чертах все что надо для перетаскивания чего либо в пределах одного приложения.Для перетаскивания между приложениям делаетя через WinAPI как конкретно я не разбирался, но если очень надо могу разобраться ... за одно и для себя )
  (#3 (permalink)) Старый
AterMath AterMath вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.10.2003
По умолчанию Гык!!! - 02.10.2003, 19:28

Это я уже понял! Закавыка как раз в третьем пункте =)
Я сделал так:
Код:
void __fastcall TMainFrm::EmplListDragDrop(TObject *Sender,
      TObject *Source, int X, int Y)
{
    AudView->Items->BeginUpdate();
    if (Source != (TObject *)EmplList || EmplList->Selected == NULL)
  return;
    THitTests HT = AudView->GetHitTestInfoAt(X, Y);
    TNodeAttachMode AttachMode;
    TTreeNode *pItem = AudView->GetNodeAt(X, Y);
    if (HT.Contains(htOnItem) || HT.Contains(htOnIcon))
  AttachMode = naAddChild;
    else
  return;
    EmplList->Selected->MoveTo(pItem, AttachMode);
    AudView->Items->EndUpdate();

}
Здесь EmplList - тоже класса TTreeView. Но это не освободило от проблемы переноса нескольких записей, плюс сейчас я не могу осуществить drag-n-drop внутри дерева AudView А очень надо. Есть идеи - помогите пожалуйста.
  (#4 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 02.10.2003, 21:06

что значит "плюс сейчас я не могу осуществить drag-n-drop внутри дерева AudView" - это типа когда берешь из него то сразу курсорчик мыши показывает что на этом компоненте нельзя положить ?
если да, то выполни пункт 2 для AudView

Код:
if (Source != (TObject *)EmplList || EmplList->Selected == NULL)return;
здесь не совсем понятен смысл. во первых у "||" помоему приоритет выше чем у "!=" и "==" может я и не прав, но если поставить скобки хуже не будет. а вот с "Source != (TObject *)EmplList " - это как я понял проверка на то чтоб то что ты перетягиваешь оказалось объектом EmplList ? ... до меня как то не доходит смысл этого ... возможно тебе нужно было писать так
Код:
Sender != (TObject *)EmplList
тогда бы ты отсеивал все перетаскивания которые идут не из EmplList.
тут как бы хотелось уточнить что имелось в виду ...
  (#5 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 02.10.2003, 21:24

сори насчет вот этого
Код:
Sender != (TObject *)EmplList
я был не прав
Ads.
  (#6 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 02.10.2003, 21:31

и еще вот когда перетаскивания в одном дереве то , по-моему, вполне логично что там где было перетаскиваемое оно исчезает, а появляется в том месте куда перетянули, а вот когда в разных деревья тут принципиальный момент копируется или переносится ?
  (#7 (permalink)) Старый
Anonymous
Guest
 
Сообщений: n/a
По умолчанию 02.10.2003, 22:11

вот пример работающий почти корректно. На форме 2е TTreeView у них у обоих одинаковые обработчики OnDragDrop и OnDragOver их текст приведен ниже. и свойство DragMode=dmAutomatic

Код:
void __fastcall TForm1::TreeView1DragOver(TObject *Sender, TObject *Source,
      int X, int Y, TDragState State, bool &Accept)
{
 if(String(Source->ClassName())=="TTreeView"){
   Accept=true;
 };
}
//---------------------------------------------------------------------------

void __fastcall TForm1::TreeView2DragDrop(TObject *Sender, TObject *Source,
      int X, int Y)
{
  ((TTreeView*)Sender)->Items->BeginUpdate();
  ((TTreeView*)Source)->Items->BeginUpdate();
  TTreeNode *Reciver=((TTreeView*)Sender)->GetNodeAt(X, Y);
  if(Sender==Source){
    //перенос в себя
    ((TTreeView*)Source)->Selected->MoveTo(Reciver,naAddChild);
  }else{
   //перенос в другое дерево
    ((TTreeView*)Source)->Selected->MoveTo(Reciver,naAddChild);
  };
  ((TTreeView*)Source)->Selected=NULL;
  ((TTreeView*)Sender)->Selected=NULL;
  ((TTreeView*)Source)->Items->EndUpdate();
  ((TTreeView*)Sender)->Items->EndUpdate();
}
  (#8 (permalink)) Старый
AterMath AterMath вне форума
Новичок
 
Сообщений: 6
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 02.10.2003
По умолчанию Спасибо! - 09.10.2003, 20:59

Только мультиселект все равно не работает.. Но это я разберусь.
Господин модератор! Тему можно закрыть =)
Ads
Закрытая тема

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что-то с видеокартой или другое?? Дмитрий Жуков Любые вопросы от новичков 4 19.10.2011 18:45
gtx 580 или что-нибудь другое? Квач Богдан Видеокарты 62 06.02.2011 12:50
Копирование текста из одного окна в другое imported_Vegas Вопросы начинающих программистов 5 27.12.2010 20:18
Нехватает Питания Или Что-То Другое ? mers Видеокарты 32 20.12.2009 23:51
Сформировать поддерево с помощью цепных списков wish_to_know Lisp 2 23.06.2008 13:03
Как перейти с одного диалогового окна на другое окно Romeros Visual C++ 6 19.07.2007 13:59
поддерево nastjona Prolog 9 13.01.2007 13:50
Передача данных в другое окно DimkaG Delphi 4 26.05.2006 20:49
Как перетащить папку с дика E:/ на C:/ Devill C++ Builder 3 06.03.2006 09:35
Как перетащить форму в приложение Docent C++ Builder 6 02.07.2004 16:18
перетащить форму Escaper .NET 0 27.02.2004 19:32
Как вызвать другое приложение bat фаил Anonymous Visual C++ 5 11.09.2003 12:17



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов