Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сохранения и загрузки, Дерева TreeView. 
:(
    Опции темы
RA
Дата 12.4.2004, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 14
Всего: 115



Нужна мне была процедура сохранения и загрузки, Дерева TreeView.
юзанул я стандартные LoadToFile и LoadFromFile но они не сохраняют
свойство data ветвей дерева и решил я их переделать вот что получилось:


Код

procedure  LoadTree(Stream: TStream;ANode:TTreeNode);
const
Sep : string = '|';
function StrapStr(str:string;k:integer):string;
begin
 if k = 2 then
  StrapStr:= copy(Str,pos(sep,Str)+1,length(Str));
 if k = 1 then
  StrapStr:= copy(Str,1,pos(sep,str)-1);
end;


function GetBufStart(Buffer: PChar; var Level: Integer): PChar;
begin
 Level := 0;
 while Buffer^ in [' ', #18] do
 begin
   Inc(Buffer);
   Inc(Level);
 end;
 Result := Buffer;
end;


var
 List: TStringList;
 NextNode  : TTreeNode;
 ALevel, i: Integer;
 CurrStr: string;
begin

 List := TStringList.Create;
 NextNode.Owner.BeginUpdate;

 try
   try

     ANode.Owner.Clear;
     List.LoadFromStream(Stream);
     for i := 0 to List.Count - 1 do
     begin
       CurrStr := GetBufStart(PChar(List[i]), ALevel);
       if ANode = nil then
         ANode := ANode.Owner.AddChild(nil, StrapStr(CurrStr,1) )
       else if ANode.Level = ALevel then
         ANode :=ANode.Owner.AddChild(ANode.Parent, StrapStr(CurrStr,1) )
       else if ANode.Level = (ALevel - 1) then
         ANode :=ANode.Owner.AddChild(ANode,  StrapStr(CurrStr,1) )
       else if ANode.Level > ALevel then
       begin
         NextNode := ANode.Parent;
         while NextNode.Level > ALevel do
           NextNode := NextNode.Parent;
         ANode := ANode.Owner.AddChild(NextNode.Parent,  StrapStr(CurrStr,1) );

       end
       else raise ETreeViewError.CreateFmt('Msg', [ALevel, CurrStr]);//eeViewErrorFmt(sInvalidLevelEx, [ALevel, CurrStr]);
       Anode.Data:=Pointer( StrToInt( StrapStr(CurrStr,2) )    );
     end;

   finally
     NextNode.Owner.EndUpdate;

     List.Free;
   end;
 except
      NextNode.Owner.Owner.Invalidate;  // force repaint on exception

   raise;
 end;
end;


procedure SaveTree(Stream: TStream; ANode: TTreeNode);
const
 TabChar = #18;
 EndOfLine = #13#10;
 Sep : string = '|';
var
 i: Integer;
 NodeStr: string;
begin
   ANode := ANode.Owner[0];
   while ANode <> nil do
   begin
     NodeStr := '';
     for i := 0 to ANode.Level - 1 do NodeStr := NodeStr + TabChar;
     NodeStr := NodeStr + ANode.Text + Sep + IntToStr(Integer(ANode.data)) + EndOfLine;
     Stream.Write(Pointer(NodeStr)^, Length(NodeStr));
     ANode := ANode.GetNext;
   end;
end;



===============================
procedure TForm1.SaveClick(Sender: TObject);
var
 Stream: TStream;
begin
 Stream := TFileStream.Create('D:\FILE.SAV', fmCreate);
 try
   SaveTree(Stream,Treeview1.Items.GetFirstNode);
 finally
   Stream.Free;
 end;
end;


procedure TForm1.ReadClick(Sender: TObject);
var
 Stream: TStream;
begin
 Stream := TFileStream.Create('D:\FILE.SAV', fmOpenRead);
 try
   LoadTree(Stream,Treeview1.Items.GetFirstNode);
 finally
   Stream.Free;
 end;
end;


Работает код криво и косо но работает, вообщем поможите оптимизировать или мож кто альтернативу предложит.
PM   Вверх
x77
Дата 12.4.2004, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



одна мыслишка есть. тебе в Data, насколько я понял, надо хранить всего лишь интегер. стоит ли ради этого заморачиваться с указателями вообще? его можно хранить, например, в свойстве TTreeNode.StateIndex, которое используется достаточно редко. и тогда вместо сохранения в файл нодов, можно смело писать и читать весь компонент со всеми его свойствами, в т.ч. и StateIndex'ами:

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
 WriteComponentResFile (FileName, TreeView1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 ReadComponentResFile (FileName, TreeView1);
end;


не совсем корректно, может быть, но ты сравни код ;) мне кажется, ради этого можно пожертвовать StateIndex'ами, даже если они используются.

другой вариант: дописывать нужное число в текст нода (типа 'My node|1') и перехватывать вывод на экран: отображать только часть до символа "|". а при необходимости узнать число, брать всё, что после символа "|" и переводить в интегер. тогда сохранение и запись сведутся к стандартным методам SaveToFile/LoadFromFile, т.к. вся нужная инфа у тебя сидит в тексте нода.

короче говоря, мне кажется, что париться с сохранением "пользовательских данных" ради одного вшивого целого не стоит вообще. smile.gif


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0423 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.