|
Вопрос # 2 812/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
На форме имеются компоненты: TreeView, Image1 и Memo.
В TreeView уже существует дерево каталогов с объектами при нажатии на которые в Memo выводится текст из файлов (*dec), а в Image соответствующее изображение изображение (*jpg).
Мне необходимо организовать возможность добавления в TreeView новые объекты и для них добавлять текстовые файлы и изображения.
Фрагмент кода как реализовано отображение текста и картинок представлен ниже. (Буду благодарен за способ по его упрощению).
Помогите пожалуйста уважаемые эксперты.
Приложение: Переключить в обычный режим- procedure TForm2.TreeView1Click(Sender: TObject);
- begin
-
- if
- treeview1.Items.Item[1].Selected=true
- then
- begin
- Memo1.lines.LoadFromFile('Data1-1.dec');
- Image1.Picture.LoadFromFile('ImageSamsung1.jpg');
- end;
-
- if
- treeview1.Items.Item[2].Selected=true
- then
- begin
- Memo1.lines.LoadFromFile('Data1-2.dec');
- Image1.Picture.LoadFromFile('ImageSamsung2.jpg');
- end;
-
-
 |
Вопрос задал: Romanov (статус: Посетитель)
Вопрос отправлен: 19 мая 2009, 13:48
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Чтобы не заморачиваться со свойством Data, можно написать свой класс-наследник от TTreeNode, в котором будут соответствующие свойства.
type
TMyNode = class(TTreeNode)
private
FTextFile: string;
FImageFile: string;
public
property TextFile: string read FTextFile write FTextFile;
property ImageFile: string read FImageFile write FImageFile;
end;
На событие TreeView.OnCreateNodeClass подставлять этот класс.
procedure TForm2.TreeViewCreateNodeClass(Sender: TCustomTreeView;
var NodeClass: TTreeNodeClass);
begin
NodeClass:= TMyNode;
end;
Затем, создание нового Node:
function TForm2.CreateNewNode(AParentNode: TTreeNode;
const ACaption, ATextFile, AImageFile: string): TMyNode;
begin
Result:= TMyNode(TreeView.Items.AddChild(AParentNode, ACaption));
Result.TextFile:= ATextFile;
Result.ImageFile:= AImageFile;
end;
Далее вся работа с такими нодами будет через приведение типов
procedure TForm2.TreeView1Click(Sender: TObject);
begin
if Assigned(TreeView.Selected)
then begin
Memo1.Lines.LoadFromFile(TMyNode(TreeView.Selected).TextFile);
Image1.Picture.LoadFromFile(TMyNode(TreeView.Selected).ImageFile);
// Ахтунг! Здесь нет отлова ошибок ввода/вывода!
end;
end;
Ну вот, типа как-то так.
Ахтунг! Код не отлаживал, писал прямо в браузере!
Прежде чем копипастить к себе в прогу, пойми, как тут что работает.
А то тут один товарищ не понял... :))
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 19 мая 2009, 14:55
|
Мини-форум вопроса
Всего сообщений: 35; последнее сообщение — 20 мая 2009, 18:23; участников в обсуждении: 3.
Страницы: [1] [2] [Следующая »]
|
Вадим К (статус: Академик), 19 мая 2009, 13:52 [#1]:
Думаю, что с таким подходом к отображению, придется делать и добавление кода... А в делфи сложно на лету менять код. точнее - практически невозможно.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Romanov (статус: Посетитель), 19 мая 2009, 13:57 [#2]:
Блин( Так и знал. Тогда подскажите как сделать проще отображение этих файлов.
|
|
Вадим К (статус: Академик), 19 мая 2009, 14:11 [#3]:
на самом деле всё делается гораздо веселее. У нодов TreeView есть свойство data типа pointer. Заводиться структура/класс, которая хранит все нужные данные (у Вас это будет структура на две строки). И при добавлении ноды заполняется. и связывается. В результате процедура клика стает примитивной
ну где то так
type
TMyrec=record
textfilename:string;
imgfilename:string;
end;
if treeview1.Items.Selected<>nil then
begin
Memo1.lines.LoadFromFile(TMyrec(treeview1.Items.Selected.data)^.textfilename);
Image1.Picture.LoadFromFile(TMyrec(treeview1.Items.Selected.data)^.imgfilename);
end;
предлагаю написать добавление самостоятельно
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Romanov (статус: Посетитель), 19 мая 2009, 14:49 [#4]:
type
TMyrec=record
textfilename:string;
imgfilename:string;
end;
А вот эту часть куда?
|
|
Вадим К (статус: Академик), 19 мая 2009, 15:17 [#5]:
ну где то после слова implementation
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Romanov (статус: Посетитель), 19 мая 2009, 15:28 [#6]:
Вот на эту строку "if treeview1.Items.Selected<>nil then" вывдит
[Error] Unit1.pas(35): Undeclared identifier: 'Selected'
Что не так?
|
|
Вадим К (статус: Академик), 19 мая 2009, 15:34 [#7]:
ну значит я забыл... что значит пол года не запускать делфи..
если не так, значит я items лишний написал. то есть
"if treeview1.Selected<>nil then"
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Romanov (статус: Посетитель), 19 мая 2009, 16:15 [#8]:
min@y™
Когда прописываю эту строку TMyNode = class(TTreeNode) в type, то выдаёт ошибку Expected ':' but '=' found.
|
|
Вадим К (статус: Академик), 19 мая 2009, 16:20 [#9]:
Наверно не там прописываете...
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Romanov (статус: Посетитель), 19 мая 2009, 16:21 [#10]:
После uses идет type. Я как понял туда нужно прописывать.
|
|
Вадим К (статус: Академик), 19 мая 2009, 16:28 [#11]:
Скажем так, код min@y™ это очень грубый набросок кода.
Прописываете вроде правильно. приводите первые строк 20 юнита, посмотрим.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Romanov (статус: Посетитель), 19 мая 2009, 16:39 [#12]:
Разобрался. Теперь здесь непонятно:
Прописываю на TreeView1Click
function TForm2.CreateNewNode(AParentNode: TTreeNode;
const ACaption, ATextFile, AImageFile: string): TMyNode;
Туда ли я его прописываю и что не так в первой строке? Дает такое сообщение "[Error] Unit1.pas(46): Function needs result type"
|
|
Вадим К (статус: Академик), 19 мая 2009, 16:57 [#13]:
не знаю, куда его происываете. надо так. находим в определении формы слово private и сразу после нее вставляем
function CreateNewNode(AParentNode: TTreeNode;
const ACaption, ATextFile, AImageFile: string): TMyNode;
и жмем Ctrl+Shift+C
далее - будет видно.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Romanov (статус: Посетитель), 20 мая 2009, 12:39 [#14]:
Извиняюсь за занудство. Взгляните пожалуйста, что я делаю не так?
Сейчас выдает на эту строку "Result.TextFile:= ATextFile;" ошибку Uncnoued identifier TextFile
------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls;
type
TMyNode = class(TTreeNode);
TForm1 = class(TForm)
TreeView1: TTreeView;
Image1: TImage;
Memo1: TMemo;
procedure TreeView1CreateNodeClass(Sender: TCustomTreeView;
var NodeClass: TTreeNodeClass);
procedure TreeView1Click(Sender: TObject);
private
FTextFile: string;
FImageFile: string;
function CreateNewNode(AParentNode: TTreeNode;
const ACaption, ATextFile, AImageFile: string): TMyNode;
{ Private declarations }
public
property TextFile: string read FTextFile write FTextFile;
property ImageFile: string read FImageFile write FImageFile;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView;
var NodeClass: TTreeNodeClass);
begin
NodeClass:= TMyNode;
end;
function TForm1.CreateNewNode(AParentNode: TTreeNode; const ACaption,
ATextFile, AImageFile: string): TMyNode;
begin
Result:= TMyNode(TreeView1.Items.AddChild(AParentNode, ACaption));
Result.TextFile:= ATextFile;
Result.ImageFile:= AImageFile;
end;
procedure TForm1.TreeView1Click(Sender: TObject);
begin
if Assigned(TreeView.Selected)
then begin
Memo1.Lines.LoadFromFile(TMyNode(TreeView.Selected).TextFile);
Image1.Picture.LoadFromFile(TMyNode(TreeView.Selected).ImageFile);
end;
end;
end.
|
|
Вадим К (статус: Академик), 20 мая 2009, 12:46 [#15]:
ну так неправильно выдает. Должно было догнать и ещё выдать
почему при обявлении класса не указаны поля?
type
TMyNode = class(TTreeNode); //<===????????
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Romanov (статус: Посетитель), 20 мая 2009, 14:10 [#16]:
Хм поля указал. Всеравно на той же строке ошибка:
[Error] Unit1.pas(50): Undeclared identifier: 'TextFile'
|
|
Romanov (статус: Посетитель), 20 мая 2009, 14:11 [#17]:
Может нужно указать компоненту какое нибудь свойство?
|
|
Вадим К (статус: Академик), 20 мая 2009, 14:24 [#18]:
Ну, и как это называется? я же явно указал место ошибки.
надо вместо
TMyNode = class(TTreeNode);
писать
TMyNode = class(TTreeNode)
private
FTextFile: string;
FImageFile: string;
public
property TextFile: string read FTextFile write FTextFile;
property ImageFile: string read FImageFile write FImageFile;
end;
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 20 мая 2009, 14:31 [#19]:
Вместо
type
TMyNode = class(TTreeNode);
TForm1 = class(TForm)
TreeView1: TTreeView;
Image1: TImage;
Memo1: TMemo;
procedure TreeView1CreateNodeClass(Sender: TCustomTreeView;
var NodeClass: TTreeNodeClass);
procedure TreeView1Click(Sender: TObject);
private
FTextFile: string;
FImageFile: string;
function CreateNewNode(AParentNode: TTreeNode;
const ACaption, ATextFile, AImageFile: string): TMyNode;
{ Private declarations }
public
property TextFile: string read FTextFile write FTextFile;
property ImageFile: string read FImageFile write FImageFile;
{ Public declarations }
end;
Вставь вот это:
type
TMyNode = class(TTreeNode);
private
FTextFile: string;
FImageFile: string;
public
property TextFile: string read FTextFile write FTextFile;
property ImageFile: string read FImageFile write FImageFile;
end;
TForm1 = class(TForm)
TreeView1: TTreeView;
Image1: TImage;
Memo1: TMemo;
procedure TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
procedure TreeView1Click(Sender: TObject);
private
function CreateNewNode(AParentNode: TTreeNode;
const ACaption, ATextFile, AImageFile: string): TMyNode;
public
{ Public declarations }
end;
Поля FTextFile, FImageFile, свойства TextFile, ImageFile должный быть полями и свойствами класса TMyNode, а не TForm1, как у тебя!
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Romanov (статус: Посетитель), 20 мая 2009, 14:56 [#20]:
Спасибо за помошь и терпение господа. Запустилось, но поясни что должно происходить при клике на TreeView ?
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|