Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 824

/ вопрос открыт /

Здравствуйте, господа Эксперты!
Помогите решить проблему! Как связать treeview и listview? Необходимо, чтобы при выборе нода отображались несколько строк в listview, относящихся к выделенному ноду.
При использовании метода AddObject, в дерево добавляется новый нод. Подскажите плз, как решить эту проблемму?

Приложение:
  1.  
  2.  
  3. TreeView(Root) ListView
  4.  
  5.  
  6. |--- [Item2] |
  7. |--- Item3 |
  8.  
  9.  
  10.  
  11. TreeView(Root) ListView
  12.  
  13.  
  14.  
  15. |--- [Item3] |
  16.  
  17.  


Чарик Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Чарик (статус: Посетитель)
Вопрос отправлен: 27 февраля 2010, 17:24
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 9 марта 2010, 10:44; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 27 февраля 2010, 17:39 [#1]:

Могу предложить написать новый класс-наследник TTreeNode, который будет отвечать за создание, хранение и освобождение информации, выводимой в ListView. ИМХО, так будет проще, чем связывать разные куски данных через свойство TTreeNode.Data.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

27 февраля 2010, 19:45: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А.

Чарик

Чарик (статус: Посетитель), 28 февраля 2010, 16:31 [#2]:

min@y™:
Спасибо за предложение написать новый класс-наследник. Хочется разобраться как сделать связь TreeView+ListView
min@y™

min@y™ (статус: Доктор наук), 28 февраля 2010, 19:26 [#3]:

Цитата (Чарик):

Спасибо за предложение написать новый класс-наследник. Хочется разобраться как сделать связь TreeView+ListView

Не надо связывать TreeView+ListView. Надо использовать TreeView для хранения древовидной структуры, а ListView - только для отображения данных, привязанных к каждому узлу.
Чем я могу помочь?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Чарик

Чарик (статус: Посетитель), 28 февраля 2010, 19:46 [#4]:

Как можно добавить данные в существующий нод дерева при добавлении в listView? Вернее "привязать" новую строку listViewa?
min@y™

min@y™ (статус: Доктор наук), 28 февраля 2010, 20:14 [#5]:

Очень просто.
Создаёшь класс-наследник от TTreeNode и вертишь им как хош.
Если все ноды однотипные, то можно воспользоваться и событием OnCreateNodeClass. Если нет - чуть сложнее (создавать вручную). Я могу. Могу примерчик дать. Этот пример типа "просто посмотреть", использовать ты его не сможешь.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Чарик

Чарик (статус: Посетитель), 6 марта 2010, 22:07 [#6]:

min@y™: Если бы ты мне дал примерчик, было бы просто замечательно! А то даже на необъемных просторах интернета ничего толкового не могу найти...
min@y™

min@y™ (статус: Доктор наук), 7 марта 2010, 10:00 [#7]:

Цитата (Чарик):

Если бы ты мне дал примерчик, было бы просто замечательно!

Я так прикинул, посмотрев свои исходники, что ты в них не разберёшься. Уж очень специфический у меня код, заточенный под конкретные задачи. Конечно, могу выслать (куда, кстати?), мне не жалко. Но, думаю, будет лучше написать для тебя класс под твою задачу, она у тебя гораздо проще.

Вот, набросал тебе небольшую заготовку, посмотри:

interface
 
uses
  Classes, ... ;
 
type
  // Класс для хранения информации об одном строке ListView
  TListViewItemInfo = class
  private
    FCaption: string;
    FSubItems: TStrings;
    FImageIndex: Integer;
  public
    constructor Create;
    destructor Destroy; override;
 
    property Caption: string read FCaption write FCaption;
    property SubItems: TStrings read FSubItems;
    property ImageIndex: Integer read FImageIndex write FImageIndex;
  end;
 
  // Класс-потомок TTreeNode со списком экземпляров TListViewItemInfo
  TLviNode = class(TTreeNode)
  private
    FLviList: TObjectList; // Список из экземпляров TListViewItemInfo
 
    function GetLviCount: Integer;
    function GetLviInfo(const Index: Integer): TListViewItemInfo; // доступ к элементам списка
  public
    constructor Create(AOwner: TTreeNodes);
    destructor Destroy; override;
 
    function AddLviInfo(const ACaption: string): TListViewItemInfo; // Добавление экземпляров TListViewItemInfo
    //procedure DeleteLviInfo(const Index: Integer);
    //procedure MoveLviInfo(...);
    //procedure SortLviInfo(...);
    //и т.д.
 
    property LviCount: Integer read GetLviCount;
    property LviInfo[const Index: Integer]: TListViewItemInfo read GetLviInfo;
  end;
 
implementation
 
{ TListViewItemInfo }
 
constructor TListViewItemInfo.Create;
begin
  FCaption:= '';
  FImageIndex:= -1;
  FSubItems:= TStringList.Create();
end;
 
destructor TListViewItemInfo.Destroy;
begin
  FSubItems.Free();
  inherited;
end;
 
{ TLviNode }
 
constructor TLviNode.Create(AOwner: TTreeNodes);
begin
  inherited;
  FLviList:= TObjectList.Create(True);
end;
 
destructor TLviNode.Destroy;
begin
  FLviList.Free();
  inherited;
end;
 
function TLviNode.GetLviCount: Integer;
begin
  Result:= FLviList.Count;
end;
 
function TLviNode.AddLviInfo(const ACaption: string): TListViewItemInfo;
begin
  Result:= TListViewItemInfo.Create();
  Result.Caption:= ACaption;
  FLviList.Add(Result);
end;
 
function GetLviInfo(const Index: Integer): TListViewItemInfo;
begin
  if (Index > -1) and (Index < LviCount)
    then Result:= TListViewItemInfo(FLviList[Index])
    else Result:= nil;
end;
 
end.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Чарик

Чарик (статус: Посетитель), 9 марта 2010, 03:39 [#8]:

min@y™:
Спасибо большое! Обязательно попробую. А на данный момент организовал через файл mdb с сооветствующей структурой. Оказалось намного проще чем предполагал изначально. И еще раз спасибо!
Теперь другая проблема, не могу найти как базу запихать в ресурсы, т.е. скомпилировать в ехе...
min@y™

min@y™ (статус: Доктор наук), 9 марта 2010, 10:28 [#9]:

Цитата (Чарик):

Теперь другая проблема, не могу найти как базу запихать в ресурсы, т.е. скомпилировать в ехе...

Ты эту проблему сам создал. Нафига тут базу городить-то?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 9 марта 2010, 10:44 [#10]:

только не говорите, что база, которая сохраненная в exe ресурсах ещё должна быть редактируемой.
Если нет, то всё реально.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:38
Выполнено за 0.03 сек.