Hallo! ich habe folgenden Quelltext geschrieben, allerdings habe ich das Gefühl, dass er ziemlich unübersichtlich wird und deshalb wäre es voll nett, wenn mir jemand helfen könnte, wie und ob man das einkürzen kann. Vielleicht mit functions oder proceduren oder so? Achso und wenn schon jemand so lieb und nett und toll ist mir dabei zu helfen, habt ihr vielleicht auch eine Idee, wie ich Sommerzeit und Winterzeit automatisch, wenn man den RadioButtonMEZ ausgewählt hat, anpasse? man müsste ja dann irgendwie den date time picker fragen, ob der letzte sonntag im märz schon rum ist und es noch vor dem letzten sonntag im oktober ist. Dann wäre ja Sommerzeit und der Ausschnitt dazu wäre der hier (mein Quelltext im Moment ist auf Winterzeit eingestellt):
Delphi-Quellcode:
Moz_a := Woz_a - Zeitgleichung + ((15 - (Laenge * k0)) * 4 / 60) + 2;
Moz_u := Woz_u - Zeitgleichung + ((15 - (Laenge * k0)) * 4 / 60) + 2;
(der Unterschied besteht in der letzten Zahl, hier die 2, in meinem Quelltext die 1, die dazuaddiert wird)
und mein Quelltext:
Delphi-Quellcode:
type
TForm1 = class(TForm)
LabelDatum: TLabel;
LabelKoordinaten: TLabel;
LabelLaenge: TLabel;
LabelBreite: TLabel;
LabelAufgang: TLabel;
LabelUntergang: TLabel;
DateTimePicker: TDateTimePicker;
EdLaenge: TEdit;
EdBreite: TEdit;
ButtonStart: TButton;
MainMenu: TMainMenu;
Menue: TMenuItem;
Infos: TMenuItem;
Hilfe: TMenuItem;
Sprachcheck: TMenuItem;
LabelAuf: TLabel;
LabelUnter: TLabel;
LabelUTC: TLabel;
LabelUTCAbweichung: TLabel;
EdUTC: TEdit;
LabelUTCh: TLabel;
LabelGrad1: TLabel;
LabelGrad2: TLabel;
ImageHintergrund: TImage;
LabelTitel: TLabel;
LabelMEZ: TLabel;
RadioButtonMEZ: TRadioButton;
RadioButtonUTC: TRadioButton;
Label1: TLabel;
Bedienung: TMenuItem;
Abkuerzungen: TMenuItem;
Beenden: TMenuItem;
procedure ButtonStartClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure SprachcheckClick(Sender: TObject);
procedure BeendenClick(Sender: TObject);
private
function Tagnummer: Integer;
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ Berechnungsdaten nach Arnold Barmettler, http://lexikon.astronomie.info/zeitgleichung/, 11.1.2017 modifiziert }
var
Sprache: Boolean;
procedure TForm1.FormCreate(Sender: TObject);
begin
DateTimePicker.DateTime := Now; // aktuelles Datum bei Programmstart
end;
function TForm1.Tagnummer: Integer; // Tageszahl, 1.Jan=1, 31.Dez=365 bzw. 366
var
DatumStart, DatumEingabe: TDate;
begin
DatumStart := StrToDate('01.01');
DatumEingabe := DateTimePicker.Date;
Result := DaysBetween(DatumStart, DatumEingabe) + 1;
end;
procedure TForm1.ButtonStartClick(Sender: TObject);
const
k0 = 180 / pi; // Umwandlung Bogenmaß in Grad
h = -0.0145; // Korrekturfaktor für Lichtbeugung in Horzontnähe, entspricht -50 Bogenminuten
var
Laenge: Real; // Längengrad des Standorts, Bogenmaß
Breite: Real; // Breitengrad des Standorts, Bogenmaß
Deklination, Zeitdifferenz, Zeitgleichung: Real;
Woz_a: Real; // wahre Ortszeit Sonnenaufgang
Woz_u: Real; // wahre Ortszeit Sonnenuntergang
Moz_a: Real; // mittlere Ortszeit Sonnenaufgang
Moz_u: Real; // mittlere Ortszeit Sonnenuntergang
Aufgang_Std, Aufgang_Min, Untergang_Std, Untergang_Min: Real;
begin
Laenge := pi * StrToFloat(EdLaenge.Text) / 180; // Umrechnung Längengrad in Bogenmaß
Breite := pi * StrToFloat(EdBreite.Text) / 180; // Umrechnung Breitengrad in Bogenmaß
Deklination := 0.4095 * sin(0.016906 * (Tagnummer - 80.086));
Zeitdifferenz := 12 * arccos((sin(h) - sin(Breite) * sin(Deklination)) /
(cos(Breite) * cos(Deklination))) / pi;
Zeitgleichung := -0.171 * sin(0.0337 * Tagnummer + 0.465) - 0.1299 *
sin(0.01787 * Tagnummer - 0.168);
Woz_a := 12 - Zeitdifferenz;
Woz_u := 12 + Zeitdifferenz;
if (RadioButtonMEZ.Checked) then // wenn MEZ ausgewählt ist
begin
Moz_a := Woz_a - Zeitgleichung + ((15 - (Laenge * k0)) * 4 / 60) + 1;
Moz_u := Woz_u - Zeitgleichung + ((15 - (Laenge * k0)) * 4 / 60) + 1;
end
else
begin
if (RadioButtonUTC.Checked) then // wenn UTC ausgewählt ist
begin
Moz_a := Woz_a - Zeitgleichung + ((15 - (Laenge * k0)) * 4 / 60) +
(StrToFloat(EdUTC.Text) - 1);
Moz_u := Woz_u - Zeitgleichung + ((15 - (Laenge * k0)) * 4 / 60) +
(StrToFloat(EdUTC.Text) - 1);
end
else // Fehlermeldung
begin
if Sprache = false then // wenn Sprache auf Deutsch
begin
showmessage
('Bitte wählen Sie die Zeitzone für die Ausgabe der Sonnenzeiten aus.')
end
else // Wenn Sprache auf Englisch
showmessage(' Please, select the time zone for the suntimes.')
end;
end;
Aufgang_Std := Abs(Int(Moz_a));
Aufgang_Min := Abs(Round(60 * (Moz_a - Aufgang_Std)));
Untergang_Std := Abs(Int(Moz_u));
Untergang_Min := Abs(Round(60 * (Moz_u - Untergang_Std)));
if Sprache = false then // wenn Sprache auf Deutsch
begin
LabelAuf.Caption := FloatToStr(Aufgang_Std) + ' : ' +
FloatToStr(Aufgang_Min) + ' Uhr'; // Ausgabe Aufgang
LabelUnter.Caption := FloatToStr(Untergang_Std) + ' : ' +
FloatToStr(Untergang_Min) + ' Uhr'; // Ausgabe Untergang
end
else // Wenn Sprache auf Englisch
begin
if Aufgang_Std > 12 then
begin
LabelAuf.Caption := FloatToStr(Aufgang_Std - 12) + ' : ' +
FloatToStr(Aufgang_Min) + ' pm'; // Ausgabe Aufgang
end
else
begin
LabelAuf.Caption := FloatToStr(Aufgang_Std) + ' : ' +
FloatToStr(Aufgang_Min) + ' am'; // Ausgabe Aufgang;
end;
if Untergang_Std > 12 then
begin
LabelUnter.Caption := FloatToStr(Untergang_Std - 12) + ' : ' +
FloatToStr(Untergang_Min) + ' pm'; // Ausgabe Untergang
end
else
begin
LabelAuf.Caption := FloatToStr(Untergang_Std) + ' : ' +
FloatToStr(Untergang_Min) + ' am'; // Ausgabe Aufgang;
end;
end;
end;
end.
DAAAAANKE!!!!