AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

grüne Zeile

Ein Thema von juelin · begonnen am 8. Jan 2018 · letzter Beitrag vom 10. Jan 2018
Antwort Antwort
Seite 1 von 2  1 2      
juelin

Registriert seit: 9. Mai 2006
Ort: Mannheim
142 Beiträge
 
Delphi XE5 Professional
 
#1

grüne Zeile

  Alt 8. Jan 2018, 19:43
hi,
ich habe ein Problem und weiß nicht weiter.
Habe Windows 7 und Delphi XE5

Habe eine Code:
Delphi-Quellcode:
  Form1.SQLQuery1.SQL.Text:='SELECT * FROM einausmon ORDER BY Jahr, Monat, Ware ';
  Form1.SQLQuery1.Open;
  while not Form1.SQLQuery1.EOF do
  begin
    f1:=Form1.SQLQuery1.Fields[0].AsString;
    f2:=Form1.SQLQuery1.Fields[1].AsString;
    f3:=Form1.SQLQuery1.Fields[2].AsString;
    f4:=Form1.SQLQuery1.Fields[3].AsString;
    f5:=Form1.SQLQuery1.Fields[4].AsString;
    f6:=Form1.SQLQuery1.Fields[5].AsString;
    f7:=Form1.SQLQuery1.Fields[6].AsString;
    f8:=Form1.SQLQuery1.Fields[7].AsString;
    f9:=Form1.SQLQuery1.Fields[8].AsString;
    yy:=StrToInt(f2);
    mm:=StrToInt(f3);
    dd:=1;
    dat1:=EncodeDate(yy, mm, dd);
    yy2:=YearOf(vdat16);
    mm2:=MonthOf(vdat16);
    yy3:=YearOf(bdat16);
    mm3:=MonthOf(bdat16);
    if ((yy >= yy2) and (yy <= yy3) and (mm >= mm2) and (mm <= mm3)) then
    begin
...........
    end;
    Form1.SQLQuery1.Next;
  end;
  Form1.SQLQuery1.Close;
Wenn ich Haltepunkte setze und Compeliere ist eine Zeile Grün (siehe Anhang).
Wenn ich nun das Programm im Einzelschritt (F9 bei den Haltepunkten) durcharbeite,
so springt das Programm bei der grünen Zeile wieder auf den ersten Haltepunkt usw.
So oft bis alle Satze in der Datenbank gelesen sind.
Danach geht es mit Form1.SQLQuery1.Close; weiter.
Die Codezeilen dazwischen werden nicht berücksichtigt.
Hat jemand da eine Idee?
Gruß Jürgen
Miniaturansicht angehängter Grafiken
gruen.jpg  
Jürgen Linder

Geändert von mkinzler ( 8. Jan 2018 um 19:47 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#2

AW: grüne Zeile

  Alt 8. Jan 2018, 19:50
Diese ist eine Zeile, zu der aktuell keine Debuginfos vorliegen.
> neue Zeile oder die Zeile wurde wegoptimiert, wenn z.B. die Variable links nirgendwo verwendet würde und der Compiler sich denkt, dass alles nutzlos ist.

Da ich sonst auch nirgendwo Codepunkte links sehe ... einfach mal die Unit / das Projekt neu kompileren erzeugen?
Haltepunkte löschen und neu setzen. (manchmal verrutscht einfach was)

PS: Ein [DELPHI] dein Delphi-Code [/DELPHI] würde deinen Code bestimmt lesbarer machen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 8. Jan 2018 um 19:56 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.053 Beiträge
 
Delphi 2009 Professional
 
#3

AW: grüne Zeile

  Alt 8. Jan 2018, 19:54
Grüne Zeile heißt: Der Compiler hat die Zeile entfernt. Entweder ist sie unnötig (ist sie hier offenbar nicht) oder neu.
Daher einmal das ganze Projekt neu kompilieren oder erzeugen und die Compilermeldungen genau lesen.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
juelin

Registriert seit: 9. Mai 2006
Ort: Mannheim
142 Beiträge
 
Delphi XE5 Professional
 
#4

AW: grüne Zeile

  Alt 8. Jan 2018, 20:46
kann man die Funktion, das der Compiler Zeilen ausschaltet irgendwie deaktivieren?
Jürgen Linder
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#5

AW: grüne Zeile

  Alt 8. Jan 2018, 21:16
Unter Delphi 7 ging das in den Projektoptionen unter Compiler und dort dann unter Optimierung.

Ansonsten mal hier stöbern:
http://docwiki.embarcadero.com/RADSt...onfigurationen
https://support.smartbear.com/viewarticle/54592/
  Mit Zitat antworten Zitat
juelin

Registriert seit: 9. Mai 2006
Ort: Mannheim
142 Beiträge
 
Delphi XE5 Professional
 
#6

grüne Zeile

  Alt 8. Jan 2018, 21:50
hi,
muss leider nochmal schreieben und das Problem konkretisieren.

ich habe ein Problem und weiß nicht mehr weiter.
Habe Windows 7 und Delphi XE5

Habe eine Code:
Delphi-Quellcode:
procedure TForm16.Ladtag;
  var z: integer;
  var m: integer;
  var dat1: TDate;
  var dat2: TDate;
  var dat3: TDate;
  var wa: string;
  var sum1: double;
  var sum2: double;
  var sum3: double;
  var sum4: double;
  var sum5: double;
  var sum6: double;
  var mg: double;
  var dd: Word;
  var mm: Word;
  var yy: Word;
  var dd2: Word;
  var mm2: Word;
  var yy2: Word;
  var mm3: Word;
  var yy3: Word;
  var h1: integer;
  var h2: integer;
begin
  z:=1;
  StringGrid1.RowCount:=z;
  Label1.Caption:=Chr(169)+'LINSOFT Das Wohnzimmer Datum: '+FormatDateTime('DD.MM.YYYY',now);
  sume16:=0;
  suma16:=0;
  sum1:=0;
  sum2:=0;
  sum3:=0;
  sum4:=0;
  sum5:=0;
  sum6:=0;
  m:=0;
  Form1.SQLQuery1.SQL.Text:='SELECT * FROM einaustag ORDER BY Jahr, Monat, Ware ';
  Form1.SQLQuery1.Open;
  while not Form1.SQLQuery1.EOF do
  begin
    f1:=Form1.SQLQuery1.Fields[0].AsString;
    f2:=Form1.SQLQuery1.Fields[1].AsString;
    f3:=Form1.SQLQuery1.Fields[2].AsString;
    f4:=Form1.SQLQuery1.Fields[3].AsString;
    f5:=Form1.SQLQuery1.Fields[4].AsString;
    f6:=Form1.SQLQuery1.Fields[5].AsString;
    f7:=Form1.SQLQuery1.Fields[6].AsString;
    f8:=Form1.SQLQuery1.Fields[7].AsString;
    f9:=Form1.SQLQuery1.Fields[8].AsString;
    fa:=Form1.SQLQuery1.Fields[9].AsString;
    yy:=StrToInt(f2);
    mm:=StrToInt(f3);
    dd:=StrToInt(f4);
    dat1:=EncodeDate(yy, mm, dd);
    if ((dat1 >= vdat16) and (dat1 <= bdat16)) then
    begin
      if m = 0 then
      begin
        dat2:=dat1;
        wa:=f1;
        m:=1;
      end;
      mm:=MonthOf(dat2);
      yy:=YearOf(dat2);
      mm2:=MonthOf(dat1);
      yy2:=YearOf(dat1);
      if ((mm <> mm2) or (yy <> yy2) or (wa <> f1)) then
      begin
        dd:=DayOf(dat2);
        mm:=MonthOf(dat2);
        yy:=YearOf(dat2);
        ialpha:=FloatToStr(sum1);
        Form1.kommapunkt;
        fb:=ialpha;
        ialpha:=FloatToStr(sum2);
        Form1.kommapunkt;
        fc:=ialpha;
        ialpha:=FloatToStr(sum3);
        Form1.kommapunkt;
        fd:=ialpha;
        ialpha:=FloatToStr(sum4);
        Form1.kommapunkt;
        fe:=ialpha;
        ialpha:=FloatToStr(sum5);
        Form1.kommapunkt;
        ff:=ialpha;
        ialpha:=FloatToStr(sum6);
        Form1.kommapunkt;
        fg:=ialpha;
        Form1.SQLDataSet1.CommandText:='INSERT INTO einausmon (Ware, Jahr, Monat, einmg, ausmg, einbetrag, ausbetrag, einmwst, ausmwst)'+' values ('''+wa+''', '''+IntToStr(yy)+''', '''+IntToStr(mm)+''', '''+fb+''', '''+fc+''', '''+fd+''', '''+fe+''', '''+ff+''', '''+fg+''')';
        h1:=Form1.SQLDataSet1.ExecSQL(False);
        if h1 <> 1 then
        begin
          Label2.Caption:='Fehler beim Einfügen in einausmon, Administrator verständigen';
        end;
        dat2:=dat1;
        wa:=f1;
        sum1:=0;
        sum2:=0;
        sum3:=0;
        sum4:=0;
        sum5:=0;
        sum6:=0;
        ialpha:=f5;
        Form1.punktkomma;
        mg:=StrToFloat(ialpha);
        sum1:=sum1+mg;
        ialpha:=f6;
        Form1.punktkomma;
        mg:=StrToFloat(ialpha);
        sum2:=sum2+mg;
        ialpha:=f7;
        Form1.punktkomma;
        mg:=StrToFloat(ialpha);
        sum3:=sum3+mg;
        ialpha:=f8;
        Form1.punktkomma;
        mg:=StrToFloat(ialpha);
        sum4:=sum4+mg;
        ialpha:=f9;
        Form1.punktkomma;
        mg:=StrToFloat(ialpha);
        sum5:=sum5+mg;
        ialpha:=fa;
        Form1.punktkomma;
        mg:=StrToFloat(ialpha);
        sum6:=sum6+mg;
      end else begin
        ialpha:=f5;
        Form1.punktkomma;
        mg:=StrToFloat(ialpha);
        sum1:=sum1+mg;
        ialpha:=f6;
        Form1.punktkomma;
        mg:=StrToFloat(ialpha);
        sum2:=sum2+mg;
        ialpha:=f7;
        Form1.punktkomma;
        mg:=StrToFloat(ialpha);
        sum3:=sum3+mg;
        ialpha:=f8;
        Form1.punktkomma;
        mg:=StrToFloat(ialpha);
        sum4:=sum4+mg;
        ialpha:=f9;
        Form1.punktkomma;
        mg:=StrToFloat(ialpha);
        sum5:=sum5+mg;
        ialpha:=fa;
        Form1.punktkomma;
        mg:=StrToFloat(ialpha);
        sum6:=sum6+mg;
      end;
    end;
    Form1.SQLQuery1.Next;
  end;
  Form1.SQLQuery1.Close;
  if m = 1 then
  begin
    dd:=DayOf(dat1);
    mm:=MonthOf(dat1);
    yy:=YearOf(dat1);
    ialpha:=FloatToStr(sum1);
    Form1.kommapunkt;
    fb:=ialpha;
    ialpha:=FloatToStr(sum2);
    Form1.kommapunkt;
    fc:=ialpha;
    ialpha:=FloatToStr(sum3);
    Form1.kommapunkt;
    fd:=ialpha;
    ialpha:=FloatToStr(sum4);
    Form1.kommapunkt;
    fe:=ialpha;
    ialpha:=FloatToStr(sum5);
    Form1.kommapunkt;
    ff:=ialpha;
    ialpha:=FloatToStr(sum6);
    Form1.kommapunkt;
    fg:=ialpha;
    Form1.SQLDataSet1.CommandText:='INSERT INTO einausmon (Ware, Jahr, Monat, einmg, ausmg, einbetrag, ausbetrag, einmwst, ausmwst)'+' values ('''+f1+''', '''+IntToStr(yy)+''', '''+IntToStr(mm)+''', '''+fb+''', '''+fc+''', '''+fd+''', '''+fe+''', '''+ff+''', '''+fg+''')';
    h1:=Form1.SQLDataSet1.ExecSQL(False);
    if h1 <> 1 then
    begin
      Label2.Caption:='Fehler beim Einfügen in einausmon, Administrator verständigen';
    end;
  end;
  m:=0;
[Zeile 258] Form1.SQLQuery1.SQL.Text:='SELECT * FROM einausmon ORDER BY Jahr, Monat, Ware ';
  Form1.SQLQuery1.Open;
  while not Form1.SQLQuery1.EOF do
  begin
    f1:=Form1.SQLQuery1.Fields[0].AsString;
    f2:=Form1.SQLQuery1.Fields[1].AsString;
    f3:=Form1.SQLQuery1.Fields[2].AsString;
    f4:=Form1.SQLQuery1.Fields[3].AsString;
    f5:=Form1.SQLQuery1.Fields[4].AsString;
    f6:=Form1.SQLQuery1.Fields[5].AsString;
    f7:=Form1.SQLQuery1.Fields[6].AsString;
    f8:=Form1.SQLQuery1.Fields[7].AsString;
    f9:=Form1.SQLQuery1.Fields[8].AsString;
    yy:=StrToInt(f2);
    mm:=StrToInt(f3);
    dd:=1;
    dat1:=EncodeDate(yy, mm, dd);
    yy2:=YearOf(vdat16);
    mm2:=MonthOf(vdat16);
[Zeile277] yy3:=YearOf(bdat16);
    mm3:=MonthOf(bdat16);
    if ((yy >= yy2) and (yy <= yy3) and (mm >= mm2) and (mm <= mm3)) then
    begin
      if m = 0 then
      begin
        dat2:=dat1;
        m:=1;
      end;
      if dat2 <> dat1 then
      begin
        dd2:=0;
        mm2:=MonthOf(dat2);
        yy2:=YearOf(dat2);
        Form1.SQLDataSet1.CommandText:='INSERT INTO abschluss (Art, Jahr, Monat, Tag)'+' values ('''+'M'+''', '''+IntToStr(yy2)+''', '''+IntToStr(mm2)+''', '''+IntToStr(dd2)+''')';
        h1:=Form1.SQLDataSet1.ExecSQL(False);
        if h1 <> 1 then
        begin
          Label2.Caption:='Fehler beim Einfügen in Abschluss, Administrator verständigen';
        end;
        dat2:=dat1;
      end;
      fg:='';
      fh:='';
      Form1.SQLQuery2.SQL.Text:='SELECT * FROM ware WHERE Ware='''+f1+''' ';
      Form1.SQLQuery2.Open;
      while not Form1.SQLQuery2.EOF do
      begin
        fg:=Form1.SQLQuery2.Fields[2].AsString;
        fh:=Form1.SQLQuery2.Fields[13].AsString;
        Form1.SQLQuery2.Next;
      end;
      Form1.SQLQuery2.Close;
      mm:=StrToInt(f3);
      yy:=StrToInt(f2);
      z:=z + 1;
      StringGrid1.RowCount:=z;
      z:=z - 1;
      StringGrid1.Cells[0, z]:=IntToStr(yy);
      StringGrid1.Cells[1, z]:=IntToStr(mm);
      StringGrid1.Cells[2, z]:=f1;
      ialpha:=f4;
      Form1.punktkomma;
      mg:=StrToFloat(ialpha);
      StringGrid1.Cells[3, z]:=FloatToStrF(mg,ffFixed,8,3);
      StringGrid1.Cells[4, z]:=fg;
      ialpha:=f5;
      Form1.punktkomma;
      mg:=StrToFloat(ialpha);
      StringGrid1.Cells[5, z]:=FloatToStrF(mg,ffFixed,8,3);
      StringGrid1.Cells[6, z]:=fh;
      ialpha:=f6;
      Form1.punktkomma;
      mg:=StrToFloat(ialpha);
      StringGrid1.Cells[7, z]:=FloatToStrF(mg,ffFixed,8,2);
      sume16:=sume16+mg;
      ialpha:=f7;
      Form1.punktkomma;
      mg:=StrToFloat(ialpha);
      StringGrid1.Cells[8, z]:=FloatToStrF(mg,ffFixed,8,2);
      suma16:=suma16+mg;
      ialpha:=f8;
      Form1.punktkomma;
      mg:=StrToFloat(ialpha);
      StringGrid1.Cells[9, z]:=FloatToStrF(mg,ffFixed,8,2);
      ialpha:=f9;
      Form1.punktkomma;
      mg:=StrToFloat(ialpha);
[Zeile 345] StringGrid1.Cells[10, z]:=FloatToStrF(mg,ffFixed,8,2);
      z:=z + 1;
    end;
    Form1.SQLQuery1.Next;
  end;
  Form1.SQLQuery1.Close;
  if m = 1 then
  begin
    dd2:=0;
    mm2:=MonthOf(dat1);
    yy2:=YearOf(dat1);
    Form1.SQLDataSet1.CommandText:='INSERT INTO abschluss (Art, Jahr, Monat, Tag)'+' values ('''+'M'+''', '''+IntToStr(yy2)+''', '''+IntToStr(mm2)+''', '''+IntToStr(dd2)+''')';
    h1:=Form1.SQLDataSet1.ExecSQL(False);
    if h1 <> 1 then
    begin
      Label2.Caption:='Fehler beim Einfügen in Abschluss, Administrator verständigen';
    end;
  end;
  Label8.Caption:=FloatToStrF(sume16,ffFixed,9,2);
  Label10.Caption:=FloatToStrF(suma16,ffFixed,9,2);
  if z = 1 then
  begin
    StringGrid1.RowCount:=2;
    StringGrid1.Cells[0, 1]:='';
    StringGrid1.Cells[1, 1]:='';
    StringGrid1.Cells[2, 1]:='';
    StringGrid1.Cells[3, 1]:='';
    StringGrid1.Cells[4, 1]:='';
    StringGrid1.Cells[5, 1]:='';
    StringGrid1.Cells[6, 1]:='';
    StringGrid1.Cells[7, 1]:='';
    StringGrid1.Cells[8, 1]:='';
    StringGrid1.Cells[9, 1]:='';
    StringGrid1.Cells[10, 1]:='';
  end;
  StringGrid1.FixedRows:=1;
  StringGrid1.FixedColor:=clLime;
end;
Wenn ich Haltepunkte setze und Compeliere sind einige Zeilen Grün (siehe Anhang).
Wenn ich nun das Programm im Einzelschritt (F9 bei den Haltepunkten) durcharbeite,
so springt das Programm bei Zeile 278 als nächstes auf Zeile 345
danach Zeilen 258 bis 277 und wieder Zeile 345 und Zeile 258, und so weiter
bis alle Satze in der Datenbank gelesen sind (Zeilennummern im Anhang).
Danach geht es mit Form1.SQLQuery1.Close; weiter.
Die Codezeilen dazwischen werden nicht berücksichtigt.
Projekt neu Compelieren bzw. Projekt neu erzeugen bringt auch nichts.
Keine relevanten Fehlermeldungen nach Projekt neu erzeugen vorhanden.
Kann man die Funktion Zeilen deaktivieren ausschalten?

Hat jemand da eine Idee und kann helfen?
Gruß Jürgen
Angehängte Dateien
Dateityp: rar Wohnzimmer1.rar (3,29 MB, 0x aufgerufen)
Dateityp: rar Wohnzimmer2.rar (3,38 MB, 0x aufgerufen)
Dateityp: rar Wohnzimmer3.rar (3,62 MB, 0x aufgerufen)
Jürgen Linder
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#7

AW: gruene Codezeilen

  Alt 8. Jan 2018, 22:03
Da hab' ich jetzt keine sinnvolle Antwort, weiß aber, dass in eínigen Projekten von mir, die Anzeige der Zeilen im Debugger, nicht mit den tatsächlich ausgeführten Zeilen übereinstimmt. Die Differenz ist zwar innerhalb eines Projektes einheitlich, aber bei unterschiedichen Projekt meist in einer Spanne von ca. 5 bis 9 Zeilen.

Es könnte sein, dass der Debugger die Zeilen nicht mit der realen Welt synchroniert bekommt.

Kannst Du Haltepunkte nur auf Zeilen setzen, die auch ausführbaren Code enthalten oder ggfls. auch auf Leerzeilen. In seltenen Fällen hab' ich schonmal diesen Effekt.

Compilierst Du mit Debugger-DCUs?
Wenn nein, ändere das bitte einmal, eventuell hast Du ja damit Glück.
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: gruene Codezeilen

  Alt 8. Jan 2018, 22:16
lösche mal die zugehörigen dcus deiner (!) Sourcen und kompilier mal neu. Stimmen die Haltepunkte immer noch nicht, dann schau, ob Du ggf. 2 gleichname Dateien im Suchpfad hast.

Grüße
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#9

AW: gruene Codezeilen

  Alt 8. Jan 2018, 22:47
Methode brutal:

Alle Verzeichnisse, die für die Ausgabe dienen, umbenennen und leer neu anlegen. Dann kompilieren, und nur dann, wenn Fehler wegen fehlender DCUs auftreten, zuerst nach den entsprechenden PAS-Dateien suchen und die mit in die entsprechenden Pfade aufnehmen.

Nur wenn es keine PAS-Dateien gibt, DCUs in den entsprechenden Verzeichnisse verschieben (also in die neuen Verzeichnis zu den zuvor umbenannten).

Und ja: Das ist aufwändig und nervtötend, hilft aber zuweilen, vor allem dann, wenn eine Entwicklungsumgebung schon 'ne Weile in Benutzung ist und sich da so allerlei angesammelt hat (z. B. die von Lemmy angesprochenen gleichnamigen Dateien).

Und nein: Eine Erfolgsgarantie gibt's dafür nicht.
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#10

AW: gruene Codezeilen

  Alt 9. Jan 2018, 08:51
Da hab' ich jetzt keine sinnvolle Antwort, weiß aber, dass in eínigen Projekten von mir, die Anzeige der Zeilen im Debugger, nicht mit den tatsächlich ausgeführten Zeilen übereinstimmt. Die Differenz ist zwar innerhalb eines Projektes einheitlich, aber bei unterschiedichen Projekt meist in einer Spanne von ca. 5 bis 9 Zeilen.
Das hatte ich auch schon mal, mit falschen Zeilenumbrüchen. Ich habe dann den ganzen Quelltext der betroffenen Unit in einen Texteditor kopiert. Die "bösen" Zeilenumbrüche ersetzt und wieder alles zurück kopiert.
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz