Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.04;
Скачать: CL | DM;

Вниз

Сохранение   Найти похожие ветки 

 
~Димас~   (2006-12-10 14:10) [0]

Народ, нужна помощь.
Значит, имеется TreeView с кучкой заметок, каждой сопоставлен текст, который отображается в RichEdit. Как всю структуру вот этого сохранить в файл.


 
Джо ©   (2006-12-10 14:11) [1]

В чем конкретная проблема?


 
~Димас~   (2006-12-10 14:13) [2]

Я не пойму, как это сделать


 
Джо ©   (2006-12-10 14:16) [3]

> [2] ~Димас~   (10.12.06 14:13)
> Я не пойму, как это сделать

Что именно «как»? — придумать структуру файла? Осуществлять запись? Обойти все элементы TreeView? Получить тест из RichEdit? В чем конкретная проблема?
Или просто нужен готовый рабочий вариант? Поверь, такой вряд ли кто за тебя писать станет.


 
~Димас~   (2006-12-10 14:21) [4]

Осуществить запись всех нодов Treeview и сопоставленных им текстом из Richedit в файл.


 
Джо ©   (2006-12-10 14:25) [5]

> [4] ~Димас~   (10.12.06 14:21)
> Осуществить запись всех нодов Treeview и сопоставленных
> им текстом из Richedit в файл.

Это не проблема. Это задача, которую тебе нужно решить. Задачу нужно разбить на составляющие. Начни с продумывания формата файла (с учетом легкости последующей загрузки из него).


 
~Димас~   (2006-12-10 14:30) [6]


> Начни с продумывания формата файла (с учетом легкости последующей
> загрузки из него).
</Вот как раз об этом, я и хотел бы побольше узнатьI>


 
~Димас~   (2006-12-10 16:53) [7]

Ну кто-нибудь, помогите пожалуйста!


 
Джо ©   (2006-12-10 16:58) [8]

>
>
> [7] ~Димас~   (10.12.06 16:53)
> Ну кто-нибудь, помогите пожалуйста!

С чем? С продумыванием?


 
~Димас~   (2006-12-10 18:48) [9]

Вот небольшой код моей программы:
type
 PList=^List;
 List=record
   TextStr:string;
 end;
public
 TTT:TList;

В PList у меня хронится текст из Richedit для каждой заметки.

Вот процедура для сохранения:
procedure TForm1.SpeedButton2Click(Sender: TObject);
var
 i:integer;
 fs:TFileStream;
begin
 fs:=TFileStream.Create("PAS",fmOpenRead);
 try
 fs.Write(TTT.count,sizeof(TTT.Count));
 for i:=0 to TTT.Count-1 do
   fs.Write(Plist(ttt[i])^,sizeof(list));
 finally
   fs.Free;
 end;
end;

Эта процедура для открытия:
procedure TForm1.SpeedButton3Click(Sender: TObject);
var
 fs:TFileStream;
 NodeDate:PList;
 i,count:integer;
begin
 if not OpenDialog1.Execute then exit;
 fs:=TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
 fs.Seek(0,soFromBeginning);
 try
   fs.Read(count,sizeof(count));
   for i:=0 to count-1 do begin
   NodeDate:=New(PList);
   fs.Read(NodeDate^,sizeof(List));
   ttt.Add(Nodedate);
   with TreeView1.Items.Add(nil,nodedate.TextStr) do Data:=NodeDate;
   end;
 finally
   fs.Free;
 end;
end;

Но почему то,после открытия у меня сохранилось только количество нодов, а их названия и теста в Richedite нету. В чом здесь проблема?


 
Джо ©   (2006-12-10 20:19) [10]

От нечего делать нарисовал тут демонстрационный проект. Изучай принцип.

Модуль с главной формой:
unit Unit33;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls, StdCtrls, ActnList;

type

 TExtendedNode = class (TTreeNode)
 private
   FNote: string;
   procedure WriteString (AStream: TStream; const S: string);
   function ReadString (AStream: TStream): string;
 public
   property Note: string read FNote write FNote;
   procedure SaveToStream (AStream: TStream);
   procedure LoadFromStream (AStream: TStream);
 end;

 TForm33 = class(TForm)
   TreeView1: TTreeView;
   Memo1: TMemo;
   Button1: TButton;
   Button2: TButton;
   ActionList1: TActionList;
   acCreateNewNode: TAction;
   acApplyNote: TAction;
   Button3: TButton;
   Button4: TButton;
   acSave: TAction;
   acLoad: TAction;
   SaveDialog1: TSaveDialog;
   OpenDialog1: TOpenDialog;
   procedure TreeView1CreateNodeClass(Sender: TCustomTreeView;
     var NodeClass: TTreeNodeClass);
   procedure acCreateNewNodeExecute(Sender: TObject);
   procedure ActionList1Update(Action: TBasicAction; var Handled: Boolean);
   procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
   procedure acApplyNoteExecute(Sender: TObject);
   procedure acSaveExecute(Sender: TObject);
   procedure acLoadExecute(Sender: TObject);
 private
 public
 end;

var
 Form33: TForm33;

implementation

uses
 NewNodeFormUnit; // Модуль с формой создания нового узла и функцией показа диалога CreateNewNodeDlg

{$R *.dfm}

procedure TForm33.acApplyNoteExecute(Sender: TObject);
begin
 TExtendedNode(TreeView1.Selected).Note := Memo1.Text
end;

// Создание нового узла-дочернего по отношению к выделенному
procedure TForm33.acCreateNewNodeExecute(Sender: TObject);
var
 RootSelected: TTreeNode;
 NewNode: TExtendedNode;
 AText,
 ANote: string;
begin
 RootSelected := TreeView1.Selected;

 if CreateNewNodeDlg (AText,ANote) then
 begin
   NewNode := TExtendedNode(TreeView1.Items.AddChild(RootSelected,AText));
   NewNode.Note := ANote;
   TreeView1.Selected := NewNode;
 end;
end;

// Загрузка из файла
procedure TForm33.acLoadExecute(Sender: TObject);
var
 Fs: TFileStream;
begin
 if OpenDialog1.Execute then
 begin
   TreeView1.Items.Clear;
   TreeView1.Items.AddChild(nil,"");
   Fs := TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
   try
     TExtendedNode(TreeView1.Items[0]).LoadFromStream(Fs);
   finally
     Fs.Free;
   end;
 end;

end;

// Сохрание в файл
procedure TForm33.acSaveExecute(Sender: TObject);
var
 Fs: TFileStream;
begin
 if SaveDialog1.Execute then
 begin
   Fs := TFileStream.Create(SaveDialog1.FileName,fmCreate);
   try
     TExtendedNode(TreeView1.Items[0]).SaveToStream(Fs);
   finally
     Fs.Free;
   end;
 end;
end;

procedure TForm33.ActionList1Update(Action: TBasicAction; var Handled: Boolean);
begin
 acCreateNewNode.Enabled := Assigned(TreeView1.Selected);
 acApplyNote.Enabled := Assigned(TreeView1.Selected);
end;

procedure TForm33.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
 Memo1.Text := TExtendedNode(Node).Note;
end;

procedure TForm33.TreeView1CreateNodeClass(Sender: TCustomTreeView;
 var NodeClass: TTreeNodeClass);
begin
 // Вместо стандартного TTreeNode
 // будет создаваться его наследник -- наш класс TExtendedNode
 NodeClass := TExtendedNode;
end;

{ TExtendedNode }

// Рекурсивная загрузка узла со всеми его дочерними узлами
procedure TExtendedNode.LoadFromStream(AStream: TStream);

 procedure LoadChildren;
 var
   I,
   ChildCount: Integer;
 begin
   AStream.Read(ChildCount,SizeOf(ChildCount));
   for I := 0 to ChildCount-1 do
     TExtendedNode(Owner.AddChild(Self,"")).LoadFromStream(AStream);
 end;

begin
 Text := ReadString(AStream);
 Note := ReadString(AStream);
 LoadChildren;
end;

function TExtendedNode.ReadString(AStream: TStream): string;
var
 Sz: Integer;
begin
 AStream.Read(Sz,SizeOf(Sz));
 SetLength(Result,Sz);
 AStream.Read(Result[1],Sz)
end;

// Рекурсивная запись узла со всеми его дочерними узлами
procedure TExtendedNode.SaveToStream(AStream: TStream);

 procedure WriteChildren;
 var
   I,
   ChildCount: Integer;
 begin
   ChildCount := Count;
   AStream.Write(ChildCount,SizeOf(ChildCount));
   for I := 0 to ChildCount-1 do
     TExtendedNode(Item[I]).SaveToStream(AStream);
 end;
 
begin
 WriteString(AStream,Text);
 WriteString(AStream,FNote);
 WriteChildren;
end;

procedure TExtendedNode.WriteString(AStream: TStream; const S: string);
var
 Sz: Integer;
begin
 Sz := Length(S);
 AStream.Write (Sz,SizeOf(Sz));
 AStream.Write(S[1],Sz)
end;

end.


Полностью рабочие исходники проекта со всеми формами (BDS 4.0), архив zip (3,49 KB).


 
Джо ©   (2006-12-10 20:20) [11]

http://unclejoe.ho.com.ua/soft/treeview.zip


 
Eraser ©   (2006-12-10 21:09) [12]

> [0] ~Димас~   (10.12.06 14:10)

можно еще XML использовать.


 
MetalFan ©   (2006-12-10 22:33) [13]

простите срочно...
н-ко вопросов по поводу кода в [10]
что-то я не понимаю, где там экземпляры TExtendedNode создаются...
везде только приведение к типу...
не получится ли в итоге AV?


 
Джо ©   (2006-12-10 22:48) [14]

> [13] MetalFan ©   (10.12.06 22:33)
> простите срочно...
> н-ко вопросов по поводу кода в [10]
> что-то я не понимаю, где там экземпляры TExtendedNode создаются

Они создаются самим TTreeView, когда это необходимо (см. исходный код компонента TCustomTreeView). В обработчике OnCreateNode можно задать собственный класс, производный от TTreeNode и тогда вместо TTreeNode будут создаваться экземпляры твоего наследника.


 
MetalFan ©   (2006-12-10 22:56) [15]

>[14]

> procedure TForm33.TreeView1CreateNodeClass(Sender: TCustomTreeView;
>
>  var NodeClass: TTreeNodeClass);
> begin
>  // Вместо стандартного TTreeNode
>  // будет создаваться его наследник -- наш класс TExtendedNode
>  NodeClass := TExtendedNode;
> end;

мда, этот кусок я пропустил %)
сорри)


 
Германн ©   (2006-12-11 01:24) [16]

Опять "от нечего делать" в "Основная", Серёг! :-(


 
~Димас~   (2006-12-11 06:20) [17]

Спасибо Джо, щас буду пробовать.


 
~Димас~   (2006-12-11 14:42) [18]

Джо, почему кнопка добавления нодов не работает?


 
~Димас~   (2006-12-11 15:45) [19]

Всё, разобрался.


 
~Димас~   (2006-12-11 18:48) [20]

Извините,если надоел, но подскажите пожалуйста, что нужно изменить из программы   (10.12.06 20:19) [10]
чтобы она сохраняла не только первый узел со всеми его дочерными узлами, но и все остальный узлы??


 
Джо ©   (2006-12-11 19:12) [21]

> [20] ~Димас~   (11.12.06 18:48)
> Извините,если надоел, но подскажите пожалуйста, что нужно
> изменить из программы   (10.12.06 20:19) [10]
> чтобы она сохраняла не только первый узел со всеми его дочерными
> узлами, но и все остальный узлы??

Сожалею, но писать за кого-то программы у меня нет ни желания, ни времени. Удачи.
Я написал этот пример для того, чтобы показать принцип. Без сомнения, чтобы его понять, следует приложить немного самостоятельных усилий.



Страницы: 1 вся ветка

Текущий архив: 2007.02.04;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.058 c
15-1169037921
stone
2007-01-17 15:45
2007.02.04
Глюк в базах


15-1168590355
Empleado
2007-01-12 11:25
2007.02.04
Календарь менять будем? Аль так оставим?


2-1169061238
serko
2007-01-17 22:13
2007.02.04
Версия программы...


15-1168698485
Гарри Поттер
2007-01-13 17:28
2007.02.04
Старый Новый год.


3-1163492559
Bless
2006-11-14 11:22
2007.02.04
Почему не возникает ошибка?