AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung iOS iOS TFormatsettings.Create - wie SOLIDe darf es sein?
Thema durchsuchen
Ansicht
Themen-Optionen

iOS TFormatsettings.Create - wie SOLIDe darf es sein?

Ein Thema von fisipjm · begonnen am 25. Nov 2025 · letzter Beitrag vom 27. Nov 2025
Antwort Antwort
Benutzerbild von fisipjm
fisipjm

Registriert seit: 28. Okt 2013
402 Beiträge
 
Delphi 13 Florence
 
#1

iOS TFormatsettings.Create - wie SOLIDe darf es sein?

  Alt 25. Nov 2025, 11:32
Moin,

ich muss mal kürz eine Frage hier rein werfen weil ich nicht verstehe wo hier der Fehler liegt bzw. wo er her kommt.
Ich gehe mal davon aus Delphi und auch iOS halten sich bei ihrer Entwicklung an das SOLID Prinzip.

Wenn ich folgenden Code ausführe, erhalte ich unter iOS ein wirklich unschönes Ergebnis.

Delphi-Quellcode:
  var LanguageCode = 'de-DE';
  log('Vor Format Settings', LanguageCode );
  var FS := TFormatSettings.Create(LanguageCode );
  FS.ShortTimeFormat := 'HH:mm';
  FS.LongTimeFormat := 'HH:mm:ss';
  FormatSettings := FS;
  log('Nach Format Settings', LanguageCode );
Ausgabe:
Code:
Vor Format Settings: 'de-DE'
Nach Format Settings: 'de_DE'
Wirklich nicht dolle!
Ich vermute es liegt an der Implementierung von `TFormatSettings.AdjustLocaleName` in der `System.SysUtils` verstehe es aber nicht wirklich. Vielleicht weil man hier mit Pointern arbeitet? Kennt ihr das? Könnt ihr das Verhalten nachvollziehen? Wenn ja, ist das doch absolut ein Bug oder?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.921 Beiträge
 
Delphi 13 Florence
 
#2

AW: iOS TFormatsettings.Create - wie SOLIDe darf es sein?

  Alt 25. Nov 2025, 12:25
Das ist vermutlich wirklich ein Bug. Bei LocaleName wird ja als const Parameter auch nur ein Pointer übergeben, so als wäre er als var Parameter deklariert. Mit Result := LocalName wird der Pointer kopiert und der Referenzzähler erhöht. Der nachfolgende Cast P := PChar(Result) ermöglicht dann die Veränderung von LocaleName, obwohl es als const deklariert ist. Was da fehlt ist ein UniqueString(Result) nach der Zuweisung von Result.

Mach doch bitte einen entsprechenden Eintrag im Quality Portal. Wenn möglich bitte mit einem einfachen Testprojekt.
Gemäß der Definition von CLookup und CReplace müsste das überall außer bei Windows auftreten. Allerdings ließe sich das wohl auch unter Windows reproduzieren, wenn man die beiden vor- und nach-Strings vertauscht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von fisipjm
fisipjm

Registriert seit: 28. Okt 2013
402 Beiträge
 
Delphi 13 Florence
 
#3

AW: iOS TFormatsettings.Create - wie SOLIDe darf es sein?

  Alt 25. Nov 2025, 12:57
Das ist vermutlich wirklich ein Bug. Bei LocaleName wird ja als const Parameter auch nur ein Pointer übergeben, so als wäre er als var Parameter deklariert. Mit Result := LocalName wird der Pointer kopiert und der Referenzzähler erhöht. Der nachfolgende Cast P := PChar(Result) ermöglicht dann die Veränderung von LocaleName, obwohl es als const deklariert ist. Was da fehlt ist ein UniqueString(Result) nach der Zuweisung von Result.

Mach doch bitte einen entsprechenden Eintrag im Quality Portal. Wenn möglich bitte mit einem einfachen Testprojekt.
Gemäß der Definition von CLookup und CReplace müsste das überall außer bei Windows auftreten. Allerdings ließe sich das wohl auch unter Windows reproduzieren, wenn man die beiden vor- und nach-Strings vertauscht.
Danke Uwe. Ich hab mir fast schon sowas gedacht, bin aber im Bereich der Pointer nicht so firm. Find ich Krass, dass sich ein Const Parameter einfach durch einen Pointer "austricksen" lässt. Ich hätte vermutet, dass für ein Const der Speicherbereich irgendwie nochmal als nicht veränderbar geflagt wird. Aber wie gesagt dafür bin ich einfach nicht tief genug drin.

https://embt.atlassian.net/servicede...tal/1/RSS-4662
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.074 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: iOS TFormatsettings.Create - wie SOLIDe darf es sein?

  Alt 25. Nov 2025, 16:04
So gehts auf Windows kaputt:

Delphi-Quellcode:
begin
  var LanguageCode := 'de_DE';
  UniqueString(LanguageCode); // damit aus dem string literal ein heap allokierter String wird
  Writeln('Vor Format Settings: ', LanguageCode );
  var FS := TFormatSettings.Create(LanguageCode );
  Writeln('Nach Format Settings: ', LanguageCode );
end.
Was da fehlt ist ein UniqueString(Result) nach der Zuweisung von Result.
Ja, oder einfach copy-on-write nutzen und nicht auf PChar casten, um - und _ zu ersetzen
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (25. Nov 2025 um 16:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von fisipjm
fisipjm

Registriert seit: 28. Okt 2013
402 Beiträge
 
Delphi 13 Florence
 
#5

TFormatsettings.Create - wie SOLIDe darf es sein?

  Alt 27. Nov 2025, 08:13
Gibt es eigentlich die Möglichkeit den Post nochmal nachträglich zu verändern? Er ist ja über Titel und Prefix recht strikt auf iOS limitiert betrifft ja aber eigentlich jede Plattform ´.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.025 Beiträge
 
#6

AW: TFormatsettings.Create - wie SOLIDe darf es sein?

  Alt 27. Nov 2025, 09:27
Gibt es eigentlich die Möglichkeit den Post nochmal nachträglich zu verändern? Er ist ja über Titel und Prefix recht strikt auf iOS limitiert betrifft ja aber eigentlich jede Plattform ´.
Ja, ersten Post "Bearbeiten" und dann auf "Erweitert". Dort kannst du auch den Titel ändern.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von fisipjm
fisipjm

Registriert seit: 28. Okt 2013
402 Beiträge
 
Delphi 13 Florence
 
#7

AW: TFormatsettings.Create - wie SOLIDe darf es sein?

  Alt 27. Nov 2025, 11:49
Gibt es eigentlich die Möglichkeit den Post nochmal nachträglich zu verändern? Er ist ja über Titel und Prefix recht strikt auf iOS limitiert betrifft ja aber eigentlich jede Plattform ´.
Ja, ersten Post "Bearbeiten" und dann auf "Erweitert". Dort kannst du auch den Titel ändern.
ich kann immer nur den letzten Post bearbeiten. Für die anderen bekomme ich die Möglichkeit nicht angezeigt. Auch den Prefix kann ich da nicht rausnehmen.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.790 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: iOS TFormatsettings.Create - wie SOLIDe darf es sein?

  Alt 27. Nov 2025, 11:56
den ersten Eintrag und den Titel, kann man meines Wissens, nur in den ersten 24h bearbeiten.
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: iOS TFormatsettings.Create - wie SOLIDe darf es sein?

  Alt 27. Nov 2025, 19:26
den ersten Eintrag und den Titel, kann man meines Wissens, nur in den ersten 24h bearbeiten.
Alle Posts nur 24 Stunden (außer z.B. in Software-Projekte der Mitglieder)
und ja, der Titel des Ersten ist auch für die Anzeige.

Danach könntest du noch den [Report]-Knopf benutzen und lieb fragen.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:23 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