Citat:
[...] Da li mogu da ubrzam podizanje svog programa tako sto cu
na neki nacin smestiti na hdd te strukture i posle ih samo prebaciti
u operativnu memoriju. [...]
Definitivno je moguce (i pozeljno). Nisam nikada snimao binarnu
strukturu 'stabla', ali evo ti deo koda koji radi 'slicnu' stvar za
'TListView' komponentu, cisto da 'osetis' koncept. Kod binarnog
stabla, pretpostavljam da redosled obilazenja treba da bude i
redosled pisanja/citanja, pri cemu (valja) treba da napravis i
svoje kontrolne karaktere koj ce definisati nivoe. Bas me zanima,
kako ces to resiti. Javi ;)
Code:
bool __fastcall ReadBool(TStream *Stream)
{
bool Result = false;
Stream->Read(&Result, sizeof(bool));
return Result;
}
void __fastcall WriteBool(TStream *Stream, bool Value)
{
Stream->Write(&Value, sizeof(bool));
}
int __fastcall ReadInteger(TStream *Stream)
{
int Result = 0;
Stream->Read(&Result, sizeof(int));
return Result;
}
void __fastcall WriteInteger(TStream *Stream, int Value)
{
Stream->Write(&Value, sizeof(int));
}
AnsiString __fastcall ReadString(TStream *Stream)
{
int length = ReadInteger(Stream);
if( length > 0 )
{
AnsiString Result;
Result.SetLength(length);
Stream->Read(Result.c_str(), length);
return Result;
}
return "";
}
void __fastcall WriteString(TStream *Stream, const AnsiString &Value)
{
int length = Value.Length();
WriteInteger(Stream, length);
if( length > 0 )
Stream->Write(Value.c_str(), length);
}
void __fastcall ReadStrings(TStream *Stream, TStrings *Values)
{
int count = ReadInteger(Stream);
Values->BeginUpdate();
try
{
Values->Clear();
for(int x = 0; x < count; ++x)
Values->Append(ReadString(Stream));
}
__finally {
Values->EndUpdate();
}
}
void __fastcall WriteStrings(TStream *Stream, TStrings *Values)
{
int count = Values->Count;
WriteInteger(Stream, count);
for(int x = 0; x < count; ++x)
WriteString(Stream, Values->Strings[x]);
}
void __fastcall SaveListItems(TStream *Stream, TListItems *Items)
{
int count = Items->Count;
WriteInteger(Stream, count);
for(int x = 0; x < count; ++x)
{
TListItem *Item = Items->Item[x];
WriteString(Stream, Item->Caption);
WriteStrings(Stream, Item->SubItems);
WriteBool(Stream, Item->Checked);
WriteBool(Stream, Item->Cut);
WriteInteger(Stream, Item->ImageIndex);
// other values you are interested in ...
}
}
void __fastcall LoadListItems(TStream *Stream, TListItems *Items)
{
int count = ReadInteger(Stream);
Items->BeginUpdate();
try
{
Items->Clear();
for(int x = 0; x < count; ++x)
{
TListItem *Item = Items->Add();
Item->Caption = ReadString(Stream);
ReadStrings(Stream, Item->SubItems);
Item->Checked = ReadBool(Stream);
Item->Cut = ReadBool(Stream);
Item->ImageIndex = ReadInteger(Stream);
// other values you are interested in ...
}
}
__finally {
Items->EndUpdate();
}
}
Zatim, sve to koristis kao:
SaveListItems(SomeTargetStream, ListView1->Items);
//...
LoadListItems(SomeSourceStream, ListView1->Items);