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

Вниз

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

 
Snip ©   (2004-06-08 12:39) [0]

Всем привет!!! Народ подскажите как сохранить структуру TTreeView и в частности свойство Data каждого TNode (использования баз не предлагать, удет громоздко)....
Точнее как сохранить я знаю.... Типа есть запись у каждой записи ест поле родитель... вот и как мне прочитать все это и восстановить в дерево??? Заранее благодарен.


 
Digitman ©   (2004-06-08 12:56) [1]

PMyRec = ^TMyRec;
TMyRec = packed record
.. по барабану, что здесь
end;

//сохраняем в стрим собственно дерево
TreeView.SaveToStream(MyStream);

//и следом - всю его дополнительную ботву
for i:= 0 to TreeView.Items.Count - 1 do
 MyStream.WriteBuffer(PMyRec(TreeView.Items[i].Data)^, SizeOf(TMyRec));

//восстанавливаем из стрима собственно дерево
TreeView.LoadFromStream(MyStream);

//и следом же - ботву
var
MyRec: PMyRec;

for i:= 0 to TreeView.Items.Count - 1 do
with TreeView.Items[i] do
begin
 New(MyRec);
 MyStream.ReadBuffer(MyRec^, SizeOf(TMyRec));
 Data := MyRec;
end;


 
Digitman ©   (2004-06-08 12:58) [2]


> .. по барабану, что здесь


за исключением динамических переменных а-ля large strings - с ними будет чуть посложней


 
Clickmaker ©   (2004-06-08 13:23) [3]


> за исключением динамических переменных а-ля large strings
> - с ними будет чуть посложней

Можно array[0..N] of char заюзать


 
Snip ©   (2004-06-08 15:15) [4]

попробовал я этот способ.... исползовал TFileStream, но при чтении выкидывает Stream Read Error


 
Snip ©   (2004-06-08 15:17) [5]

это наверно потому что он дописанную Data читает как продолжение структуры дерева... Подскажите что нить... может есть у кого какие мысли


 
Digitman ©   (2004-06-08 15:23) [6]


> это наверно потому что он дописанную Data читает как продолжение
> структуры дерева


нет, это скорей всего потому, что записав в файловый поток все это хозяйство ты тут же пытаешься прочитать из него то что только что записал, не переоткрыв файловый поток или, на худой конец, не установив перед началом чтения маркер тек.позиции в файловом потоке на начало потока

см. св-во position(), метод seek()


 
Snip ©   (2004-06-08 15:54) [7]

да нет там все нормально...
делаю так
procedure TfMain.LoadTree;
var
 Stream: TFileStream;
 Index: Integer;
 Media: PMedia;
begin
 if not FileExists(ExtractFilePath(Application.ExeName)+"folder.dat") then begin
   CreateNewTree(tvExplorer);
   Exit;
 end;
 Stream:=TFileStream.Create(ExtractFilePath(Application.ExeName)+"folder.dat", fmOpenRead);
 Stream.Position:=0;
 tvExplorer.LoadFromStream(Stream);
 for Index:= 0 to Pred(tvExplorer.Items.Count) do begin
   New(Media);
   Stream.ReadBuffer(Media^, SizeOf(PMedia));
   tvExplorer.Items[Index].Data:=Media;
 end;
 Stream.Destroy;
end;

procedure TfMain.SaveTree;
var
 Stream: TFileStream;
 Index: Integer;
begin
 Stream:=TFileStream.Create(ExtractFilePath(Application.ExeName)+"folder.dat", fmCreate);
 tvExplorer.SaveToStream(Stream);
 for Index:= 0 to Pred(tvExplorer.Items.Count) do
   Stream.WriteBuffer(PMedia(tvExplorer.Items[Index].Data)^, SizeOf(PMedia));
 Stream.Destroy;
end;


 
Clickmaker ©   (2004-06-08 16:02) [8]

Stream.WriteBuffer(PMedia(tvExplorer.Items[Index].Data)^, SizeOf(PMedia));

Замени на SizeOf(TMedia), размер PMedia - это размер указателя, а он всегда = 4


 
Snip ©   (2004-06-08 16:07) [9]

У меня все равно такая же ошибка.... Подскажите еще вариант... может Data сохранять в отдельном потоке???


 
Digitman ©   (2004-06-08 16:08) [10]


> Snip ©   (08.06.04 15:54) [7]


действительно - облажался ты малясь с TMedia и PMedia


 
Digitman ©   (2004-06-08 16:12) [11]


> Snip ©   (08.06.04 16:07) [9]


> может Data сохранять в отдельном потоке???


