Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Delphi - DateTimePicker - zadávanie dátumu a času naraz

Potreboval som v Delphi zadať do databázy dátum a čas s presnosťou na hodiny (minúty a sekundy sú teda nezaujímavé). Použil som komponentu DateTimePicker, ktorá práve toto umožňuje, keďže je možné nastaviť formát pre zadávanie a tým "stornovať" minúty a sekundy. Tieto časy sa mali zadávať dva s podmienkou, že druhý nasleduje za prvým (jedná sa o vymedzenie času neprítomnosti pracovníka). Pri kontrole časov pomocou udalosti OnChange som zistil, že sa mi kontroluje iba čas a že dátum môžem nastaviť aký chcem, program sa nestará, že je prvý väčší ako druhý. Problém bol v tom, že vlastnosť Kind bola nastavená na bkTime. Takže ako som neskôr zistil, tak to znamená zadávanie času. Porovnával som podľa vlastnosti DateTime. Rozhodol som sa teda nelaborovať a skúsil som dať pre každý čas dva DateTimePicker komponenty. Jeden pre dátum a druhý pre čas. Ako defaultný čas som dal dnešný dátum a čas (funkcia Today). Tam som oddelil desatinnú časť od celej časti a každú vložil do príslušnej komponenty. Táto komponenta si totiž pamätá aj dátum a čas, takže ten druhý údaj som musel anulovať. Ja som totiž chcel časový údaj získať sčítaním dátumového údaju z prvej komponenty s časovým údajom z druhej komponenty. Znamená to teda, že do dátumovej komponenty som vložil celé číslo ako dátum a do časovej som vložil desatinnú časť ako hodiny. Porovnávanie časov som musel upraviť pre túto novú situáciu a keď som porovnávanie dopísal, tak som to chcel vyskúšať. Pri zadaní nultej hodiny sa program zrútil. Vyzerá to tak, že zadaný čas bol teda 00:00:00 a keďže dátum som nastavil na nulu, tak výsledný časový údaj vo vlastnosti DateTime mal byť 0, ale program to nezvládol. Prečo som teda dátum oddelil od času? Išlo o to, aby som mohol sčítať časový údaj z dátumovej komponenty a časovej komponenty a získať tak dátum aj čas v premennej typu TDateTime (čiže Double). Program teda nebeží a mňa ide poraziť.

Vie mi niekto poradiť, ako zadávať dátum aj čas v jednej kompnente DateTimePicker, prípadne pomôcť so získaním časového údaju z dvoch komponent (1. dátum, 2. čas)?

Předmět Autor Datum
Nevím, jestli jsem celý dlouhatý dotaz dobře pochopil :-/. Co kdybys tím TDateTimePicker zadával jen…
Rce 15.03.2007 22:42
Rce
Prepáč, ale tvoje riešenie sa mi veľmi nepáčilo, keďže na čas je komponenta DateTimePicker a mala by…
msx. 18.03.2007 20:32
msx.
Já ten původní dotaz asi blbě pochopil :-/. Funkce Frac () pochopitelně v Delphi existuje. Nešlo by…
Rce 18.03.2007 22:40
Rce
Mne je jedno, ako sa bude pracovať s časom. Potrebujem len dosiahnuť to, čo som dosiahol a k tomu do…
msx. 18.03.2007 23:24
msx.
Datum a čas se do podmínek v SQL zadává dost blbě. Nejlépe je to přes parametr, to si veškeré převod…
Rce 18.03.2007 23:59
Rce
Super, ďakujem. Dúfam, že to funguje aj na update a insert into. Ale myslím, že áno, vyzerá to unive… poslední
msx. 19.03.2007 08:27
msx.

Nevím, jestli jsem celý dlouhatý dotaz dobře pochopil :-/. Co kdybys tím TDateTimePicker zadával jen datum a hodinu normálním textovým polem (nebo TSpinEdit). Sloučení provedeš takto (jen příklad):

DatumACas := DateTimePicker1.Date + EncodeTime (StrToInt (Edit1.Text), 0, 0, 0);

Prepáč, ale tvoje riešenie sa mi veľmi nepáčilo, keďže na čas je komponenta DateTimePicker a mala by sa vlastne použiť tá. No, tak som skúsil nájsť riešenie sám a skončilo to takto:

TForm.OnCreate

  dtpDateFrom.DateTime := Today;
  dtpTimeFrom.DateTime := dtpDateFrom.DateTime;
  dtpDateTo.DateTime := dtpDateFrom.DateTime;
  dtpTimeTo.DateTime := dtpTimeFrom.DateTime;

TForm.DateTimePickerChange - nastaviť na všetky 4 túto metódu

begin
  dtpDateFrom.DateTime := Int(dtpDateFrom.DateTime)
   + dtpTimeFrom.DateTime - Int(dtpTimeFrom.DateTime);
  dtpDateTo.DateTime := Int(dtpDateTo.DateTime)
   + dtpTimeTo.DateTime - Int(dtpTimeTo.DateTime);
  if dtpDateFrom.DateTime > dtpDateTo.DateTime then
    begin
      if ((Sender as TDateTimePicker) = dtpDateFrom)
       or ((Sender as TDateTimePicker) = dtpTimeFrom) then
        begin
          dtpDateTo.DateTime := dtpDateFrom.DateTime;
          dtpTimeTo.DateTime := dtpDateFrom.DateTime;
        end;
      if ((Sender as TDateTimePicker) = dtpDateTo)
       or ((Sender as TDateTimePicker) = dtpTimeTo) then
        begin
          dtpDateFrom.DateTime := dtpDateTo.DateTime;
          dtpTimeFrom.DateTime := dtpTimeTo.DateTime;
        end;
    end;
end;

No a časy sú v tým komponentách, ktoré majú v názve Date. Tie s názvom Time nemajú presný čas v prípade, že nedojde k stretnutiu časov, pretože časy sa preratúvajú len do do prvých dvoch komponent (prvé dva príkazy za begin).

Edit: Neexistuje protiklad k funkcii Int? Ide o to, že potrebujem odrezať desatinnú časť, pracovať s ňou a celú časť zahodiť. Na počítačoch Sharp MZ-800 na to bol v BASICu príkaz FRAC(). Potrebujem to na prvé dva príkazy za begin na odrezanie času z DateTime.

Mne je jedno, ako sa bude pracovať s časom. Potrebujem len dosiahnuť to, čo som dosiahol a k tomu do potrebujem v Delphi zadať do SQL príkazu, len netuším, v akom univerzálnom foráte sa zadáva dátum a čas. Viem, že národné zvyklosti tu neplatia (desatinné číslo musí byť s bodkou, inak ho TQuery nezožerie.

To teda znamená, že by som pracoval s vlastnosťou Date a Time? No nevadí, aj takto to stačí.

Datum a čas se do podmínek v SQL zadává dost blbě. Nejlépe je to přes parametr, to si veškeré převody udělá Delphi samo a správně. Například Chceš udělat něco takového:

select * from Tab1 where KdyToBylo > nějaké-datum-a-čas

Zadáš do Query1 takovouto kostru:

select * from Tab1 where KdyToBylo > :Kdy

Před otevřením Query1 nastavíš paremetr:

Query1.ParamByName ('Kdy').AsDateTime := Delfácký-datum-a-čas-z-proměnné-typu-TDateTime;
Query1.Prepare; Query1.Open;

//Edit: Podobným způsobem jdou udělat i reálná čísla a nemusíš se starat o desetinnou tečku/čárku.

Zpět do poradny Odpovědět na původní otázku Nahoru