Witajcie mam taki problem zpisuje zawartosc checklistbox do pliku checklistbox1.item.savetofile('c:/test.txt') i gdy odczytuje jego zawartosc z pliku checklistbox1.item.loadfromfile('c:/test.txt') checkboxy nie sa w ogóle zaznaczone a zaznaczone były przy zapisywaniu jak to zrobic aby po odczytaniu byly w takim samym stanie jak po zapisaniu ?
Napisać własne zapisywanie i wczytywanie -> np możesz zapisywać do nowego TStringList itemy z checklistboxa poprzedzone + jeśli były zaznaczone lub -, jeśli nie były a potem wczytywać to też za pomocą TStringLista i odpowiednio wstawiać itemy do checklistboxa.
Dzieki ale szczerze nic z tego nie rozumiem :/ dlatego napisalem w newbie
omg... masz gotowca - pisane z pamięci, więc może wymagać poprawek:
procedure save(path : string);
var i : integer;
res : TStringList;
begin
res := TStringList.Create();
for i := 0 to checklistbox1.items.count-1 do // albo coś analogicznego, co zwraca ilość elementow
begin
if (checklistbox1.checked[i]) then
res.add('+' + checklistbox1.items[i])
else
res.add('-' + checklistbox1.items[i]);
end;
res.saveToFile(path);
res.free();
end;
procedure load(path: String);
var
res : TStringList;
i : integer;
begin
res := TStringList.create();
res.loadFromFile(path);
checklistbox1.items.clear();
for i:= 0 to res.count-1 do
begin
checklistbox1.items.add(substring(res.items[i]), 1, length(res.items[i])); // zakładam, że istnieje taka funkcja: substring(string_oryginalny, pocz, kon)
if (res.items[i][0] = '+') then
checklistbox1.checked[i] := true
else
checklistbox1.checked[i] := false;
end;
res.free();
end;
Coś w ten deseń...
Albo tak
//zapis
procedure TForm1.Button1Click(Sender: TObject);
var
f:TextFile;
i:Integer;
begin
AssignFile(f,'test.txt');
Rewrite(f);
for i:=0 to CheckListBox1.Items.Count-1 do
begin
WriteLn(f,CheckListBox1.Items[i]);
WriteLn(f,Integer(CheckListBox1.Checked[i]));
end;
CloseFile(f);
end;
//odczyt
procedure TForm1.Button2Click(Sender: TObject);
var
f:TextFile;
s:string;
c,i:Integer;
begin
CheckListBox1.Clear;
AssignFile(f,'test.txt');
Reset(f);
while not Eof(f) do
begin
ReadLn(f,s);
i:=CheckListBox1.Items.Add(s);
ReadLn(f,c);
CheckListBox1.Checked[i]:=Boolean(c);
end;
CloseFile(f);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
S : string;
begin
Zdarzenie := TZdarzenie.Create;
Zdarzenie.Tekst := Edit1.Text;
Zdarzenie.Data := DateTimePicker1.Date;
Zdarzenie.Czas := DateTimePicker2.Time;
S := Zdarzenie.Tekst + ' - ' + DateToStr(Zdarzenie.Data) + ' - ' + TimeToStr(Zdarzenie.Czas);
if CheckListBox1.Items.IndexOf(S) = -1 then
begin
CheckListBox1.AddItem(S, Zdarzenie);
CheckListBox1.Checked[CheckListBox1.Items.Count - 1] := True;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
I : integer;
DS, TS : string;
begin
for I := 0 to CheckListBox1.Items.Count - 1 do
begin
if CheckListBox1.Checked[I] = True then
begin
Zdarzenie := TZdarzenie(CheckListBox1.Items.Objects[I]);
DS := DateToStr(Zdarzenie.Data);
TS := TimeToStr(Zdarzenie.Czas);
if (Time > StrToTime(TS)) and (Date = StrToDate(DS))
or (Date > StrToDate(DS)) then
begin
CheckListBox1.Items.Delete(I);
MessageBox(Application.Handle, PChar(Zdarzenie.Tekst),
PChar(Application.Title), MB_ICONINFORMATION + MB_OK);
end;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Caption := 'Przypominacz';
Timer1.Enabled := True;
Timer1.Interval := 1000;
Application.Title := Caption;
DateTimePicker1.Kind := dtkDate;
DateTimePicker2.Kind := dtkTime;
DateTimePicker1.Date := Date;
DateTimePicker2.Time := Time;
end;
procedure TForm1.Edit1Click(Sender: TObject);
begin
edit1.Font.color := clNone;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if MessageDlg('Czy napewno chcesz usuną alarm ?', mtConfirmation,[mbYes,mbNo],0) = mrYes then
checklistbox1.DeleteSelected;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
f:TextFile;
i:Integer;
begin
AssignFile(f,'test.txt');
Rewrite(f);
for i:=0 to CheckListBox1.Items.Count-1 do
begin
WriteLn(f,CheckListBox1.Items[i]);
WriteLn(f,Integer(CheckListBox1.Checked[i]));
end;
CloseFile(f);
end;
procedure TForm1.Button4Click(Sender: TObject);
var
f:TextFile;
s:string;
c,i:Integer;
begin
CheckListBox1.Clear;
AssignFile(f,'test.txt');
Reset(f);
while not Eof(f) do
begin
ReadLn(f,s);
i:=CheckListBox1.Items.Add(s);
ReadLn(f,c);
CheckListBox1.Checked[i]:=Boolean(c);
end;
CloseFile(f);
end;
end.
Zapisuje ładnie odczytuje tez z zapisanymi zmianami ale wyskakuje mi błąd
" Project Project1.exe raised exception class EAViolation with message 'acces violation at adress 0045B591 in module 'Project1.exe' read of addreess 0000000C' process stoped"
Pytający w ogóle nie myśli samodzielnie, a że nie pokazał Wam od razu przykładu do jakich cełow chce ten zapis oraz odczyt
mieć to podaliście mu najprostsze metody, które przy jego kodzie nie zadziałają. Przecież co z tego że dodasz do Twojego
CheckListBoxa jakieś zapisane teksty i je zaznaczysz. Przecież wyraźnie widać, że pętla (którą niestety z pośpiechu ciut źle
skonstruowałem, bo powinna być malejąca, teraz jest ok) używa typu obiektowego, a jak wczytasz zwykły tekst to g**no,
że tak obrazowo napisze - Ci to da. Powinno być coś w stylu poniżej. Przetestowane na szybko działa wedlug mnie ok. A i
do pokazywanie pytan czy usunąc, i tym pdoobnych używaj MesageBoxów bo lepiej wyglądają pod nowszymi systemami, i
są przede wszystkim bardziej uniwersalne. No i dalej program pisz już sam, bo wszystko napisaliśmy za Ciebie, zaś Ty nic
nie zrobiłęś poza dopisaniem kodu do usuwania zaznaczonych elementów. Oczywiście jeżeli chcesz dodać jakieś inne dane
do zapisu do pliku to w przypadku danych tekstowych typu string rób tak jak w przykładzie, a jednocześnie pamiętaj, aby
przy zapisie i odczycie dane były zapisywane oraz wczyrywane w takiej samej kolejności, by uniknąć błędów oraz chaosu.
Poza tym przydało by się nie wklejać "na pałe" mojego kodu tylko nazwać sensownie komponenty, a nie Edit1, Button1.
//...
public
procedure WczytajDane(PlikDat : string);
procedure ZapiszDane(PlikDat : string);
end;
type
TZdarzenie = class(TObject)
Data : TDate;
Czas : TTime;
Tekst : string;
end;
var
Form1 : TForm1;
Zdarzenie : TZdarzenie;
DaneRec_Dlugosci : record
TekstDlugosc : Word;
end;
implementation
{$R *.dfm}
procedure TForm1.WczytajDane(PlikDat : string);
var
S : string;
FS : TFileStream;
Zaznaczony : boolean;
begin
if FileExists(PlikDat) = False then
begin
Exit;
end;
CheckListBox1.Items.Clear;
FS := TFileStream.Create(PlikDat, fmOpenReadWrite);
try
while FS.Position < FS.Size do
begin
Zdarzenie := TZdarzenie.Create;
FS.Read(DaneRec_Dlugosci, SizeOf(DaneRec_Dlugosci));
SetLength(Zdarzenie.Tekst, DaneRec_Dlugosci.TekstDlugosc);
FS.Read(Zdarzenie.Tekst[1], DaneRec_Dlugosci.TekstDlugosc);
FS.Read(Zaznaczony, SizeOf(Zaznaczony));
FS.Read(Zdarzenie.Data, SizeOf(Zdarzenie.Data));
FS.Read(Zdarzenie.Czas, SizeOf(Zdarzenie.Czas));
S := DateToStr(Zdarzenie.Data) + ' - ' + TimeToStr(Zdarzenie.Czas);
CheckListBox1.AddItem(S, Zdarzenie);
CheckListBox1.Checked[CheckListBox1.Items.Count - 1] := Zaznaczony;
end;
except
MessageBox(Application.Handle, PChar('Nie można wczytać pliku: ' +
PlikDat + '!'), PChar(Application.Title), MB_ICONERROR + MB_OK);
end;
if FS <> nil then
FS.Free;
end;
procedure TForm1.ZapiszDane(PlikDat : string);
var
FS : TFileStream;
I, Ilosc : Integer;
Zaznaczony : boolean;
begin
Ilosc := CheckListBox1.Items.Count;
FS := TFileStream.Create(PlikDat, fmCreate);
try
for I := 0 to Ilosc - 1 do
begin
Zdarzenie := TZdarzenie(CheckListBox1.Items.Objects[I]);
DaneRec_Dlugosci.TekstDlugosc := Length(Zdarzenie.Tekst);
FS.Write(DaneRec_Dlugosci, SizeOf(DaneRec_Dlugosci));
FS.Write(Zdarzenie.Tekst[1], DaneRec_Dlugosci.TekstDlugosc);
Zaznaczony := CheckListBox1.Checked[I];
FS.Write(Zaznaczony, SizeOf(Zaznaczony));
FS.Write(Zdarzenie.Data, SizeOf(Zdarzenie.Data));
FS.Write(Zdarzenie.Czas, SizeOf(Zdarzenie.Czas));
end;
except
MessageBox(Application.Handle, PChar('Nie można zapisać do pliku: ' +
PlikDat + '!'), PChar(Application.Title), MB_ICONERROR + MB_OK);
end;
if FS <> nil then
FS.Free;
end;
procedure TForm1.FormCreate(Sender : TObject);
begin
Caption := 'Terminarz';
Timer1.Enabled := True;
Timer1.Interval := 1000;
Application.Title := Caption;
DateTimePicker1.Kind := dtkDate;
DateTimePicker2.Kind := dtkTime;
DateTimePicker1.Date := Date;
DateTimePicker2.Time := Time;
end;
procedure TForm1.Timer1Timer(Sender : TObject);
var
I : integer;
DS, TS : string;
begin
for I := CheckListBox1.Items.Count - 1 downto 0 do
begin
if CheckListBox1.Checked[I] = True then
begin
Zdarzenie := TZdarzenie(CheckListBox1.Items.Objects[I]);
DS := DateToStr(Zdarzenie.Data);
TS := TimeToStr(Zdarzenie.Czas);
if (Time > StrToTime(TS)) and (Date = StrToDate(DS))
or (Date > StrToDate(DS)) then
begin
CheckListBox1.Items.Delete(I);
MessageBox(Application.Handle, PChar(Zdarzenie.Tekst),
PChar(Application.Title), MB_ICONINFORMATION + MB_OK);
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender : TObject);
var
S : string;
begin
Zdarzenie := TZdarzenie.Create;
Zdarzenie.Tekst := Edit1.Text;
Zdarzenie.Data := DateTimePicker1.Date;
Zdarzenie.Czas := DateTimePicker2.Time;
S := DateToStr(Zdarzenie.Data) + ' - ' + TimeToStr(Zdarzenie.Czas);
if CheckListBox1.Items.IndexOf(S) = -1 then
begin
CheckListBox1.AddItem(S, Zdarzenie);
CheckListBox1.Checked[CheckListBox1.Items.Count - 1] := True;
end;
end;
procedure TForm1.Button2Click(Sender : TObject);
begin
WczytajDane('terminy.dat');
end;
procedure TForm1.Button3Click(Sender : TObject);
begin
ZapiszDane('terminy.dat');
end;