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.
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;
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ł ?
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;