а, может, одеть семейные трусы не в горошек, а в полоску ? дабы счастье привалило нонче ?

встроенный Делфи-отладчик для тебя - пустое слово ?


 
Clickmaker ©   (2004-06-08 16:12) [12]


> Snip ©   (08.06.04 16:07) [9]

Приведи описание структуры TMedia


 
Clickmaker ©   (2004-06-08 16:14) [13]

Да у тебя и в
Stream.ReadBuffer(Media^, SizeOf(PMedia));
та же ошибка.
Везде исправил?


 
Snip ©   (2004-06-08 16:15) [14]

Digitman, у меня с TMedia такой же косяк, вообще не хочет...
а открыл я этот folder.dat там вообще лажа какая то.... относящееся к tvExplorer ничего...


 
Snip ©   (2004-06-08 16:17) [15]

Пока токая, но это так сказать основы

 TMedia = packed record
   MediaType: Word;
   Name: ShortString;
   FullPath: ShortString;
   Password: ShortString;
 end;


 
Clickmaker ©   (2004-06-08 16:20) [16]


> Snip ©   (08.06.04 16:17) [15]

Ну дык, а чего ж ты хочешь? ShortString - это по сути тоже указатель, поэтому либо надо вычислять размер каждого экземляра структуры с помощью Length для каждой строки, а не простым SizeOf, либо заменить ShortString на array[0..255] of char, например


 
Digitman ©   (2004-06-08 16:25) [17]


> Clickmaker ©   (08.06.04 16:20) [16]


ну это ты, положим, гонишь

A ShortString is 0 to 255 characters long. While the length of a ShortString can change dynamically, its memory is a statically allocated 256 bytes

т.о., при

TMedia = packed record
  MediaType: Word; // 2 байта
  Name: ShortString; //256 байт
  FullPath: ShortString; //256 байт
  Password: ShortString; //256 байт
end;

sizeof(TMedia) всегда будет равно 2 + 256 + 256 + 256 = 770 байт


 
Clickmaker ©   (2004-06-08 16:33) [18]


> Digitman ©   (08.06.04 16:25) [17]

А, точно! Это же ShortString.
Ну тогда единственная ошибка, которую я здесь вижу, - это SizeOf(PMedia)


 
Digitman ©   (2004-06-08 16:39) [19]


> Clickmaker ©   (08.06.04 16:33) [18]
> единственная ошибка.. - это
> SizeOf(PMedia)


угу .. грубый ляп ... или непонимание ..


 
Digitman ©   (2004-06-08 16:46) [20]

procedure TfMain.LoadTree;
var
Stream: TFileStream;
Index: Integer;
Media: PMedia;
begin
if not FileExists(ExtractFilePath(Application.ExeName)+"folder.dat") then begin
  CreateNewTree(tvExplorer);
  Exit;
end;
Stream:=TFileStream.Create(ExtractFilePath(Application.ExeName)+"folder.dat", fmOpenRead);
//Stream.Position:=0;// лишнее
tvExplorer.LoadFromStream(Stream);
for Index:= 0 to Pred(tvExplorer.Items.Count) do begin
  New(Media);
  Stream.ReadBuffer(Media^, SizeOf(Media^{!!})); // или уж тогда SizeOf(TMedia) - индифферентно, но первое логичней
  tvExplorer.Items[Index].Data:=Media;
end;
Stream.Destroy; // Free вместо Destroy будет по-любому корректней
end;

procedure TfMain.SaveTree;
var
Stream: TFileStream;
Index: Integer;
begin
Stream:=TFileStream.Create(ExtractFilePath(Application.ExeName)+"folder.dat", fmCreate);
tvExplorer.SaveToStream(Stream);
for Index:= 0 to Pred(tvExplorer.Items.Count) do
  Stream.WriteBuffer(PMedia(tvExplorer.Items[Index].Data)^, SizeOf(Media^)); // !!!!! та же грубая ошибка ! Stream.Destroy; // та же некорректность
end;


 
Digitman ©   (2004-06-08 16:50) [21]


> Stream.WriteBuffer(PMedia(tvExplorer.Items[Index].Data)^,
> SizeOf(Media^));


пардон,

Stream.WriteBuffer(PMedia(tvExplorer.Items[Index].Data)^, SizeOf(PMedia^)); // поскольку перем-я Media здесь не фигурирует, сошлемся прямо на указ.тип, разыменовав его в обяз.порядке ... либо прямо на ТMedia безо всяких разыменований, что несколько нелогично в плане разношерстности параметров вызова


 
Digitman ©   (2004-06-08 16:56) [22]

SizeOf(PMedia^)

компилятором это читается как "использовать размер того, на что указывает указательный тип PMedia" ... а указывает он на структуру, размер которой компилятору так же известен... равно как известен он и при ссылке на Media^, где Media - это PMedia (т.е. переменная указ.типа)


 
Defunct ©   (2004-06-08 16:58) [23]

еще одна мелочь:

for Index:= 0 to Pred(tvExplorer.Items.Count-1) do


 
Defunct ©   (2004-06-08 17:02) [24]

>> PMedia(tvExplorer.Items[Index].Data)^
Это бред

должно быть:
tvExplorer.Items[Index].Data^


 
Clickmaker ©   (2004-06-08 17:07) [25]


> Defunct ©   (08.06.04 16:58) [23]
> еще одна мелочь:
>
> for Index:= 0 to Pred(tvExplorer.Items.Count-1) do

Pred - это уже -1


 
Defunct ©   (2004-06-08 17:10) [26]

> Pred - это уже -1

ops, my bad


 
Snip ©   (2004-06-08 17:13) [27]

люди....... что не делал, все та же одна ошибка:
Stream Read Error, все ваши предложения перепробывал.... но не как


 
Snip ©   (2004-06-08 17:19) [28]

народ, плиз отладте мне этот чертов код....


 
Digitman ©   (2004-06-08 17:19) [29]


> Defunct ©   (08.06.04 17:02) [24]
> >> PMedia(tvExplorer.Items[Index].Data)^
> Это бред


это не бред

это указание компилятору, читаемое тобой и им как

"рассматривая нетипизированный указатель, хранимый св-вом tvExplorer.Items[Index].Data, как типизированный указатель на структуру типа ТMedia, получить ссылку на экз-р этой структуры и передать ее факт.параметром в ф-цию, требующую этим параметром адрес на буфера произвольного типа"


 
Digitman ©   (2004-06-08 17:21) [30]


> Snip ©   (08.06.04 17:19) [28]
> народ, плиз отладте мне этот чертов код....


ты б хоть про $ намекнул .. а то ведь халявщиком нарисовался ..


 
Clickmaker ©   (2004-06-08 17:23) [31]


> Snip ©   (08.06.04 17:19) [28]
> народ, плиз отладте мне этот чертов код....

(серьезно) Сколько готов заплатить?


 
Snip ©   (2004-06-08 17:25) [32]

Digitman, да я думал, Вы, хоть земляку своему бывшему поможете... который бедный один в большом городе пытьается заработать на хлеб


 
Snip ©   (2004-06-08 17:28) [33]

Да ладно... нахрен платить... сам разберусь, голова все таки есть... так лучше будет... вот спасибо за идею с потоком... может и додумался бы сам, но вы все таки помогли... спасибо еще раз... пошел разбираться...


 
Digitman ©   (2004-06-08 17:39) [34]


> Snip ©   (08.06.04 17:25) [32]
> Digitman, да я думал, Вы, хоть земляку своему бывшему поможете


ну да, конечно ... у тебя ж - все видят - в анкете флаг висит насчет якобы "землячества" ...

а и висел бы - всенепременно помог бы при условии, что ты по каждому моему комментарию задал вопрос "а почему это так, а это не так ?" ...

а "большой город", извини уж, меня ничуть не трогает ... если не даже не вызывает отторжения))


 
Snip ©   (2004-06-08 17:48) [35]

Digitman, что думаешь что я такой осел??? я там все прикрасно понимаю... каждый твой коментарий я и так понимал... мне просто бесит это Stream Read Error, вообще замучил... вот этого понять я ни как не могу... что ему еще не хватает...


 
Snip ©   (2004-06-08 18:04) [36]

Спасибо все еще раз... все я сделал... надо было тока под Data использовать отдельный поток... и все ни каких ошибок...


 
pasha_golub ©   (2004-06-08 18:19) [37]

Snip ©   (08.06.04 18:04) [36]
А чего ж ты молчал, шо у тебя многопоточноая работа идет? :-)



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

Форум: "Основная";
Текущий архив: 2004.06.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.043 c
14-1086155836
NailMan
2004-06-02 09:57
2004.06.20
Нужен хороший монитор сети


14-1084105414
RealRascal
2004-05-09 16:23
2004.06.20
Баги с пиктограммками в XP


3-1085706544
Slavik_v
2004-05-28 05:09
2004.06.20
Интеграция Delphi7 b Excel


1-1085950933
NeVIP.
2004-05-31 01:02
2004.06.20
ExcelApplication


3-1085744896
Lenikur
2004-05-28 15:48
2004.06.20
Ограничение на размер данных, вставляемых в BLOB поле





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский