IF godz. 23.00 lub później THEN rób coś tam...

0

Witam!

Chcę napisać powyższy warunek, aby o tej lub po tej godzinie program wykonywał jakąś czynność.

Pytanie brzmi:
Czy godzinę np. 2300 przekonwertować na ilość minut i dopiero potem napisać taki warunek, czy jest jakiś inny - prostszy sposób?

Dzięki za wskazówki :)

0

StrToTime?

0
function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;
0

Bełdzio, ale po co? ;)

Cały czas myślałem od StrToTime, ale czemu nie wykorzystałem tego?
No więc zrobiłem teraz takie coś:

//pokazuje czas
procedure TForm1.Timer1Timer(Sender: TObject);
begin
label1.Caption:=FormatDateTime('hh:mm:ss',now);
end;

// jeśli godzina 23:00:00 lub później to pokaż message
procedure TForm1.Button1Click(Sender: TObject);
begin
if StrToTime(label1.Caption)>=StrToTime('23:00:00') then
showmessage('Pora spać! :)');
end;

No i działa ;)

0

Bełdzio ma racje, tak jak robisz jest dookoła.

Powininno to wygladać:

if Time>EncodeTime(23,00,0,0) then self.Caption:='Won spac';

Jeśli godzina jest ustawiona na twardo w programie, możesz uniknąć wywoływania funkcji EncodeTime i dać:

if Time>0.95833333333333333333333333333333 then self.Caption:='Won spac';  //23:00

PS. Twoja wersja się wywali jak user będzie miał ustawiony inny format daty i 23:00 będzie wyglądać np 11:00p albo w ogóle ustawi sobie inny separator: 11.00p

0
pq napisał(a)

Bełdzio ma racje, tak jak robisz jest dookoła.

Powininno to wygladać:

if Time>EncodeTime(23,00,0,0) then self.Caption:='Won spac';

Jeśli godzina jest ustawiona na twardo w programie, możesz uniknąć wywoływania funkcji EncodeTime i dać:

if Time>0.95833333333333333333333333333333 then self.Caption:='Won spac';  //23:00

PS. Twoja wersja się wywali jak user będzie miał ustawiony inny format daty i 23:00 będzie wyglądać np 11:00p albo w ogóle ustawi sobie inny separator: 11.00p

dookola tak
Wersja sie wywali raczej nie bo jest z gory narzucona przez programiste nikt nie bedzie modyfikowal ani formatu ani separatora a nawet jesli bedzie to dostepne w programie to StrToTime bedzie z tego rowniez korzystalo w danym momencie i w zaleznosci od formatu i separatora konwerstorwalo do TDateTime i watpie zeby pozniej wklepywal ta godzine recznie do Edit'a ;] tylko jak juz z narzucona maska lub ustawial za pomoca UpDown'ow ;)

0
Maker napisał(a)

Wersja sie wywali raczej nie bo jest z gory narzucona przez programiste nikt nie bedzie modyfikowal ani formatu ani separatora a nawet jesli bedzie to dostepne w programie to StrToTime bedzie z tego rowniez korzystalo w danym momencie

Wywali się. User może zmodyfikować format i separator na poziomie systemu.
Jeśli separator będzie np '.' wtedy

StrToTime('23:00:00')

zgłupieje bo będzie szukac kropki a tam są dwukropki i wyrzuci

'23:00:00' is not a valid time.
0

nie lubie sie klocic dlatego tez sprawe postawie jasno i wyraznie podczas uruchamiania aplikacji sa deklarowane pewne zmienne "srodowiskowe" ktorych wartosci pobierane sa owszem z systemu jak wskazales jak ktos sobie postawi kropke itd.. itp... moze rownie dobrze krzyzyk sobie wstawic jesli bedzie zdolny ;) ale w aplikacji mozna te ustawienia nadpisac uzywajac wlasnie tych zmiennych "srodowiskowych" wiec jak juz wczesniej wspomnialem wystarczy je tylko zmienic poniewaz format ktory przedstawia wizualnie date i godzine to jedno a format w jakim jest przechowywana to drugie a to jest tylko liczba w ktorej nie ma info o Twoim separatorze czy tez formacie format jest ustalany dopiero podczas wyswietlania wiec skoryguj swoje wiadomosci na ten temat a najlepij odniesc sie do WINAPI

P.S. odnosnie tych zmiennych "srodowiskowych" mialem na mysli w aplikacjach skompilowanych w srodwiskach Borlanda Delphi Czy Builder normalnie w aplikacji pisanej w czystym winapi uzywa sie do tego funkcji GetTimeFormat i GetDateFormat

0

No tak. Macie rację. Przykład, którego ja podałem był takim surowym i najprostszym (chyba), aby tylko sprawdzić czy działa :)
Jeśli bym robił już na poważnie jakiś program z taką funkcją, to oczywiście skorzystałbym z tego, z czego mi radzicie.

W sumie zawsze gdzieś na jakimś systemie można przetestować kto ma rację z tym formatem godziny czy będzie wywalać program :) W każdym razie znam się mniej od Was na tym i polegam tylko na Waszej wiedzy (jak na razie) :).

0

Ten przykład jest w FAQ:

procedure TForm1.Timer1Timer(Sender: TObject);
var
 Present : TDateTime;
 Hour, Min, Sek, MSec : Word;
begin
 Present := Now;
 DecodeTime(Present, Hour, Min, Sek, MSec);
 if ((Hour >= 23) and (Min >= 0) and (Sek >= 0)) then
 Label1.Caption := 'jest 23.00 lub póżniej';
end;
0

Hallo Stealth, hallo Opi!

Opi napisał(a)

Ten przykład jest w FAQ:

procedure TForm1.Timer1Timer(Sender: TObject);
var
 Present : TDateTime;
 Hour, Min, Sek, MSec : Word;
begin
 Present := Now;
 DecodeTime(Present, Hour, Min, Sek, MSec);
 if ((Hour >= 23) and (Min >= 0) and (Sek >= 0)) then
 Label1.Caption := 'jest 23.00 lub póżniej';
end;

Mysle, ze to najlepsza z dotychczasowach propozycji. Mimo to troszke bym ja zmodifikowal:

zamiast:

 if ((Hour >= 23) and (Min >= 0) and (Sek >= 0)) then

napisalbym:

 if (Hour >= 23) then

Pozdrawiam
Markus
[???]

0
Maker napisał(a)

ale w aplikacji mozna te ustawienia nadpisac uzywajac wlasnie tych zmiennych "srodowiskowych"

Racja, mozna wpisać kod kontroli nad nietypowymi ustawieniami. Tylko że w podanym przykładzie go nie widac . Poza tym moja wersja z EncodeTime załatwia jak sądzę sprawę bezpiecznie i bez pisania dodatkowego kodu.

Stealth napisał(a)

W sumie zawsze gdzieś na jakimś systemie można przetestować kto ma rację z tym formatem godziny czy będzie wywalać program

Sprawdziłem już wczoraj, wywala się.

MarkusB napisał(a)

Mysle, ze to najlepsza z dotychczasowach propozycji.

Będę sie jednak upierał ze najlepsza jest moja. Pomijając nawet kwestie nietypowych formatów.

TDateTime jest naprawdę wartością double, której część całkowita reprezentuje Date a ułamkowa Time. Moja wersja wprost porównuje tą wartość z wartością graniczną (23:00) albo wyliczoną w najprostszy sposób przez EncodeTime, albo nawet podaną jako stała.

Wasze wersje idą doookoła albo przez konwersję do stringów, albo przez wielokrotne porównania: każdego składnika czasu oddzielnie.

I jeszcze nastepujące niezreczności:

and (Min >= 0) and (Sek >= 0)) 

Po co? W konkretnym wypadku równej fodziny ta część kodu jest niepotrzebna bo ani Min ani Sek nie mogą być mniejsze od 0.

 Present := Now;
 DecodeTime(Present, Hour, Min, Sek, MSec);

Po co zmienna Present? Nie prościej:

  DecodeTime(Now, Hour, Min, Sek, MSec);
0
Maker napisał(a)

ale w aplikacji mozna te ustawienia nadpisac uzywajac wlasnie tych zmiennych "srodowiskowych" wiec jak juz wczesniej wspomnialem wystarczy je tylko zmienic

Nic tylko pogratulowac podejścia [sciana] a jak user zapyta czemu zmieniłeś mu jego ustawienia systemu to mu napiszesz, że tak Ci było łatwiej??

poniewaz format ktory przedstawia wizualnie date i godzine to jedno a format w jakim jest przechowywana to drugie a to jest tylko liczba w ktorej nie ma info o Twoim separatorze czy tez formacie format jest ustalany dopiero podczas wyswietlania wiec skoryguj swoje wiadomosci na ten temat a najlepij odniesc sie do WINAPI

tylko jakbyś nie zauważył parametrem funkcji StrToTime jest właśnie ten format jak go nazwałeś wizualny i tam separator jest ważny

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