![]() |
Quelltext einkürzen
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:
(der Unterschied besteht in der letzten Zahl, hier die 2, in meinem Quelltext die 1, die dazuaddiert wird)
Moz_a := Woz_a - Zeitgleichung + ((15 - (Laenge * k0)) * 4 / 60) + 2;
Moz_u := Woz_u - Zeitgleichung + ((15 - (Laenge * k0)) * 4 / 60) + 2; 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!!!! |
AW: Quelltext einkürzen
Ich kann den Quelltext zwar nicht kürzen, aber das hier ist mir sofort aufgefallen:
Delphi-Quellcode:
niemals auf true oder false prüfen. In diesem Fall musst du auf
if Sprache = false then
Delphi-Quellcode:
prüfen.
if not Sprache then
|
AW: Quelltext einkürzen
Bei false ist das nicht weiter schlimm, sieht aber nicht "schön" aus, von daher ist der Einwand gerechtfertigt. Man kann den Code auch nicht wirklich "kürzen", mit ein paar Hilfsfunktionen/-methoden könnte man ihn aber zumindest etwas übersichtlicher gestalten und Logik und Darstellung trennen.
|
AW: Quelltext einkürzen
Schön wäre halt auch eine Vorabinfo, worum es überhaupt geht.
Generell: Um das auf mehrere Prozeduren/Funktionen aufteilen zu können, könnte man als ersten Schritt manche der Variablen in ButtonStartClick nicht lokal deklarieren, sondern als variablen/Felder der Form. Dadurch kann man dann von verschiedenen Prozeduren aus darauf zugreifen und ButtonStartClick könnte dann so aussehen:
Delphi-Quellcode:
Anstatt eine Boolche Variable für die Sprache zu nehmen, wäre eine Aufzählung/Enumeration schöner und lesbarer, zudem könnten so leichter neue Sprachen hinzukommen.
procedure ButtonStartClick(Sender: TObject);
begin BerechneZeiten; //Oder was auch immer du da machst GebeZeitenAus; end;
Delphi-Quellcode:
type TSprache = (Deutsch, Englisch, Spanisch, Dänisch);
//in der Klasse: ... private Sprache:TSprache procedure GebeZeitenAus; begin Case Sprache of Englisch: GebeZeitenAusInEnglisch; Spanisch: GebeZeitenAusInSpanisch; //usw. end; end; |
AW: Quelltext einkürzen
Und bezüglich Sommer-/Winterzeit schau doch mal beispielsweise hier:
![]() |
AW: Quelltext einkürzen
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.
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; |
AW: Quelltext einkürzen
Ok! also auf jeden Fall vielen Dank!!!! An welcher Stelle wird denn [sprache] deklariert?
|
AW: Quelltext einkürzen
Sprache ist ja Deine Boolean-Variable. Diese wird genutzt, um die entsprechenden Werte aus den konstanten Boolean-Arrays (ganz am Anfang) zu ermitteln.
|
AW: Quelltext einkürzen
Ok, das war zugegebenermaßen eine Frage die ich mir bei genauerem Hinsehen hätte selbstbeantworten können. DAAAAANKEEE!
und jetzt kommt noch so eine: diese 'cFmtTime' und 'cMsgSelectTimeZone' - an welches wort /welche wörter ist das angelehnt? Liebe Grüße und wirklich viiiieeelen Dank!!! |
AW: Quelltext einkürzen
Ich kenne Uwes Nomenklatur nicht, aber vermutlich steht c für Konstante, FmtTime steht für Zeitformat, und MsgSelectTimeZone bedeutet einfach nur, dass es sich um Meldungen zur Auswahl der Zeitzone handelt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz