Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 20.01.2018
Сообщений: 64

TreeView+StringGrid

04.08.2018, 09:18. Показов 4460. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Подскажите пожалуйста, как сделать так, чтобы выделенный узел в TreeView отображал данные в grid?

Например, есть дерево содержащее данные:
-номер УДК (родитель)
-ФИО автора (потомок)
-ФИО автора (потомок)

нужно чтобы выделенный пользователем потомок, отображал данные в таблице: название книги, кол-во экземпляров и год издания.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.08.2018, 09:18
Ответы с готовыми решениями:

Drag and Drop узла из TreeView в StringGrid
Привет. Есть вопрос (по применению drag and drop) при перетаскивании узла из treeView в StringGrid; На событии dragdrop stringgrid пишу: ...

Delphi 7 Stringgrid Нужно сделать цикл для заполнения Stringgrid данными из другого Stringgrid
Нужно чтобы из Stringgrid1 данные переносились в Stringgrid2 Но ТОЛЬКО ПО УСЛОВИЮ Таблицы Stringgrid2 На рис всё показано. За работающий...

Содержимое выделенной строки из первого StringGrid-а перенести во второй StringGrid
Нужно написать программу которая выполняет следующие действия. Есть два StringGrid. По нажатия на кнопку, Содержимое выделенной строки из...

45
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
31.08.2018, 22:08
Студворк — интернет-сервис помощи студентам
у вас никак не разделены добавление УДК в корневой раздел, добавление автора в УДК и добавление книг к автору
По сути, это все разные вещи.
Соответственно, интерфейс это все должен учитывать.
Но главное все-таки вы никак не можете описать вашу предметную область.
А там не все просто, между прочим.
Насколько я понимаю, УДК - это классификатор
Каждый автор может написать несколько книг
Кроме того у книги может быть несколько авторов
Соответственно, книга видимо тоже может быть сразу в нескольких разделах
Поэтому все запутывается еще больше.


У вас должны быть
1. список УДК
2. список авторов
3. список книг
4. список записей вида КНИГА-УДК. Связь многие ко многим
5. список записей вида КНИГА-АВТОР. Связь многие ко многим

по 3 и 4 находим все УДК, которые будут отображаться
проходим по 1 и опять по 4, находим авторов для каждого удк

при клике на автора бежим по 5 и 4 получаем список книг этого автора в ЭТОМ разделе УДК

так-то дофига

вот теперь если я все правильно написал, начинаем писать классы для работы с данными
0
0 / 0 / 0
Регистрация: 20.01.2018
Сообщений: 64
31.08.2018, 23:15  [ТС]
krapotkin, а вы могли бы подсказать, как мне сделать связь между узлами в дереве и гридом? Мне бы хотя бы это сделать...я на большее уже не надеюсь)Или с тем, что дано в моем коде этого сделать невозможно?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
01.09.2018, 11:01
я вам дал полный код, как объединяется клик по узлу с отображением в гриде
я не понимаю, что ЕЩЕ нужно?


описание класса
Delphi
1
2
3
4
5
TNodeOptions=class
      Naz:string;
      Col:string;
      God:string;
end;
создание объекта этого класса obj И узла дерева node И запоминание в node ссылки на obj
Delphi
1
2
3
4
5
6
obj := TNodeOptions.Create;
obj.Naz := 'aaa';
obj.Col := 'bbb';
obj.God := 'ccc';
node := TreeView1.Items.AddChild(ParentNode, 'AAAAAAA');
node.data := pointer(obj);
действия при клике по узлу дерева
Delphi
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
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  // тут неплохо бы определить, что изображает этот узел
  // УДК или Автора
  if node.level =1 then
   showNodeProps(NODE);
end;
 
procedure TForm1.ShowNodeProps(Node: TTreeNode);
var obj:TNodeOptions;
begin
  if Node=NIL then
    exit;
  obj:=TNodeOptions(node.data);
  if obj=NIL then
  begin
    grid1.cells[0,0] := '';
    grid1.cells[0,1] := '';
    grid1.cells[0,2] := '';
    exit;
  end;
  grid1.cells[0,0] := obj.Naz;
  grid1.cells[0,1] := obj.Col;
  grid1.cells[0,2] := obj.God;
end;
вот ЭТО по идее заточено под ОДНУ книгу ОДНОГО автора
но этот код собсно происходит из вашей структуры данных
поэтому я и написал пост#21

в чем проблема-то, вы не до конца понимаете что там написано?
кроме того, там был вопрос и вы опять на него не ответили

Добавлено через 2 часа 20 минут
вот кстати, какая структура должна работать, если мои предположения о ТЗ верны
Кликните здесь для просмотра всего текста
Delphi
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
unit UMyClasses;
 
interface
uses Types, Classes, Contnrs;
 
type
  TUdk=class
    N:integer;
    Name:string;
  end;
  TUdkList=class(TObjectList)
    property Items[index:Integer] : TUdk read GetItems write SetItems;
  end;
 
  TAuthor=class
    LName,FName,SName:string;
  end;
  TAuthorList=class(TObject)
    property Items[index:Integer] : TAuthor read GetItems write SetItems;
  end;
 
  TBook=class
    name:string;
  end;
  TBookList=class
    property Items[index:Integer] : TBook read GetItems write SetItems;
  end;
 
  TAuthorBookLink=class
    book:TBook;
    author:TAuthor;
  end;
  TAuthorBookList=class(TObjectList)
  public
    procedure AuthorsOfBook(ABook:TBook; AResultList:TAuthorkList):
    procedure BooksOfAuthor(AAuthor:TAuthor; AResultList:TBookList):
    property Items[index:integer] : TAuthorBookLink read GetItems write SetItems;
  end;
 
  TUdkBookLink=class
  public
    UDK:TUdk;
    Book:TBook;
  end;
  TUdkBookList=class(TObjectList)
  public
    procedure UdksOfBook(ABook:TBook; AResultList:TUdkList):
    procedure BooksOfUdk(AAuthor:TAuthor; AResultList:TBookList):
    property Items[index:Integer] : TUdkBookLink read GetItems write SetItems;
  end;
 
implementation
...


Добавлено через 59 секунд
я тут опустил private GetItems/SetItems чтобы не захламлять основное
1
0 / 0 / 0
Регистрация: 20.01.2018
Сообщений: 64
02.09.2018, 17:40  [ТС]
krapotkin, на этом событии возникает ошибка "showNodeProps(NODE);". Скажите пожалуйста, как исправить?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
02.09.2018, 21:47
какая ошибка?
когда возникает?
0
0 / 0 / 0
Регистрация: 20.01.2018
Сообщений: 64
02.09.2018, 23:10  [ТС]
krapotkin, вот в этом месте "showNodeProps(NODE);". Компилятор выдает ошибку "variable node might not have been initialized"
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
03.09.2018, 08:27
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
// тут неплохо бы определить, что изображает этот узел
// УДК или Автора
if node.level =1 then
showNodeProps(NODE);
end;
1. это не ошибка (Error), а предупреждение (Warning)
2. тут даже предупреждение точно возникyть не может.
3. или у вас другой код?
0
0 / 0 / 0
Регистрация: 20.01.2018
Сообщений: 64
05.09.2018, 13:20  [ТС]
krapotkin, вот ваш код. Я его добавила в программу, но он не работает. Скорее всего, я не правильно его вписала. Посмотрите пожалуйста?
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, Grids, Buttons;
 
      type
 
      TNodeOptions=class
      Naz:string;
      Col:string;
      God:string;
end;
type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Edit2: TEdit;
    TreeView1: TTreeView;
    Button1: TButton;
    procedure BitBtn1Click(Sender: TObject);
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
 
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.BitBtn1Click(Sender: TObject);
var
 obj:TNodeOptions;
Node:TTreeNode;
begin
 obj := TNodeOptions.Create;
obj.Naz := 'aaa';
obj.Col := 'bbb';
obj.God := 'ccc';
Node:=TreeView1.Items.AddFirst(TreeView1.Selected,Edit1.text);
node.data := pointer(obj);
end;
 
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
 
  if node.level =1 then
   showNodeProps(NODE);
end;
 
procedure TForm1.ShowNodeProps(Node: TTreeNode);
var obj:TNodeOptions;
begin
  if Node=NIL then
    exit;
  obj:=TNodeOptions(node.data);
  if obj=NIL then
  begin
    Stringgrid1.cells[0,0] := '';
    Stringgrid1.cells[0,1] := '';
    Stringgrid1.cells[0,2] := '';
    exit;
  end;
  Stringgrid1.cells[0,0] := obj.Naz;
  Stringgrid1.cells[0,1] := obj.Col;
  Stringgrid1.cells[0,2] := obj.God;
end;
 
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
 NewwNode:TTreeNode;
 begin
  NewwNode:=TreeView1.Items.AddChild(TreeView1.Items.Item[0],Edit2.text);
end;
 
 
 
end.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
05.09.2018, 14:31
у меня чудесно работает
вот эта строка замечательно создает итем с текстом из Edit1.text в корне вашего дерева
Delphi
1
TreeView1.Items.AddFirst(TreeView1.Selected,Edit1.text);
и успешно создает объект и даже сохраняет ссылку на него в свойстве Data

это можно даже увидеть, если заменить условие if node.level =1 then на if node.level =0 then
и поля привязанного объекта выводятся в StringGrid - aaa, bbb, ccc

вы что-то другое имели в виду?
0
0 / 0 / 0
Регистрация: 20.01.2018
Сообщений: 64
05.09.2018, 14:51  [ТС]
krapotkin, ну у меня вот такая проблема.
Миниатюры
TreeView+StringGrid  
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
05.09.2018, 15:09
посмотрите на строчку
Delphi
1
procedure TForm1.ShowNodeProps(Node: TTreeNode);
тут написано что ShowNodeProps - это метод класса TForm1
как например метод обработчика кнопки
Delphi
1
procedure TForm1.BitBtn1Click(Sender: TObject);
но в описании класса TForm1 у вас этот метод отсутствует
а должен присутствовать, например в разделе private

