Форум: "Основная";
Текущий архив: 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.042 c