Delphi przypominacz

0

witam staram się napisać program przypominacz / reminder który działałby następująco po naciśnięciu buttona wyswietla mi się okno w ktorym wybieram czas, datę oraz treść przypomnienia o raz zaznaczam w jakich dniach alarm ma byc aktywny np. czwartek i piątek po czym zatwierdzam wszystko ok i caly alarm dodaje mi sie do checklistboxa gdzie zaznaczam czy ma byc on aktywny czy nie ( mozna dodac kilka alarmów / przypomnień. Moje pytanie jest takie jak dodac to do checklistboxa i jak ustawic ttimer aby wiedzial ktory alarm i kiedy wyswietlic. nadmienie ze jestem początkującym uzytkownikiem delphi.

0

Masz, dopasuj to do swoich potrzeb, dodaje ewentualne sortowanie wedlug dat i takie tam. I wiem, miałem nie pisać
za leniwych i nie szukających samodzielnie ludzi - gotowców, ale byłem w sumie ciekawy z czym jest taki problem ;/
I jedyny "problem" jaki napotkałem polega na tym, że dodawany czas jest z milisekundami, a przy dodawaniu daty w
sumie też moga pojawić się rozbieżności i stąd to konwertowanie na string w zdarzeniu OnTimer dla użytego Timera.

//...
type
  TZdarzenie = class(TObject)
    Data : TDate;
    Czas : TTime;
    Tekst : string;
  end;

var
  Form1 : TForm1;
  Zdarzenie : TZdarzenie;

implementation

{$R *.dfm}

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 := 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.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;
0

Dzieki wielkie olesio, pozmieniałem troche do moich potrzeb tzn dodałem zapis checklistboxa do pliku i troche wyswietlanie , ale męcze się i za cholere niemoge dorobic cykliczności czyli np zebym zaznaczal wtorek,sroda itp. podsuniesz mi moze jakis pomysł ?

0

Z zapisem i odczytem danych już Tobie pokazałem przykład w innym wątku co go stworzyłeś. A i co
do tych dni tygodnia to nie wiem co chcesz osiągnąć, ale jest funkcja DayOfWeek(Data), więc sobie
poczytaj jej opis i zobacz poniższy kod, który użyłem kiedyś do wygenerowanie kalendarza, ktory w
zależności od miesiąca wyglądal inaczej. Kalendarz tworzył się w StringGridzie, ale tu chodzi o ideę.
Tutaj widać moją niekosnekwencje, bo pisalem Tobie żebyś sensowanie nazywał komponenty, lecz
tutaj w moim kodzie był tylko jeden StringGrid, ale jak masz wiele przycisków czy editow, a nawet
jeżeli tylko jeden to warto nadawać im sensowne nazwy we własności Name by się potem połpapać.

//...
procedure TMainForm.GenerujKalendarz;
const
  DniWRoku : array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var
  Dni, Miech, Rok : Word;
  I, J, Kolumna, Wiersz : integer;
  Data : TDate;
begin
  for I := 1 to StringGrid1.RowCount - 1 do
  begin
    StringGrid1.Rows[I].Clear;
  end;

  Miech := StrToInt(Miech_SE.Text);
  Rok := StrToInt(Rok_SE.Text);

  if (IsLeapYear(Rok) = True) and (Miech = 2) then
  begin
    Dni := DniWRoku[Miech] + 1;
  end
  else
  begin
    Dni := DniWRoku[Miech];
  end;
  Wiersz := 1;
  for I := 1 to Dni do
  begin
    try
      Data := EncodeDate(Rok, Miech, I);
      Caption := 'Kalendarz - ' + FormatDateTime('MMMM', Data) + #32 +
        FormatDateTime('YYYY', Data);
      case DayOfWeek(Data) of
        1 : Kolumna := 6;
        2 : Kolumna := 0;
        3 : Kolumna := 1;
        4 : Kolumna := 2;
        5 : Kolumna := 3;
        6 : Kolumna := 4;
        7 : Kolumna := 5;
      else
        Kolumna := 0;
      end;
    except
      Miech_SE.Text := FormatDateTime('M', Date);
    end;
    StringGrid1.Cells[Kolumna, Wiersz] := IntToStr(I);
    if Kolumna = 6 then
    begin
      Wiersz := Wiersz + 1;
    end;
  end;
  for I := 1 to StringGrid1.RowCount - 1 do
    for J := 0 to StringGrid1.ColCount - 1 do
    begin
      if (StringGrid1.Cells[J, I] <> '')
        and (EncodeDate(Rok_SE.Value, Miech_SE.Value,
        StrToInt(StringGrid1.Cells[J, I])) = Date) then
      begin
        StringGrid1.Row := I;
        StringGrid1.Col := J;
      end;
    end;
end;

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