Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
~Димас~   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.037 c
2-1168999667
DmitrichJ
2007-01-17 05:07
2007.02.04
Ну слишком медленный StringGrid. Что делать?


2-1168999905
Евгенич
2007-01-17 05:11
2007.02.04
Что значит "функция возвращает"?


2-1168994214
M1sT
2007-01-17 03:36
2007.02.04
Поиск по файлам, типа *.xls, *.mdb, *.dbf


2-1168970687
malyar
2007-01-16 21:04
2007.02.04
opendialog &amp; savedialog


2-1168866844
Vlad_Uzegov
2007-01-15 16:14
2007.02.04
A call to an OS function failed





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский