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

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

01.08.2012, 13:40. Показов 2451. Ответов 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
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 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
8484 / 6151 / 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
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
02.08.2012, 11:23
Настораживает reinterpret_cast - используй static_cast (при преобразовании из void* этого достаточно).

А насчет типа - вопрос надо задавать не "почему Data имеет тип void*, а не TObject*?", а "почему AddItem вторым параметром принимает TObject*, а не void*?", мне же может понадобиться записать туда не потомка TObject, тогда что, и при создании айтема reinterpret_cast использовать?
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 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
8484 / 6151 / 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
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 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
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.08.2012, 17:16  [ТС]
используя расширенные записи
Не пойму что тут имеется ввиду ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33371 / 21497 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 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
8484 / 6151 / 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
8484 / 6151 / 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
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru