Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.021 Beiträge
 
Delphi 12 Athens
 
#6

AW: Quelltext einkürzen

  Alt 13. Apr 2017, 10:40
Also mann kann das schon etwas einkürzen ohne die grundlegende Struktur zu verändern, wobei das in Einzelfällen auch von der eingesetzten Delphi-Version abhängt.
  • Statt Real (deprecated) wird mit Double gearbeitet
  • Die Funktion Tagnummer habe ich durch eine lokale Variable ersetzt. Das erspart die mehrfachen Aufrufe. (DayOfTheYear liefert bereits das gewünschte Ergebnis)
  • Umrechnung Grad/Bogenmaß aus Unit System.Math
  • Die Textkonstanten werden über ein Array anhand der eingestellten Sprache ausgewählt
  • Zeiten werden über FormatDateTime formatiert

Delphi-Quellcode:
const
  cMsgSelectTimeZone: array[Boolean] of string
    = ('Bitte wählen Sie die Zeitzone für die Ausgabe der Sonnenzeiten aus.',
       ' Please, select the time zone for the suntimes.');
  cFmtTime: array[Boolean] of string
    = ('hh:nn "Uhr"', 'hh:nn am/pm');
const
  h = -0.0145; // Korrekturfaktor für Lichtbeugung in Horzontnähe, entspricht -50 Bogenminuten
var
  Laenge: Double; // Längengrad des Standorts, Bogenmaß
  Breite: Double; // Breitengrad des Standorts, Bogenmaß
  Deklination, Zeitdifferenz, Zeitgleichung: Double;
  Woz_a: TTime; // wahre Ortszeit Sonnenaufgang
  Woz_u: TTime; // wahre Ortszeit Sonnenuntergang
  Moz_a: TTime; // mittlere Ortszeit Sonnenaufgang
  Moz_u: TTime; // mittlere Ortszeit Sonnenuntergang
  diff: Double;
  tagNummer: Integer;
  timeZoneOffset: Double;
begin
  Laenge := DegToRad(StrToFloat(EdLaenge.Text)); // Umrechnung Längengrad in Bogenmaß
  Breite := DegToRad(StrToFloat(EdBreite.Text)); // Umrechnung Breitengrad in Bogenmaß
  tagNummer := DayOfTheYear(DateTimePicker.Date);
  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
    timeZoneOffset := 1; // Hier auf Sommerzeit prüfen
  end
  else if (RadioButtonUTC.Checked) then // wenn UTC ausgewählt ist
  begin
    timeZoneOffset := StrToFloat(EdUTC.Text) - 1;
  end
  else // Fehlermeldung
  begin
    showmessage(cMsgSelectTimeZone[Sprache]);
    Exit;
  end;

  diff := Zeitgleichung + ((15 - RadToDeg(Laenge)) * 4 / 60) + timeZoneOffset;
  Moz_a := Woz_a - diff;
  Moz_u := Woz_u - diff;

  LabelAuf.Caption := FormatDateTime(cFmtTime[Sprache], Moz_a); // Ausgabe Aufgang
  LabelUnter.Caption := FormatDateTime(cFmtTime[Sprache], Moz_u); // Ausgabe Untergang
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat