Toon posts:

[Delphi] 2 vraagjes over datum's

Pagina: 1
Acties:
  • 128 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een bepaalde datum die ik omzet in een bepaalde vorm met de functie FormatDateTime. De datum wordt dan wo 08-07-2002. Vervolgens bewaar ik hem in een ListView.

Maar nu moet ik de datum weer hebben en probeer ik met de functie StrtoDate een datum te krijgen. Maar dit wil niet lukken. Dit komt natuurlijk doordat er wo voor staat. Is er wel een manier om dit op te lossen (of is de enige mogelijkheid eerst de string aanpassen ==> zoeken naar 1e spatie en dan het linker gedeelte er af hakken?)


Mijn 2e vraag gaat over de DateTimePicker. Is het mogelijk om niks te tonen in de edit box (dus geen tijd en geen datum)?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 07 augustus 2002 @ 11:47:
Ik heb een bepaalde datum die ik omzet in een bepaalde vorm met de functie FormatDateTime. De datum wordt dan wo 08-07-2002. Vervolgens bewaar ik hem in een ListView.

Maar nu moet ik de datum weer hebben en probeer ik met de functie StrtoDate een datum te krijgen. Maar dit wil niet lukken. Dit komt natuurlijk doordat er wo voor staat. Is er wel een manier om dit op te lossen (of is de enige mogelijkheid eerst de string aanpassen ==> zoeken naar 1e spatie en dan het linker gedeelte er af hakken?)
Een TListView heeft een property 'Data'. Die property kan je gebruiken om allerhande extra info in te bewaren. Als je die property dus nog nergens voor gebruikt hebt, kan je daar de datum in een TDateTime formaat nog eens in bewaren, en dan gebruik je die datum.
Mijn 2e vraag gaat over de DateTimePicker. Is het mogelijk om niks te tonen in de edit box (dus geen tijd en geen datum)?
Ik geloof het niet. Een TDateTimePicker heeft wel een property ShowCheckbox. Misschien dat je daar iets mee kunt doen...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Een TListView heeft een property 'Data'.
Dat niet alleen, een TListView heeft per subitem een property Object.

ListView.Items[i].Objects[j]. Dan kan je zelfs per subitem een 4byte ding kwijt, desnoods een heel object.

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik dacht zelf gewoon aan een functie die het om kan zetten, maar extra info opslaan is natuurlijk ook een optie (alleen wat overbodige bytes, maar dat maakt tegenwoordig niet zo veel uit)

Nu wil ik dus een normale datum opslaan in de objects property:

code:
1
        Line.SubItems.Objects[0] := TObject(FieldByName('STARTDATUM').AsDateTime);


Maar dit is niet toegestaan. Ik krijg een invalid typecast?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
Probeer dan zelf eens wat dingen uit.... Waarom krijg je een invalid typecast? Waar krijg je die invalid type-cast precies, debug eens....
GoT is geen voorkauw-service hoor. Probeer zelf eens het probleem op te lossen...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06 16:43

Varienaja

Wie dit leest is gek.

Misschien is een TDateTime wel een Float. Waarin het integer-deel gebruikt wordt voor het aantal dagen sinds 1-1-1900 (dacht ik), en het floating-point-deel voor de tijd.

Sla dan eens alleen het integer-deel op (want dat is 32 bits).

Siditamentis astuentis pactum.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
whoami schreef op 07 augustus 2002 @ 12:43:
Probeer dan zelf eens wat dingen uit....
Ja denk je dat ik zonder iets geprobeerd te hebben het hier gelijk ga posten :?
Waarom krijg je een invalid typecast?
De datum die ik opvraag uit de database mag ik niet omzetten naar een TObject

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 23:20

Reptile209

- gers -

Misschien ook stom, maar als je dat TObject() eens weg laat, cast 'ie hem dan zelf niet al goed?

edit:

Of probeer .AsVariant of .AsObject (bestaat dat? :?) in plaats van .AsString.

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Nu online
TDateTime is een double, dus een float.
Most VCL objects represent date and time values using the TDateTime type. The integral part of a TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of a TDateTime value is fraction of a 24 hour day that has elapsed.
Je kunt natuurlijk ook een wrapper-class maken die de datum bevat, en deze dan in de Objects property gaan bewaren.
Ja denk je dat ik zonder iets geprobeerd te hebben het hier gelijk ga posten :?
't Zou toch kunnen.... Er zijn veel mensen hier die zo denken (daarmee zeg ik niet dat jij ook zo bent).
Als je wilt vermijden dat ik zo denk, dan is het het beste om in uw post ook op te noemen wat je zelf al geprobeerd hebt.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De oplossing:

ik heb een classe gemaakt waarin ik de 2 datums bewaar. De pointer naar de instantie bewaar ik in de Data property van de ListView.Items[..].

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  TDatums = class
  public
    BeginDatum: TDate;
    EindDatum: TDate;
  end;

  Datum := TDatums.Create;
  ListView.Items[0].Data := Datum;

  Datum.BeginDatum := FieldByName('STARTDATUM').AsDateTime;
  Datum.EindDatum := FieldByName('EINDDATUM').AsDateTime;


en het weer opvragen:

  dtp_StartDatum.Date := TDatums(Item.Data).BeginDatum;
  dtp_EindDatum.Date := TDatums(Item.Data).EindDatum;


en het vrijgeven van het object:

  if ListViewArtikelenReclame.Items.Count > 0 then
    for i := 1 to ListViewArtikelenReclame.Items.Count do
      TDatums(ListViewArtikelenReclame.Items[i - 1].Data).Free;

Acties:
  • 0 Henk 'm!

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

De ListView heeft een Event OnDeletion, het is netter daar je Object vrij te geven. :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Inderdaad, bedankt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is toch mogelijk om in een DateTimePicker niks weer te geven (en nog simpel ook eigenlijk).

Je moet dan de Format property op ' ' zetten (dus 1 of meerdere spaties) en in de OnChange event zetten:

code:
1
2
3
4
5
6
7
  with dtp_StartDatum do
  begin
    if (Trunc(Date) > 0) or Focused then
      Format := 'dddd dd-MM-yyyy'
    else
      Format := ' ';
  end;


Het enige "nadeel" is dat je niet handmatig een datum in kan toetsen. Dat kan pas nadat je een datum geselecteerd hebt.
Pagina: 1