Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30

Связывание элементов ListView c TObject

01.08.2012, 13:40. Показов 2469. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу понять как получить доступ к объекту связаному с ним TListItem
В ListBox это можно было сделать через ListBox1->Items->Objects[index]

Связываю так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
std::auto_ptr<TStringList> SL(new TStringList);
FindFiles(SL.get() );
 
for( int i=0;i<SL->Count;i++)
 {
  TLink *Obj = new TLink ;
  Obj->ExePath= SL->Strings[i];
  Obj->Update();
  ListView1->AddItem(Obj->ExeName,dynamic_cast<TObject*>(Obj) ) ;
  ListView1->Items->Item[ListView1->Items->Count-1]->ImageIndex=
    ImageList1->AddIcon(Obj->Icon);
  //ListBox1->Items->AddObject(Obj->ExeName,dynamic_cast<TObject*>(Obj) );
 }
}
//---------------------------------------------------------------------------
C++
1
2
3
4
5
6
//---------------------------------------------------------------------------
void __fastcall TForm1::ListView1Click(TObject *Sender)
{
 // dynamic_cast<TLink*>(ListBox1->Items->Objects[ListBox1->ItemIndex])->Execute();
}
//---------------------------------------------------------------------------
TLink мой компонент наследующий TObject;
Update()- метод TLink получающий иконку файла ;
FindFiles() - получает список файлов;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.08.2012, 13:40
Ответы с готовыми решениями:

Cannot convert 'void (_fastcall * (_closure )(TObject *,char &))(TObject *,char &)' to 'TKeyPressEvent'
доброго времени суток. роект был создан в builder 2007, а при попытке его скомпилировать на rad studio 2010 выдается ошибка: ...

Связывание ArrayList и ListView
Добрый день. Никак не могу решить проблему. Есть ListView, есть заполненный arraylist. Как связать их? Максимум что получилось, это...

При связывание listview с разными объектами использовать разные шаблоны
Необходимо при связывание listview с разными объектами использовать разные шаблоны. Может кто знает/сталкивался?

12
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
02.08.2012, 09:38
AObject is an object that you can associate with the item. It becomes the value of the new TListItem object's Data property.
, поэтому обращаться через свойство Data:
C++
1
2
3
4
5
void __fastcall TForm1::ListView1Click(TObject *Sender)
{
    // dynamic_cast<TLink*>(ListBox1->Items->Objects[ListBox1->ItemIndex])->Execute();
    reinterpret_cast<TLink*>(ListView1->Selected->Data)->Execute();
}
2
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.08.2012, 10:59  [ТС]
Спасибо, т
только настораживает reinterpret_cast<> почему там void* вместо TObject* ???

Добавлено через 23 минуты
Остальная часть кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
namespace my{   //--------------------------- My ----------------------------
//---------------------------------------------------------------------------
class TBaseLink: public TObject
{
  protected:
 
   String FExePath;
   TIcon *FIcon;
 
   virtual void SetExePath(String AExePath)=0;
   virtual void SetExeName(String AExeName)=0;
   virtual void SetIcon(TIcon *AIcon)=0;
 
   virtual String GetExePath()const =0;
   virtual String GetExeName()const =0;
   virtual String GetExeDir()const =0;
 
   virtual TIcon* GetIcon() =0;
 
 public:
 
   __fastcall TBaseLink():FExePath(String()),FIcon(new TIcon){};
   __fastcall TBaseLink(String AExePath):FExePath(AExePath),FIcon(new TIcon){};
 
   __fastcall ~TBaseLink(){ delete FIcon; };
 
   virtual bool Execute()const =0;
   virtual bool Exists() const =0;
   virtual bool Update() =0;
 
  __property TIcon* Icon={write=SetIcon,read=GetIcon};
  __property String ExePath={write=SetExePath,read=GetExePath};
  __property String ExeName={write=SetExeName,read=GetExeName};
  __property String ExeDir={read=GetExeDir};
};
//---------------------------------------------------------------------------
class TLink1: public TBaseLink
{
 protected:
 
   virtual void SetExePath(String AExePath){ FExePath= AExePath;  }
   virtual void SetExeName(String AExeName){ FExePath= ExeDir+"\\"+AExeName;  }
   virtual void SetIcon(TIcon *AIcon){ FIcon->Assign(AIcon); } ;
 
   virtual String GetExePath()const{ return FExePath;};
   virtual String GetExeName()const{ return ExtractFileName(FExePath); };
   virtual TIcon* GetIcon(){ return FIcon; };
   virtual String GetExeDir()const{ return ExtractFileDir(FExePath);} ;
 
 
 public:
 
   virtual bool Execute()const
     {
       ShellExecute(NULL,"open",ExePath.c_str(),NULL,ExeDir.c_str(),SW_RESTORE);
       return true;
     };
   virtual bool Exists() const{ return FileExists(ExePath);};
 
   virtual bool Update()
     {
       WORD i=0;
       String AssPath = ExePath;
       Icon->Handle= ExtractAssociatedIcon(Application->Handle,AssPath.c_str(),&i);
       return Icon->Handle;
     };
 
   virtual bool Location()
     {
       ShellExecute(NULL,"open",ExeDir.c_str(),NULL,NULL,SW_RESTORE);
       return true;
     };
};
//--------------------------------------------------------------------------
typedef TLink1 TLink;
} //---------------------------- My ----------------------------------------
 
//--------------------------------------------------------------------------
using namespace my;
//--------------------------------------------------------------------------
void FindFiles(TStrings *SL)
{
 TSearchRec sr;
  if (FindFirst("*.*", faAnyFile | faDirectory, sr) == 0)
    {
     if (sr.Name!="." && sr.Name!="..") SL->Add(sr.Name);
     while (FindNext(sr) == 0) if (sr.Name!="." && sr.Name!="..")  SL->Add(GetCurrentDir()+"\\"+sr.Name);
    }
 FindClose(sr);
}
//---------------------------------------------------------------------------
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
02.08.2012, 11:23
Настораживает reinterpret_cast - используй static_cast (при преобразовании из void* этого достаточно).

А насчет типа - вопрос надо задавать не "почему Data имеет тип void*, а не TObject*?", а "почему AddItem вторым параметром принимает TObject*, а не void*?", мне же может понадобиться записать туда не потомка TObject, тогда что, и при создании айтема reinterpret_cast использовать?
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.08.2012, 12:00  [ТС]
Что то не понял...

Во первых игры с reinterpret_cast<> и void* кажутся потенциально опасными.

Во вторых зачем тогда TObject и вся иерархия классов если к ней не привязываться...

Добавлено через 4 минуты
и при создании айтема reinterpret_cast использовать?
Думаю именно так должно быть, покрайней мере так в хелпе (кажется пример с ComboBox-ом.)

Добавлено через 16 минут
http://docs.embarcadero.com/pr... jects.html
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
02.08.2012, 16:33
Цитата Сообщение от Avazart Посмотреть сообщение
Во вторых зачем тогда TObject и вся иерархия классов если к ней не привязываться...
Да нет, правильно UI говорит - AddItem() описана несколько нелогично. Логично было бы оставить возможность связывать указатели на любые объекты, не ограничиваясь потомками TObject.
И отвечая на риторический вопрос по иерархии - сам факт существования vcl не является достаточным условием наследовать от ее типов всегда, иногда это не нужно.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.08.2012, 16:37  [ТС]
сам факт существования vcl не является достаточным условием наследовать от ее типов всегда, иногда это не нужно
Для это и есть reinterpret_cast<> и который более опасный чем другие касты.

См. пример из справки с ComboBox

Добавлено через 1 минуту
C++
1
2
// Add View styles and constants to the Combo Box
ComboBox1->Items->AddObject("vsIcon", reinterpret_cast<TObject *>(vsIcon));
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
02.08.2012, 17:02
Цитата Сообщение от Avazart Посмотреть сообщение
См. пример из справки с ComboBox
Дался тебе этот ComboBox... Пойми, то, что у ComboBox-а есть Objects - не его (в некотором смысле) заслуга. Это, скорее, побочный эффект от наличия свойства Objects в классе TStrings, в котором и хранятся айтемы комбобокса. Ну, про TStrings рассказывать не буду - это совершенно особый класс, там действительно нужно свойство Objects (причем отнюдь не только для того, чтобы ComboBox мог хранить в нем ассоциированные с данными объекты).

А вот у ListView/TreeView ситуация другая. Ни айтем первого (TListItem), ни айтем второго (TTreeNode) списком строк не является, поэтому Objects там нет. А чтобы все-таки иметь возможность ассоциировать данные (данные, не объекты) введено свойство Data. Но вот прототип AddItem сводит всё на нет: несмотря на то, что я и в Дельфи (не наследуясь от TObject, используя расширенные записи) и в Билдере могу создать объект, не имеющий ничего общего с TObject, метод AddItem заставляет меня делать тайпкаст к TObject. Было бы описано как положено - на фиг бы тут reinterpret_cast не сдался, а при обратном приведении (от void* к исходному типу) он тем более не нужен.
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.08.2012, 17:16  [ТС]
используя расширенные записи
Не пойму что тут имеется ввиду ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
02.08.2012, 23:34
Имеется в виду то, что если делать класс в Дельфи - то это по любому наследник TObject (даже без указания предка - подразумевается, что предок TObject). А если сделать расширенную запись:
Delphi
1
2
3
4
5
type
   TMyRec = record
      constructor Create;
      // В Дельфи 2009+ можно использовать конструкторы, свойства, статические методы, ...
   end;
, то этот тип потомком TObject не будет. И почему я не могу создать себе вот такой объект, а должен тащить TObject?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.08.2012, 23:51  [ТС]
И почему я не могу создать себе вот такой объект, а должен тащить TObject?
Для общей совместимости, так как в TObject хранится необходимый минимум, например метаиформацию (т.е. инфy о самом себе)
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.08.2012, 15:32
Avazart, всем, я думаю, и так понятно, зачем это может быть нужным. Вопрос поставлен иначе - почему это подразумевается в обязательном порядке, если в самом языке присутствуют возможности использования данных указателей по иному назначению.
Прошу воспринимать это как уточнение - не выпад.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.08.2012, 16:45  [ТС]
Ну я не особо в этом...Поэтому я не могу сказать точно почему и как... хотелось бы разобраться...

Но как я понял почему то перед void* предпочитают использовать базовый класс как мне показалось...

Возможно это как то связано с тем что компилятор о TObject* знает хоть что-то ( а возможно необходимое ), а void* совсем ничего и это что то дает какую то безопастность при касте - но это только моё предположение...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.08.2012, 16:45
Помогаю со студенческими работами здесь

Связывание элементов Swing
В интерфейсе среды NetBeans есть три элемента: кнопка JButton, поле jTextField и JList. Скажите пожалуйста, с помощью чего эти элементы...

Связывание двух элементов
Добрый день, подскажите пожалуйста как при выборе вкладки &quot;имя&quot; в Mainmenu в tmemo появлялось например &quot;дмитрий&quot; , имя берется...

ListView, удаление элементов. Неверно считается количество элементов после удаления
ListView добавляю 5 элементов , добавление элементов происходит в таймере Добавляю mageList.Images.Add(image); ListViewItem lvi...

TObject
В книге прочитал про какой-то базовый класс TObject. Что это за класс? И что означает это type MyClass = class(TObject);

Наследник от TObject
Приветствую всех. Я создаю свой класс. Подскажите, наследовать его от класса TObject или создавать с нуля? Точнее, что я выигрываю, если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru