checklistbox zapis do pliku

0

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 ?

0

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.

0

Dzieki ale szczerze nic z tego nie rozumiem :/ dlatego napisalem w newbie

0

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ń...

0

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;

0
 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"

0

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;

1 użytkowników online, w tym zalogowanych: 0, gości: 1