вообще это базовые знания из учебника
0
0 / 0 / 0
Регистрация: 20.01.2018
Сообщений: 64
05.09.2018, 15:18  [ТС]
krapotkin, а почему именно в приват надо писать?Нельзя в type, где остальные процедуры описаны?
Сейчас вот такая ошибка.
Миниатюры
TreeView+StringGrid  
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
05.09.2018, 15:33
почему у вас Unit1 использует (uses) Unit1 , т.е. самого себя??

вы вообще понимаете структуру программы и модуля делфи?
что такое классы?
чем методы класса отличаются от простых процедур?
0
0 / 0 / 0
Регистрация: 20.01.2018
Сообщений: 64
05.09.2018, 15:52  [ТС]
krapotkin, с этим разобралась.
Код заработал, но сохранение информации в гриде идет в независимости от узла. На какой узел я бы не вступила,в гриде отображается одна и та же информация. А надо, чтобы каждому узлу в гриде соответствовала своя( то есть разная) информация..
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
05.09.2018, 15:56
а где вы ввели разную информацию ??
в объект obj в этом коде помещается информация aaa, bbb, ccc
и больше ничего
если вы что-то поменяли, выкладывайте

Добавлено через 1 минуту
кстати, информация - реально-то разная!
потому что объект каждый раз создается новый!
просто они одинаковые по содержанию строки хранят
0
0 / 0 / 0
Регистрация: 20.01.2018
Сообщений: 64
05.09.2018, 16:12  [ТС]
krapotkin, нет, ничего не меняла. Работает, но можно ли самой ввести информацию в грид и сохранить ее на соответствующем узле? Чтобы это было не внутри программы? А то получается, сохраняется только то, что мы ввели с помощью кода: aaa, bbb, ccc.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
05.09.2018, 16:22
вы издеваетесь?
не можете заменить 'aaa' на grid1.cells[xxx,yyy] ??

Добавлено через 49 секунд
это называется пример. образец.
как и откуда на самом деле туда будут попадать данные, должен решить автор
0
Злостный нарушитель
 Аватар для Verevkin
10908 / 5836 / 1289
Регистрация: 12.03.2015
Сообщений: 26,936
05.09.2018, 16:29
Цитата Сообщение от krapotkin Посмотреть сообщение
вы издеваетесь?
не отписываюсь от темы, потому что интересно, чем дело кончится. Женится ли Луис-альберто на Марианне или нет.
Такая драма! Страсти-мордасти и delphi 7...
0
0 / 0 / 0
Регистрация: 20.01.2018
Сообщений: 64
05.09.2018, 16:41  [ТС]
krapotkin, Да это мне понятно, я же в самом начале делала такую запись,
Delphi
1
2
3
4
5
6
7
  for i:=1 to StringGrid1.RowCount-1 do
 
 
 PNodeOptions(TreeView.Selected.Data).Nazvanie:=Stringgrid1.Cells[i+1,1];
 PNodeOptions(TreeView.Selected.Data).GOD:=Stringgrid1.Cells[i+1,2];
 PNodeOptions(TreeView.Selected.Data).Col:=Stringgrid1.Cells[i+1,3];
 end;
Чтобы на выделенный узел сохранялась инфа из грида. Но это не работает и я прошу разобраться именно в этом моменте!
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
06.09.2018, 10:16
Irinat403, прекрасно
вот и сделайте
Delphi
1
2
3
obj.Naz := grid.cells ...
obj.Col := grid.cells ...
obj.God :=grid.cells ...
и этот obj будет выводиться в грид при клике по дереву
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.09.2018, 10:16

StringGrid: проверить, имеется ли строка с ключевым полем во втором StringGrid-е
Имеются два StringGrid'a, у каждого есть ключевое поле. В первом sg значения ключевого поля могут повторятся, во втором нет. Нужно...

Необходимо сложить ячейки в столбце Stringgrid и вывести в другой Stringgrid
Необходимо сложить ячейки в столбце Stringgrid и вывести в другой Stringgrid Количество столбцов и строк задается пользователем

Значение одной ячейки первого StringGrid-а присвоить другой ячейке второго StringGrid-а
скажите пожалуйста, вот нам даны две таблицы stringgrid, как значение одной ячейки,первой таблицы, присвоить другой ячейке второй таблице?

Вывод в StringGrid из Word, а из StringGrid в круговую диаграмму
Изначально необходимо с первой формы из нескольких компонентов(эдиты, комбобоксы и дататайм) собрать данные и вывести в строку вордовского...

Перенос столбца(информации) из StringGrid в другой StringGrid
Не могу разобраться с тем, как перенести значения(нажатием кнопки "записать") выданные программой в 1 таблице,из крайнего столбца, во 2...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru