unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
ListView1: TListView;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
Magic = 'LVF';
Msg1 = 'ÆÄÀÏ "%s" °¡ ¾ø½À´Ï´Ù !';
Msg2 = 'ÆÄÀÏ "%s" ´Â ¸®½ºÆ®ºä°¡ ÀÚÀåµÈ ÆÄÀÏÀÌ ¾Æ´Õ´Ï´Ù !';
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure SaveListViewToFile(AListView: TListView; sFileName: string);
var
idxItem, idxSub, IdxImage : integer;
F : TFileStream;
pText : PChar;
sText : string;
W, ItemCount, SubCount : word;
MySignature : array [0..2] of char;
begin
with AListView do
begin
ItemCount := 0;
SubCount := 0;
MySignature := Magic; // ¸®½ºÆ®ºÎ°¡ ÀÚÀåµÈ ÆÄÀÏÀÓÀ» Ç¥½ÃÇϱâ À§ÇØ ÆÄÀÏÀÇ ¸Ç óÀ½¿¡ ±âÈ£ Ãâ·Â
F := TFileStream.Create(sFileName, fmCreate or fmOpenWrite);
F.Write(MySignature, sizeof(MySignature));
if Items.Count = 0 then ItemCount := 0
else ItemCount := Items.Count;
F.Write(ItemCount, Sizeof(ItemCount));
if Items.Count > 0 then
begin
for idxItem := 1 to ItemCount do
begin
with items[idxItem - 1] do
begin
if SubItems.Count = 0 then SubCount := 0
else SubCount := Subitems.Count;
F.Write(SubCount, Sizeof(SubCount));
IdxImage := ImageIndex;
F.Write(IdxImage, Sizeof(IdxImage));
sText := Caption;
w := length(sText);
pText := StrAlloc(Length(sText) + 1);
StrPLCopy(pText, sText, Length(sText));
F.Write(w, sizeof(w));
F.Write(pText^, w);
StrDispose(pText);
if SubCount > 0 then
begin
for idxSub := 0 to SubItems.Count - 1 do
begin
sText := SubItems[idxSub];
w := length(sText);
pText := StrAlloc(Length(sText) + 1);
StrPLCopy(pText, sText, Length(sText));
F.Write(w, sizeof(w));
F.Write(pText^, w);
StrDispose(pText);
end;
end;
end;
end;
end;
F.Free;
end;
end;
procedure LoadListViewToFile(AListView: TListView; sFileName: string);
var
F : TFileStream;
IdxItem, IdxSubItem, IdxImage : integer;
W, ItemCount, SubCount : word;
pText : PChar;
PTemp : PChar;
MySignature : array [0..2] of char;
sExeName : string;
begin
with AListView do
begin
ItemCount := 0;
SubCount := 0;
sExeName := ExtractFileName(sFileName);
if not FileExists(sFileName) then
begin
MessageBox(Handle, PChar(format(Msg1, [sExeName])), 'I/O Error', MB_ICONERROR);
Exit;
end;
F := TFileStream.Create(sFileName, fmOpenRead);
F.Read(MySignature, sizeof(MySignature));
if MySignature <> Magic then
begin
MessageBox(Handle, PChar(format(Msg2, [sExeName])), 'I/O Error', MB_ICONERROR);
Exit;
end;
F.Read(ItemCount, sizeof(ItemCount));
Items.Clear;
for idxItem := 1 to ItemCount do
begin
with Items.Add do
begin
F.Read(SubCount, sizeof(SubCount));
F.Read(IdxImage, sizeof(IdxImage));
ImageIndex := IdxImage;
F.Read(w, SizeOf(w));
pText := StrAlloc(w + 1);
pTemp := StrAlloc(w + 1);
F.Read(pTemp^, W);
StrLCopy(pText, pTemp, W);
Caption := StrPas(pText);
StrDispose(pTemp);
StrDispose(pText);
if SubCount > 0 then
begin
for idxSubItem := 1 to SubCount do
begin
F.Read(w, SizeOf(w));
pText := StrAlloc(w + 1);
pTemp := StrAlloc(w + 1);
F.Read(pTemp^, W);
StrLCopy(pText, pTemp, W);
Items[idxItem - 1].SubItems.Add(StrPas(pText));
StrDispose(pTemp);
StrDispose(pText);
end;
end;
end;
end;
F.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveListViewToFile(ListView1, 'Data.sav');
ListView1.Items.Clear;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
LoadListViewToFile(ListView1, 'Data.sav');
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
itm: TListItem;
begin
Button1.Caption := 'ÀúÀåÇϱâ';
Button2.Caption := 'ºÒ·¯¿À±â';
with ListView1 do
begin
Columns.Add;
Columns.Add;
Columns[0].Caption := 'Çʵå1';
Columns[1].Caption := 'Çʵå2';
Columns[0].Width := 100;
Columns[1].Width := 100;
end;
SendMessageA(ListView1.Handle, WM_SETREDRAW, 0, 0);
try
ListView1.Items.Clear;
for i := 1 to 20 do
begin
itm := ListView1.Items.Add;
with itm do
begin
Caption := 'Item' + IntToStr(i);
SubItems.Add ('sub' + IntToStr(i));
end;
end;
finally
SendMessageA(ListView1.Handle, WM_SETREDRAW, 1, 0);
end;
end;
end.
|
|