[Delphi] function Now: TDateTime dla wieczego kalendarza

0

prosze o sprawdzenie owego programu...w linii prawie na samym koncu;
DecodeDateTime(data, rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda);

wyskakuje mi blad;/...i jest to funkcja dzikei ktorej przy stracie programu ma widniec aktualna data

z gory thx

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, Buttons;

type
  TForm1 = class(TForm)
    edRok: TSpinEdit;
    edMiesiac: TSpinEdit;
    edDzien: TSpinEdit;
    lbRok: TLabel;
    lbMiesiac: TLabel;
    lbDzien: TLabel;
    lbDT: TLabel;
    btnZamknij: TBitBtn;
    procedure edRokChange(Sender: TObject);
    procedure edDzienChange(Sender: TObject);
    procedure DecodeDate(Date: TDateTime);
    function DT(Dzien, Miesiac: Byte; Rok: Integer): Byte;
    function GetDzienText(Dt: Byte): String;
    function Now: TDateTime;



  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.edRokChange(Sender: TObject);
begin
 case edMiesiac.Value of
  1,3,5,7,8,10,12: edDzien.MaxValue:=31;
  4,6,9,11: edDzien.MaxValue:=30;
 else
  if edRok.Value mod 4=0 then edDzien.MaxValue:=29
  else edDzien.MaxValue:=28;
 end;{case}
 if edDzien.Value>edDzien.MaxValue then
  edDzien.Value:=edDzien.MaxValue;
  edDzienChange(Sender);
end;

procedure TForm1.edDzienChange(Sender: TObject);
begin
 lbDt.Caption:='Dzień tygodnia: '+GetDzienText(DT(eddzien.value, edmiesiac.value, edrok.value));
end;


procedure TForm1.DecodeDate(Date: TDateTime);
var
 Now, Rok, Miesiac, Dzien: Word;
begin
DecodeDate(Now);
DecodeDate(Rok);
DecodeDate(Miesiac);
DecodeDate(Dzien);
edRok.Value:=Rok;
edMiesiac.Value:=Miesiac;
edDzien.Value:=Dzien;
end;



function TForm1.DT(Dzien, Miesiac: Byte; Rok: Integer): Byte;
var m,r,w: Byte; {deklaracja zmiennych}
begin
 if Miesiac>2 then m:=miesiac-2
 else
  begin
   m:=miesiac+10;
   rok:=rok-1;
  end;
  r:=rok mod 100;
  w:=rok div 100;
 Result:=((13*m-1) div 5+dzien+r div 4+w div 4+r+5*w) mod 7;
end;

function TForm1.GetDzienText(Dt: Byte): String;
const Dni: array[0..6] of String=
      ('Niedziela','Poniedziałek','Wtorek','Środa',
       'Czwartek','Piątek','Sobota');
begin
 Result:=Dni[dt];
end;

function TForm1.Now: TDateTime;
var
  dzien, miesiac, rok: Word;
  godzina, minuta, sekunda, milisekunda: Word;
  data: TDateTime;

begin
  data := Now;
  DecodeDateTime(data, rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda);
  MessageBox(0,PAnsiChar(Format('Data: %d/%d/%d %d:%d:%d:%d',[rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda])), 'Data', MB_ICONINFORMATION);
end;

end.
0

Stack overflow??

0

i tam tez nie ma odp;/

0

Zmień nazwę funkcji **Now **na jakąś inną, bo tak to wykonujesz ją w nieskończoność

0

A kiedy wykona się "procedure DecodeDate(Date: TDateTime);" ?
Odpowiedź: Nigdy, więc usuń ją z kodu.

0

poprawilem to na taki zapis ale mam blad znow w tym samym miejscu;/ : DecodeDate(Rok, Miesiac, Dzien);

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, Buttons;

type
  TForm1 = class(TForm)
    edRok: TSpinEdit;
    edMiesiac: TSpinEdit;
    edDzien: TSpinEdit;
    lbRok: TLabel;
    lbMiesiac: TLabel;
    lbDzien: TLabel;
    lbDT: TLabel;
    btnZamknij: TBitBtn;
    procedure edRokChange(Sender: TObject);
    procedure edDzienChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    function DT(Dzien, Miesiac: Byte; Rok: Integer): Byte;
    function GetDzienText(Dt: Byte): String;
    function Creat: TDatetime;



  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.edRokChange(Sender: TObject);
begin
case edMiesiac.Value of
1,3,5,7,8,10,12: edDzien.MaxValue:=31;
4,6,9,11: edDzien.MaxValue:=30;
else
if edRok.Value mod 4=0 then edDzien.MaxValue:=29
else edDzien.MaxValue:=28;
end;{case}
if edDzien.MaxValue>edDzien.MaxValue then
edDzien.MaxValue:=edDzien.MaxValue;
edDzienChange(Sender);
end;

procedure TForm1.edDzienChange(Sender: TObject);
begin
lbDt.Caption:='Dzień tygodnia:'+GetDzientext(DT(edDzien.Value,edMiesiac.Value,edRok.Value));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
rok, miesiac, dzien: Word;
begin
DecodeDate(Now, Rok, Miesiac, Dzien);
edRok.Value:=Rok;
edMiesiac.Value:=Miesiac;
edDzien.Value:=Dzien;
end;

Function Tform1.DT(Dzien,Miesiac:byte;Rok:integer): Byte;
var m,r,w:byte;{deklaracja zmiennych}
begin
if miesiac>2 then m:=miesiac-2
else
begin
m:=miesiac+10;
rok:=rok-1;
end;
r:=rok mod 100;
w:=rok div 100;
Result:=((13*m-1) div 5+dzien+r div 4+w div 4+r+5*w) mod 7;
end;

Function TForm1.GetDzientext(DT:Byte):string;
const dni:array[0..6] of string=
('Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota');
begin
Result:=dni[DT];
end;


function TForm1.Creat: TDatetime;
var
   dzien, miesiac, rok: Word;
  data: TDateTime;


begin
 data := SysUtils.Now;
  DecodeDate(Rok, Miesiac, Dzien);
  MessageBox(0,PAnsiChar(Format('Data: %d/%d/%d %d:%d:%d:%d',[rok, miesiac, dzien])), 'Data', MB_ICONINFORMATION);
end;


end.
0

a nie tak?

DecodeDate(now, Rok, Miesiac, Dzien);

najpierw musisz podać do funkcji żródło daty, potem sobie rozdzielaj, przeczytaj definicje funkcji DECODEDATE

0

thx..nie zauwazylem..

ale nadal nie wyswietla mi sie aktualna data;/

0

czy taki zapis jest odpowiedni?? czy zamiast now w function wpisac inne wyrazenie?? ale tak czy siak nie ma bledu..ale nadal nie wiem jak teraz wykorzystac ta funkcje zeby wyswietlala mi sie aktualna data

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, Buttons;

type
  TForm1 = class(TForm)
    edRok: TSpinEdit;
    edMiesiac: TSpinEdit;
    edDzien: TSpinEdit;
    lbRok: TLabel;
    lbMiesiac: TLabel;
    lbDzien: TLabel;
    lbDT: TLabel;
    btnZamknij: TBitBtn;
    procedure edRokChange(Sender: TObject);
    procedure edDzienChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    function DT(Dzien, Miesiac: Byte; Rok: Integer): Byte;
    function GetDzienText(Dt: Byte): String;
    function Now: TDatetime;



  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.edRokChange(Sender: TObject);
begin
case edMiesiac.Value of
1,3,5,7,8,10,12: edDzien.MaxValue:=31;
4,6,9,11: edDzien.MaxValue:=30;
else
if edRok.Value mod 4=0 then edDzien.MaxValue:=29
else edDzien.MaxValue:=28;
end;{case}
if edDzien.MaxValue>edDzien.MaxValue then
edDzien.MaxValue:=edDzien.MaxValue;
edDzienChange(Sender);
end;

procedure TForm1.edDzienChange(Sender: TObject);
begin
lbDt.Caption:='Dzień tygodnia:'+GetDzientext(DT(edDzien.Value,edMiesiac.Value,edRok.Value));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
rok, miesiac, dzien: Word;
begin
DecodeDate(Now, Rok, Miesiac, Dzien);
edRok.Value:=Rok;
edMiesiac.Value:=Miesiac;
edDzien.Value:=Dzien;
end;

Function Tform1.DT(Dzien,Miesiac:byte;Rok:integer): Byte;
var m,r,w:byte;{deklaracja zmiennych}
begin
if miesiac>2 then m:=miesiac-2
else
begin
m:=miesiac+10;
rok:=rok-1;
end;
r:=rok mod 100;
w:=rok div 100;
Result:=((13*m-1) div 5+dzien+r div 4+w div 4+r+5*w) mod 7;
end;

Function TForm1.GetDzientext(DT:Byte):string;
const dni:array[0..6] of string=
('Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota');
begin
Result:=dni[DT];
end;


function TForm1.Now: TDatetime;
var
   dzien, miesiac, rok: Word;
  data: TDateTime;


begin
 data := Now;

  DecodeDate(Now, Rok, Miesiac, Dzien);
  MessageBox(0,PAnsiChar(Format('Data: %d/%d/%d %d:%d:%d:%d',[rok, miesiac, dzien])), 'Data', MB_ICONINFORMATION);
