unit frameluna; {$mode ObjFPC}{$H+} interface uses Classes, SysUtils, Forms, Controls, ExtCtrls, StdCtrls, astronomy, DateUtils; function OttieniRisorsa(faseluna:double):string; function DateToLabel(Data:TDateTime):string; type { TLunaView } TLunaView = class(TFrame) GroupBox1: TGroupBox; Image1: TImage; SizeLuna: TLabel; PicFase1: TImage; PicFase2: TImage; PicFase3: TImage; PicFase4: TImage; Label1: TLabel; Fase1: TLabel; Fase2: TLabel; Fase3: TLabel; Fase4: TLabel; Panel1: TPanel; Panel2: TPanel; procedure ImpostaDataClick(Sender: TObject; Data:TDateTime; orariosimulazione:byte); type TFase= (lunanuova, primoquarto, lunapiena, ultimoquarto); TFaseLuna=record tempo:TDateTime; fase:byte; //0=luna nuova 1=primo quarto, 2=piena, 3=ultimo quarto. end; private public end; implementation {$R *.lfm} { TLunaView } var percriduzioneluna:double; //descrive quanto è più piccola la luna rispetto alla luna più vicina procedure TLunaView.ImpostaDataClick(Sender: TObject; Data:TDateTime; orariosimulazione:byte); var illuminazione1:byte; lunadati:TDatiLuna; astrotime:astro_time_t; tempoastrofase:astro_moon_quarter_t; i:byte=0; elementi: TFaseLuna; datefasi: array [0..3] of TFaseLuna; risorsa:string; //stringa della lazarus resource delle foto testolabel:string; //testo sotto le immagini faseluna:double; datadati:TDateTime; //questa è la data che si usa per le simulazioni differisce da Data per il valore di orariosimulazione begin astrotime:= astronomy.TDateTimeToAstroTime(Data); datadati:= DateUtils.IncHour(Data,orariosimulazione); //mostra l'illuminazione all'orario impostato nelle impostazioni faseluna:=FaseLunare(datadati); lunadati:=DistanzaLuna(datadati); illuminazione1:= round(IlluminazioneLuna(faseluna)); Label1.Caption:='Illuminazione '+inttostr(illuminazione1)+'%'+' Distanza '+inttostr(lunadati.distanzakm)+'Km'; SizeLuna.Caption:=SysUtils.FormatFloat('0.000',lunadati.diametrogradi)+'°'; percriduzioneluna:= lunadati.diametrogradi/0.568; risorsa:=OttieniRisorsa(faseluna); Image1.Picture.PNG.LoadFromResourceName(HInstance, risorsa); tempoastrofase:=astronomy.Astronomy_SearchMoonQuarter(astrotime); datefasi[0].tempo:=astronomy.AstroTimeToTDateTime(tempoastrofase.time); datefasi[0].fase:=tempoastrofase.quarter; repeat i:=1+i; tempoastrofase:=astronomy.Astronomy_NextMoonQuarter(tempoastrofase); datefasi[i].tempo:=astronomy.AstroTimeToTDateTime(tempoastrofase.time); datefasi[i].fase:=tempoastrofase.quarter; until i=3; i:=0; for elementi in datefasi do begin { case elementi.fase of 0: risorsa:='LUNANUOVA_SMALL'; 1: risorsa:='PRIMOQUARTO_SMALL'; 2: risorsa:='LUNAPIENA_SMALL'; 3: risorsa:='ULTIMOQUARTO_SMALL'; end; } case elementi.fase of 0: risorsa:='01'; 1: risorsa:='09'; 2: risorsa:='15'; 3: risorsa:='23'; end; // testolabel:= FormatDateTime('dd mmmm', elementi.tempo); testolabel:= DateToLabel(elementi.tempo); case i of 0: begin PicFase1.Picture.PNG.LoadFromResourceName(HInstance, risorsa); Fase1.Caption:=testolabel; end; 1: begin PicFase2.Picture.PNG.LoadFromResourceName(HInstance, risorsa); Fase2.Caption:=testolabel; end; 2: begin PicFase3.Picture.PNG.LoadFromResourceName(HInstance, risorsa); Fase3.Caption:=testolabel; end; 3: begin PicFase4.Picture.PNG.LoadFromResourceName(HInstance, risorsa); Fase4.Caption:=testolabel; end; end; i:=i+1; end; end; function OttieniRisorsa(faseluna:double):string; begin if faseluna<=180 then OttieniRisorsa:=Format('%.2d' ,[round(1+faseluna*0.0833333333)]); if faseluna>=180 then OttieniRisorsa:=Format( '%.2d', [round(16+(faseluna-180)*0.0833333333)]); end; function DateToLabel(Data:TDateTime):string; var mese:string; numero:string; begin numero:=SysUtils.FormatCurr('00', DayOf(Data)); case MonthOf(Data) of 1: mese:='Gennaio'; 2: mese:='Febbraio'; 3: mese:='Marzo'; 4: mese:='Aprile'; 5: mese:='Maggio'; 6: mese:='Giugno'; 7: mese:='Luglio'; 8: mese:='Agosto'; 9: mese:='Settembre'; 10: mese:='Ottobre'; 11: mese:='Novembre'; 12: mese:='Dicembre'; end; result:= numero+' '+mese; end; end.