Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранение [D7, WinXP]


Страницы:   1 2

~Димас~ ©   (2006-12-10 14:10:00) 

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


Джо   (2006-12-11 19:12:00) [1]

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

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


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

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


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

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


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

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


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

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


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

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


MetalFan   (2006-12-10 22:56:00) [7]

>[14]

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

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


Джо   (2006-12-10 22:48:00) [8]

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

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


MetalFan   (2006-12-10 22:33:00) [9]

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


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

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

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


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

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


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

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

Модуль с главной формой:
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 18:48:00) [13]

Вот небольшой код моей программы:
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 16:58:00) [14]

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

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


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

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


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


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


Джо   (2006-12-10 14:25:00) [17]

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

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


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

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


Джо   (2006-12-10 14:16:00) [19]

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

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


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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо