Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Unsichere Typumwandlung bei TFormatSettings (https://www.delphipraxis.net/169987-unsichere-typumwandlung-bei-tformatsettings.html)

Gollum 24. Aug 2012 07:50

Unsichere Typumwandlung bei TFormatSettings
 
Hallo,

seit neuestem warnt mich der Compiler vor einer unsicheren Typumwandlung, wenn ich FormatSettings benutze.


Beispiel:
Delphi-Quellcode:
function GetMonatText(aMonat:Integer; short:Bool=False):String;
begin
  if short then Result:=FormatSettings.ShortMonthNames[aMonat]
    else Result:=FormatSettings.LongMonthNames[aMonat];
end;
Warnhinweis:
[DCC Warnung] uDatumLight.pas(492): W1048 Unsichere Typumwandlung von 'string' nach 'TFormatSettings'


Wenn ich folgendes mache, kommt keine Warnung!?
Delphi-Quellcode:
function GetMonatText(aMonat:Integer; short:Bool=False):String;
var fms:TFormatSettings;
begin
  fms:=TFormatSettings.Create;
  if short then Result:=fms.ShortMonthNames[aMonat]
    else Result:=fms.LongMonthNames[aMonat];
end;
Das kann doch sicher nicht die Lösung des Problems sein.
Was läuft da schief?

s.h.a.r.k 24. Aug 2012 09:14

AW: Unsichere Typumwandlung bei TFormatSettings
 
Bist du sicher, dass der Warnhinweis bei diesem Code hier kommt? :shock:
Delphi-Quellcode:
function GetMonatText(aMonat:Integer; short:Bool=False):String;
begin
  if short then Result:=FormatSettings.ShortMonthNames[aMonat]
    else Result:=FormatSettings.LongMonthNames[aMonat];
end;
Da wird doch nichts an FormatSettings zugewiesen, sondern nur gelesen... :gruebel:

Gollum 24. Aug 2012 09:30

AW: Unsichere Typumwandlung bei TFormatSettings
 
Zitat:

Bist du sicher, dass der Warnhinweis bei diesem Code hier kommt? :shock:
Zu 100%. Nicht nur an dieser Stelle, sondern an allen Stellen, an denen ich Formatsettings benutze.

s.h.a.r.k 24. Aug 2012 09:41

AW: Unsichere Typumwandlung bei TFormatSettings
 
Hm, also bei mir klappt es. Habe es gerade mal bei mir getestet (auch XE2) und alles passt.

Erzeugst du irgendwo neue Instanzen von TFormatSettings? Hast du irgendwo eine Variable namens FormatSettings vom Typ string? Seltsam ists schon..

Gollum 24. Aug 2012 09:48

AW: Unsichere Typumwandlung bei TFormatSettings
 
Zitat:

Erzeugst du irgendwo neue Instanzen von TFormatSettings? Hast du irgendwo eine Variable namens FormatSettings vom Typ string? Seltsam ists schon..
Das dieses Verhalten seltsam ist, da gebe ich Dir Recht.
Und nein, ich erzeuge keine Extrainstanz von Formatsettings und auch keine Varable oder ähnliches.
Warum sollte ich auch?

Furtbichler 24. Aug 2012 10:30

AW: Unsichere Typumwandlung bei TFormatSettings
 
Poste mal dein Beispielprojekt, bitte.

Gollum 24. Aug 2012 10:49

AW: Unsichere Typumwandlung bei TFormatSettings
 
Zitat:

Zitat von Furtbichler
Poste mal dein Beispielprojekt, bitte.

Geht leider nicht. Zum Einen ist das Projekt zu komplex (incl. Datenbankanbindung) und zum Anderen hat mein Arbeitgeber etwas dagegen.

himitsu 24. Aug 2012 11:10

AW: Unsichere Typumwandlung bei TFormatSettings
 
Wenn man sich anguckt, wie die globale "Instanz" dieses Records deklariert ist...
Eigentlich sollte es nicht, aber da kann der Compilier schonmal durcheinander kommen.

Zum Glück ist es bei dir nur eine Warnung, denn eigentlich würde soeine Zuweisung, von derartig inkompatiblen Typen, in einem Error enden und den Kompilierungsvorgang abbrechen.

Hier (XE2 ohne Updates) wird aber auch nicht gemeckert.

s.h.a.r.k 24. Aug 2012 11:26

AW: Unsichere Typumwandlung bei TFormatSettings
 
Zitat:

Zitat von Gollum (Beitrag 1179699)
Zitat:

Zitat von Furtbichler
Poste mal dein Beispielprojekt, bitte.

Geht leider nicht. Zum Einen ist das Projekt zu komplex (incl. Datenbankanbindung) und zum Anderen hat mein Arbeitgeber etwas dagegen.

Kannst du dann wenigstens alle relevanten Stellen posten, die mit FormatSettings zu tun haben!?

Gollum 24. Aug 2012 11:34

AW: Unsichere Typumwandlung bei TFormatSettings
 
Hallo,

kann ich, bringt aber warscheinlich nichts.

Hier mal einige Auszüge:
Delphi-Quellcode:
  if CharInSet(Text[i], ['0'..'9', '-', '+', FormatSettings.DecimalSeparator]) then
  ...
  ...
  if short then Result:=FormatSettings.ShortDayNames[aTag]
    else Result:=FormatSettings.LongDayNames[aTag]
  ...
  ...
  for i:=1 to 12 do cbbMonat.Items.Add(FormatSettings.LongMonthNames[i]);
Das komische an der Sache ist, dass in einem anderen Projekt, dass auch auf (gemeinsame) Dateien dieses Projektes zugreift, die Warnung nicht erscheint.

himitsu 24. Aug 2012 11:48

AW: Unsichere Typumwandlung bei TFormatSettings
 
Sieh es einfach als winzigen Bug im Compiler an.
Du könntest es ja mal im QC melden.

Gollum 24. Aug 2012 12:04

AW: Unsichere Typumwandlung bei TFormatSettings
 
Der Bug sitzt eher vor dem Bildschirm. Wie ich ja bereits vorhin geschrieben habe, taucht das Problem bei einem anderen Projekt nicht auf.

Wahrscheinlich habe ich in den Millionen von Optionen irgenwo etwas falsches angekreuzt bzw. aktiviert. Den Unterschied habe ich bisher leider noch nicht gefunden.

himitsu 24. Aug 2012 12:12

AW: Unsichere Typumwandlung bei TFormatSettings
 
Compilerfehler (also insgesamt Fehler im Compiler/Linker/Debugger) tauchen nicht immer auf.
Viele sind situationsabhängig.

Oftmals ist es so, daß man nur irdentwo anders eine winzige Unbedeutende Sache zu ändern braucht, welche mit dem Problem nichtmal im Geringsten etwas zu tun hat, und urplötzlich funktioniert das Andere (oder andersrum und es funktioniert eben nicht mehr)
Ich hatte es mal, daß ich davor nur eine Leerzeile reinmachen mußte und schon ging es, oder zwei Funktionen austauschen (die Eine vor die Andere verschieben).


Was du machen kannst ist das Zurückbauen des Projekts.
Also so lange alles andere ausbauen, bis es wieder funktioniert, oder bis am Ende möglichst nur noch die fehlerhafte Codestelle übrigbleibt.
Wenn's geht, dann den Teil wieder reinmchen, prüfen ob's nun wieder Probleme gibt und wenn ja, dann eventuell was Anderes entfernen usw.
Am Ende dann natürlich ab ins QC damit.

Gollum 24. Aug 2012 12:28

AW: Unsichere Typumwandlung bei TFormatSettings
 
Zitat:

Zitat von himitsu
Was du machen kannst ist das Zurückbauen des Projekts.

Das wird bei ca. 60.000 Programm-Zeilen etwas mühsam. Ich hätte nicht einmal einen vernünftigen Ansatz, da von diesem (komischen) Hinweis auch installierte Komponenten und diverse gemeinsam genutze Units betroffen sind.

Gollum 4. Sep 2012 11:04

AW: Unsichere Typumwandlung bei TFormatSettings
 
Hallo,

ich habe den Grund für die "unsichere Typumwandlung" gefunden:

Das Problem trat eigentlich nur bei von D7 nach XE2 portierten Programmen auf. Daraufhin habe ich die *.dproj mit einer neuen von XE2 erzeugten verglichen und bin dabei auf folgenden Eintrag gestossen:
Code:
  <PropertyGroup Condition="'$(Base)'!=''">
    ...
    <DCC_UNSAFE_CAST>true</DCC_UNSAFE_CAST> <--- dieser Eintrag ist der Verursacher
    ...
  </PropertyGroup>
Nachdem ich den Eintrag "<DCC_UNSAFE_CAST>" gelöscht habe, ist die unsinnige Compilerwarnung verschwunden.

Edit: Schade, zu früh gefreut. Das löschen des obigen Parameters hat nur zur Folge, dass die Ausgabewarnung "Unsichere Typumwandlung" von True auf False gesetzt wird.

uligerhardt 4. Sep 2012 12:23

AW: Unsichere Typumwandlung bei TFormatSettings
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Gollum (Beitrag 1181419)
Nachdem ich den Eintrag "<DCC_UNSAFE_CAST>" gelöscht habe, ist die unsinnige Compilerwarnung verschwunden.

Edit: Schade, zu früh gefreut. Das löschen des obigen Parameters hat nur zur Folge, dass die Ausgabewarnung "Unsichere Typumwandlung" von True auf False gesetzt wird.

In D2007 wird das über die Projektoptionen gesteuert - siehe Anhang. Vermutlich gibt's in XE2 was Ähnliches.

himitsu 4. Sep 2012 12:28

AW: Unsichere Typumwandlung bei TFormatSettings
 
Zitat:

Zitat von uligerhardt (Beitrag 1181441)
In D2007 wird das über die Projektoptionen gesteuert - siehe Anhang. Vermutlich gibt's in XE2 was Ähnliches.

Diese Projektoptionen werden in der *.dproj gespeichert. :zwinker:

Uwe Raabe 4. Sep 2012 12:29

AW: Unsichere Typumwandlung bei TFormatSettings
 
Es mach m.E. wenig Sinn, irgendwelche Warnungen des Compilers abzuschalten, anstatt das eigentliche Problem zu lösen. Der Code, so wie wir ihn hier zu sehen bekommen, ist nämlich völlig korrekt und die Warnung sollte gar nicht erst kommen. Eventuell hilft es ja, die .local und .identcache Dateien zu löschen.

himitsu 4. Sep 2012 12:32

AW: Unsichere Typumwandlung bei TFormatSettings
 
Darum auch
Zitat:

Zitat von himitsu (Beitrag 1179714)
Sieh es einfach als winzigen Bug im Compiler an.
Du könntest es ja mal im QC melden.


uligerhardt 4. Sep 2012 13:10

AW: Unsichere Typumwandlung bei TFormatSettings
 
Zitat:

Zitat von himitsu (Beitrag 1181443)
Zitat:

Zitat von uligerhardt (Beitrag 1181441)
In D2007 wird das über die Projektoptionen gesteuert - siehe Anhang. Vermutlich gibt's in XE2 was Ähnliches.

Diese Projektoptionen werden in der *.dproj gespeichert. :zwinker:

Ja. Aber vermutlich ist die "Vererbungshierachie" der Projektkonfigurationen im Dialog etwas besser zu erkennen und Gollums Effekt verschwindet so womöglich:
Zitat:

Zitat von Gollum (Beitrag 1181419)
Edit: Schade, zu früh gefreut. Das löschen des obigen Parameters hat nur zur Folge, dass die Ausgabewarnung "Unsichere Typumwandlung" von True auf False gesetzt wird.


Gollum 4. Sep 2012 13:16

AW: Unsichere Typumwandlung bei TFormatSettings
 
Zitat:

Zitat von Uwe Raabe
Es mach m.E. wenig Sinn, irgendwelche Warnungen des Compilers abzuschalten, anstatt das eigentliche Problem zu lösen.

Da gebe ich Dir vollkommen Recht. Das sehe ich genauso.

Zitat:

Zitat von Uwe Raabe
Eventuell hilft es ja, die .local und .identcache Dateien zu löschen.

Leider nein :cry:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 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