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)?
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):
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
TForm.DateTimePickerChange - nastaviť na všetky 4 túto metódu
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.
Já ten původní dotaz asi blbě pochopil .
Funkce Frac () pochopitelně v Delphi existuje. Nešlo by zde raději použít funkce EncodeDate, EncodeTime, DecodeDate, DecodeTime, EncodeDateTime, DecodeDateTime, které datum a čas poskládají nebo rozeberou?
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:
Zadáš do Query1 takovouto kostru:
Před otevřením Query1 nastavíš paremetr:
//Edit: Podobným způsobem jdou udělat i reálná čísla a nemusíš se starat o desetinnou tečku/čárku.
Super, ďakujem. Dúfam, že to funguje aj na update a insert into. Ale myslím, že áno, vyzerá to univerzálne.