end;


end.
0

moze zamiast
data := Now;

wpisac

data := SysUtils.Now;

ale wtedy nie wiem czy funckja sienie zmienie w zapisie

0

po pierwsze kompilator mowi co jest nie tak, a nie stęka. na dole okna zkodem masz wypisane bledy, skopiuj ten błąd tutaj a nie ze musimy się domyślać w kalambury

0

prosze;p

function TForm1.Now: TDatetime;
var
   dzien, miesiac, rok: Word;
  data: TDateTime;
 
 
begin
 data := Now;
 
  DecodeDate(Now, Rok, Miesiac, Dzien);
  MessageBox(0,PAnsiChar(Format('Data: %d/%d/%d %d:%d:%d:%d',[rok, miesiac, dzien])), 'Data', MB_ICONINFORMATION);
end;
 
 

end.

0

please delete...

0
 data := Now;

  DecodeDate(Now, Rok, Miesiac, Dzien);
  MessageBox(handle,pchar(inttostr(rok) + ' - ' + pchar(inttostr(miesiac) + ' - ' + pchar(inttostr(dzien) +), 'Data', MB_ICONINFORMATION);

to dziala sprawdzalem. możesz też całość zapisac do stringa i potem wyświetlić w pchar. Tej funkcji format nigdy nie lubiłem i pewnie nie polubię...

0

wysietla ci sie aktualna data?? ...czy tzreba jescze gdzies to wpsiac w programie?...bo mi wysietla sie tylko to co wpisalem w object..

0

mam jescze taki kod..tez nie ma bledu...ale takze nie wyseietla mi sie aktualna data;/

function TForm1.Now: TDateTime;
var
  dzien, miesiac, rok: Word;
  godzina, minuta, sekunda, milisekunda: Word;
begin
  Result := SysUtils.Now;
  SysUtils.DecodeDate(Result, rok, miesiac, dzien);
  DecodeTime(Result, godzina, minuta, sekunda, milisekunda);
  MessageBox(0,PChar(Format('Data: %d/%d/%d %d:%d:%d:%d',[rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda])), 'Data', MB_ICONINFORMATION);
end;
0

Po pierwsze przenieś te deklaracje

  procedure DecodeDate(Date: TDateTime);
  function DT(Dzien, Miesiac: Byte; Rok: Integer): Byte;
  function GetDzienText(Dt: Byte): String;
  function Now: TDateTime;

do sekcji private

Po drugie nazwij jakoś inaczej swoją procedurę DecodeDate, bo taka już istnieje w module SysUtils.
Właściwie to nie wiadomo po co tworzysz taką procedurę a nie korzystasz z gotowej. Proponuję DecodeDate + F1 albo poszukać na forum.

Po trzecie takie same uwagi mam do twojej funkcji Now.

0

pelsta thx za to pierwsze;p...a ta procedura decode zostala usunieta kilka h temu;p...teraz jedyne co mi potzrebne to to zeby w programie ktory napisalem wyswietlala sie aktualna data w 3 okienkach(rok, miesiac, dzien)

0

tak wyglada caly zapis

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin, Buttons, DateUtils;

type
  TForm1 = class(TForm)
    edRok: TSpinEdit;
    edMiesiac: TSpinEdit;
    edDzien: TSpinEdit;
    lbRok: TLabel;
    lbMiesiac: TLabel;
    lbDzien: TLabel;
    lbDT: TLabel;
    btnZamknij: TBitBtn;
    procedure edRokChange(Sender: TObject);
    procedure edDzienChange(Sender: TObject);
    procedure FormCreate(Sender: TObject);




  private

  function DT(Dzien, Miesiac: Byte; Rok: Integer): Byte;
  function GetDzienText(Dt: Byte): String;
  function Now: TDateTime;

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.edRokChange(Sender: TObject);
begin
case edMiesiac.Value of
1,3,5,7,8,10,12: edDzien.MaxValue:=31;
4,6,9,11: edDzien.MaxValue:=30;
else
if edRok.Value mod 4=0 then edDzien.MaxValue:=29
else edDzien.MaxValue:=28;
end;{case}
if edDzien.MaxValue>edDzien.MaxValue then
edDzien.MaxValue:=edDzien.MaxValue;
edDzienChange(Sender);
end;

procedure TForm1.edDzienChange(Sender: TObject);
begin
lbDt.Caption:='Dzień tygodnia:'+GetDzientext(DT(edDzien.Value,edMiesiac.Value,edRok.Value));
end;

procedure TForm1.FormCreate(Sender: TObject);
var
rok, miesiac, dzien: Word;
begin
DecodeDate(Now, Rok, Miesiac, Dzien);
edRok.Value:=Rok;
edMiesiac.Value:=Miesiac;
edDzien.Value:=Dzien;
end;

Function Tform1.DT(Dzien,Miesiac:byte;Rok:integer): Byte;
var m,r,w:byte;{deklaracja zmiennych}
begin
if miesiac>2 then m:=miesiac-2
else
begin
m:=miesiac+10;
rok:=rok-1;
end;
r:=rok mod 100;
w:=rok div 100;
Result:=((13*m-1) div 5+dzien+r div 4+w div 4+r+5*w) mod 7;
end;

Function TForm1.GetDzientext(DT:Byte):string;
const dni:array[0..6] of string=
('Niedziela', 'Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota');
begin
Result:=dni[DT];
end;


function TForm1.Now: TDateTime;
var
  dzien, miesiac, rok: Word;
  godzina, minuta, sekunda, milisekunda: Word;
begin
  Result := SysUtils.Now;
  SysUtils.DecodeDate(Result, rok, miesiac, dzien);
  DecodeTime(Result, godzina, minuta, sekunda, milisekunda);
  MessageBox(0,PChar(Format('Data: %d/%d/%d %d:%d:%d:%d',[rok, miesiac, dzien, godzina, minuta, sekunda, milisekunda])), 'Data', MB_ICONINFORMATION);
end;




end.

0

Tak jak pisałem. Wywal swoją funkcję Now

0

szczerze mowiac nie chce mi sie tak dokladnie wpatrywac w Twoj kod ale na pierwszy rzut oka widze ze robisz cos od d*py strony chyba...
np to:

case edMiesiac.Value of
1,3,5,7,8,10,12: edDzien.MaxValue:=31;
4,6,9,11: edDzien.MaxValue:=30;
else
if edRok.Value mod 4=0 then edDzien.MaxValue:=29
else edDzien.MaxValue:=28;

czyli rozumiem ze chcesz wiedziec ile dni ma dany miesiac w danym roku... a przeciez jest taka funkcja jak DaysInMonth()...
takich gotowych funkcji masz duzo wiecej w delphi.

0

climak- wazne ze jest tam dobrze;p

jedyne czego chce to funkcje ktora bedzie mi wyswietlala aktualna date w http://pewi.wrzuta.pl/sr/f/0DLo7TKaykY/data

a jak usune funkcje to nic mi sie nie zmienia

0

napisałem Ci jak masz to zrobić i to działa dobrze testowane itp.

w DecodeDate przypisujesz do poszczególnych zmiennych dzien miesiąc i rok, a następnie wyśiwetlasz je za pomocą IntToStr, żaden problem.

0

pchar(inttostr(dzien) +),

), ---tu mi wyskakuje errors;/

0

jest moze jaka inna opcja z zapisem tego kodu?? bez uzycia MessageBox

prosze o odp;/

0

Co tam robi ten sam plus na końcu? Powinno być tak...

  MessageBox(Application.Handle, PChar(IntToStr(Dzien)), 'Podstawy się kłaniają!', MB_OK);

A poza tym do śledzenia kodu i sprawdzania wartości zmiennych - to powinno używać się Debuggera.
Lepiej poczytaj http://4programmers.net/Delphi/Artykuły/Debugowanie i w ogóle też jakieś podstawy.

0

Nie upieraj się tylko wywal swoją funkcję Now z kodu.
Deklarację i treść funkcji.
Wtedy w OnCreate formy wpiszą się prawidłowe wartości do SpinEditów.

0

tak wyglada program vizualnie http://pewi.wrzuta.pl/sr/f/0DLo7TKaykY/data

i ja musze zrobic tak ze w tych okienkach ma byc pokazana aktualna data(rok, miesiac, i dzien) i musze to zapisac za pomoca funkcji

0

Mam deja vu ;/ Identyczny screenshot widziałem w temacie na forum unit1, gdzie odpowiedziałem - link:
http://forum.unit1.pl/index.php?showtopic=3877 - tylko, że tam pytający usunął treść zadania i screen,
niedłiugo po mojej odpowiedzi. Ale przecież DecodeDate to procedura nie może być? Jak nie to zrob jaka
tam funkcje chcesz. Banalny program z tego co widzę ma być, zaś Ty się niepotrzebnie z tym męczysz ;/

0

procedure TForm1.FormCreate(Sender: TObject);
var
Rok, Miesiac, Dzien : Word;
begin
DecodeDate(Date, Rok, Miesiac, Dzien);
RokEdit.Text := IntToStr(Rok);
MiesiacEdit.Text := IntToStr(Miesiac);
DzienEdit.Text := IntToStr(Dzien);

tyle ze ten zapis to procedura ktora nie pokazuje mi aktualnej daty

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