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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 2 812

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

Здравствуйте, уважаемые эксперты!
На форме имеются компоненты: TreeView, Image1 и Memo.
В TreeView уже существует дерево каталогов с объектами при нажатии на которые в Memo выводится текст из файлов (*dec), а в Image соответствующее изображение изображение (*jpg).
Мне необходимо организовать возможность добавления в TreeView новые объекты и для них добавлять текстовые файлы и изображения.

Фрагмент кода как реализовано отображение текста и картинок представлен ниже. (Буду благодарен за способ по его упрощению).

Помогите пожалуйста уважаемые эксперты.

Приложение:
  1. procedure TForm2.TreeView1Click(Sender: TObject);
  2. begin
  3.  
  4. if
  5. treeview1.Items.Item[1].Selected=true
  6. then
  7. begin
  8. Memo1.lines.LoadFromFile('Data1-1.dec');
  9. Image1.Picture.LoadFromFile('ImageSamsung1.jpg');
  10. end;
  11.  
  12. if
  13. treeview1.Items.Item[2].Selected=true
  14. then
  15. begin
  16. Memo1.lines.LoadFromFile('Data1-2.dec');
  17. Image1.Picture.LoadFromFile('ImageSamsung2.jpg');
  18. end;
  19.  
  20.  


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

Вопрос задал: 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

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

Romanov (статус: Посетитель), 19 мая 2009, 14:49 [#4]:

type
TMyrec=record
textfilename:string;
imgfilename:string;
end;
А вот эту часть куда?
Вадим К

Вадим К (статус: Академик), 19 мая 2009, 15:17 [#5]:

ну где то после слова implementation
Галочка "подтверждения прочтения" - вселенское зло.
Romanov

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

Romanov (статус: Посетитель), 19 мая 2009, 16:15 [#8]:

min@y™
Когда прописываю эту строку TMyNode = class(TTreeNode) в type, то выдаёт ошибку Expected ':' but '=' found. :(
Вадим К

Вадим К (статус: Академик), 19 мая 2009, 16:20 [#9]:

Наверно не там прописываете...
Галочка "подтверждения прочтения" - вселенское зло.
Romanov

Romanov (статус: Посетитель), 19 мая 2009, 16:21 [#10]:

После uses идет type. Я как понял туда нужно прописывать.
Вадим К

Вадим К (статус: Академик), 19 мая 2009, 16:28 [#11]:

Скажем так, код min@y™ это очень грубый набросок кода.
Прописываете вроде правильно. приводите первые строк 20 юнита, посмотрим.
Галочка "подтверждения прочтения" - вселенское зло.
Romanov

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

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

Romanov (статус: Посетитель), 20 мая 2009, 14:10 [#16]:

Хм поля указал. Всеравно на той же строке ошибка:
[Error] Unit1.pas(50): Undeclared identifier: 'TextFile'
Romanov

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™

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

Romanov (статус: Посетитель), 20 мая 2009, 14:56 [#20]:

Спасибо за помошь и терпение господа. Запустилось, но поясни что должно происходить при клике на TreeView ?

Страницы: [1] [2] [Следующая »]

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 24 февраля 2020, 12:32
Выполнено за 0.06 сек.
Рейтинг@Mail.ru