![]() |
AW: Variablen nicht NIL 64Bit
Der Compiler hat doch absolut Recht mit der Warnung
Delphi-Quellcode:
procedure Test;
var SomeThing:TObject; begin if Assigned(SomeThing) then begin SomeThing.Free(); SomeThing := nil; end; end;
Code:
und jetzt mal so
[dcc32 Hinweis] Project1.dpr(17): H2077 Auf 'SomeThing' zugewiesener Wert wird niemals benutzt
[dcc32 Warnung] Project1.dpr(14): W1036 Variable 'SomeThing' ist möglicherweise nicht initialisiert worden
Delphi-Quellcode:
procedure Test;
var SomeThing:TObject; begin SomeThing := nil; if Assigned(SomeThing) then begin SomeThing.Free(); SomeThing := nil; end; end;
Code:
Wollen wir diese letzte Warnung auch noch wegbekommen?
[dcc32 Hinweis] Project1.dpr(18): H2077 Auf 'SomeThing' zugewiesener Wert wird niemals benutzt
Delphi-Quellcode:
Bitteschön.
procedure Test;
var SomeThing:TObject; begin SomeThing := nil; if Assigned(SomeThing) then begin SomeThing.Free(); SomeThing := nil; end; FreeAndNil( SomeThing ); end; Jetzt die Preisfrage: Warum ist das so (und vor allem ist das unter Delphi 10.2.3 so völlig korrekt)? Wer es weiß, darf sich ein Bonbon nehmen. |
AW: Variablen nicht NIL 64Bit
Zitat:
TempFont := Nil steht in der ersten Zeile.. Aber ihr scheint es nicht zu verstehen.
Delphi-Quellcode:
Oder kannst du sehen das irgendwo ein Try final block oder ähnliches steht was die Warnung berechtigter weise ausgibt?
var
TempFont: GpFont; //.. begin TempFont := nil; if Assigned(TempFont) then begin GdipCheck(GdipDeleteFont(TempFont)); // Lösche das Font Object TempFont := nil; end; end; Zitat:
Zitat:
Zitat:
Zudem TempFont wird weiter unten im Code noch verwendet habe den Teil nur nicht addiert. bzw.. zwischen TempFont := Nil und Asssign gruss |
AW: Variablen nicht NIL 64Bit
Da du offensichtlich die Hinweise nicht korrekt deuten kannst hier eine kleine Hilfestellung.
Delphi-Quellcode:
Ich habe den Hinweistext unter die betreffende Codezeile eingefügt.
procedure Test;
var SomeThing:TObject; begin if Assigned(SomeThing) then // [dcc32 Warnung] Project1.dpr(14): W1036 Variable 'SomeThing' ist möglicherweise nicht initialisiert worden begin SomeThing.Free(); SomeThing := nil; // [dcc32 Hinweis] Project1.dpr(17): H2077 Auf 'SomeThing' zugewiesener Wert wird niemals benutzt end; end; Wird es jetzt klarer? Das andere Beipiel, was deinem am nächsten kommt
Delphi-Quellcode:
procedure Test;
var SomeThing:TObject; begin SomeThing := nil; if Assigned(SomeThing) then begin SomeThing.Free(); SomeThing := nil; // [dcc32 Hinweis] Project1.dpr(18): H2077 Auf 'SomeThing' zugewiesener Wert wird niemals benutzt end; end; |
AW: Variablen nicht NIL 64Bit
lies mein Edit! ;)
gruss |
AW: Variablen nicht NIL 64Bit
Dann zeig doch mal ein komplettes Beispiel, wo die falschen Warnungen geworfen werden.
Bei dem was du hier zeigst kann ich aktuell nur ein korrektes Verhalten sehen/nachvollziehen. |
AW: Variablen nicht NIL 64Bit
Zitat:
Delphi-Quellcode:
var
Graphics: LONG_PTR; Fam: GpFontFamily; TempFont: GpFont; rb: TRect; xWidth, YHeight: Integer; strFormat: GPSTRINGFORMAT; boundingBox, layoutRect: TGPRectF; begin result := GenericError; strFormat := nil; Fam := nil; TempFont := nil; ..// hier kommt Warnung unter D2010 in Delphi 10.2.3 nicht. Deshalb war es vorher nicht addiert. // habe es aber jetzt trotzdem addiert und ignoriere die Warnung. Graphics := 0; try GdipCheck(GdipCreateFontFamilyFromName(PWideChar(UseFont), FontCollection, Fam)); if Assigned(Fam) then begin GdipCheck(GdipCreateFont(Fam, UseSize, FontStyle, 2, TempFont)); if Assigned(TempFont) then begin // 0: Kein Schatten // Positiver wert für Schatten Rechts // Negativer wert für Schatten links // Zeichne den string GdipCheck(GdipCreateStringFormat(0, 0, strFormat)); GdipCheck(GdipCreateFromHDC(DC, Graphics)); FillChar(boundingBox, SizeOf(boundingBox), 0); FillChar(layoutRect, SizeOf(layoutRect), 0); GdipCheck(GdipMeasureString(Graphics, PWideChar(UseText), length(UseText), TempFont, @layoutRect, strFormat, @boundingBox, nil, nil)); if Assigned(strFormat) then GdipCheck(GdipDeleteStringFormat(strFormat)); if not WordWrap then begin xWidth := round(boundingBox.Width + 0.5); YHeight := round(boundingBox.Height + 1.5); if BlurText then begin SetRect(rb, rec.Left, rec.Top, rec.Left + xWidth, rec.Top + YHeight); BlurTextPlus(DC, UseText, rb, TempFont, BlurColor, 4, UseStrFormat); end; end else begin xWidth := rec.Right; YHeight := rec.Bottom; if BlurText then begin SetRect(rb, rec.Left, rec.Top, rec.Left + xWidth, rec.Top + YHeight); BlurTextPlus(DC, UseText, rb, TempFont, BlurColor, 4, UseStrFormat); end; end; result := DrawStringFormatedEx(Graphics, UseText, rec.Left, rec.Top, xWidth, YHeight, ColrARGB, SkinEngine.SK_TEXTRENDERING, TempFont, ShadowOffset, UseStrFormat); end; end; finally if Graphics <> 0 then begin GdipCheck(GdipDeleteGraphics(Graphics)); Graphics := 0; end; if Assigned(TempFont) then begin GdipCheck(GdipDeleteFont(TempFont)); // Und hier kracht es unter Win10 wenn TempFont mit irgendwas gefüllt wird. (In D2010 nicht! ) TempFont := nil; end; if Assigned(Fam) then begin GdipCheck(GdipDeleteFontFamily(Fam)); Fam := nil; end; end; end; |
AW: Variablen nicht NIL 64Bit
Zitat:
Ich habe mal die nötigen GDI+ Deklarationen extrahiert, da es die unter D2010 im Standard noch nicht gibt. Dieses Programm
Delphi-Quellcode:
gibt sowohl unter D2010 als auch unter Delphi 10.2.3 nur einen Hinweis
program Test;
type Status = (Ok, GenericError, InvalidParameter, OutOfMemory, ObjectBusy, InsufficientBuffer, NotImplemented, Win32Error, WrongState, Aborted, FileNotFound, ValueOverflow, AccessDenied, UnknownImageFormat, FontFamilyNotFound, FontStyleNotFound, NotTrueTypeFont, UnsupportedGdiplusVersion, GdiplusNotInitialized, PropertyNotFound, PropertyNotSupported); TStatus = Status; GpStatus = TStatus; type GpFont = Pointer; function GdipDeleteFont(font: GpFont): GpStatus; begin Result := Ok; end; procedure Main; var TempFont: GpFont; begin TempFont := nil; if Assigned(TempFont) then begin GdipDeleteFont(TempFont); TempFont := nil; // H2077 Auf 'TempFont' zugewiesener Wert wird niemals benutzt end; end; begin Main; end. Zitat:
|
AW: Variablen nicht NIL 64Bit
Zitat:
Eigentlich dürfte diese Warnung nicht auftreten. Ich lasse es jetzt drin stört nicht weiter. Danke für den Test!
Delphi-Quellcode:
Ist logisch weil du den Font vorher nicht verwendest.
if Assigned(TempFont) then begin
GdipDeleteFont(TempFont); TempFont := nil; // H2077 Auf 'TempFont' zugewiesener Wert wird niemals benutzt end; Aber Ich. Siehe! Assigned(TempFont) steht ja erst hinter dieser zeile ;)
Delphi-Quellcode:
Eigentlich müsste es unter beiden Systemen krachen wenn TempFont nicht definiert wurde.
GdipCheck(GdipMeasureString(Graphics, PWideChar(UseText), length(UseText), TempFont,
@layoutRect, strFormat, @boundingBox, nil, nil)); Liegt vielleicht doch an der GDIPlus. Das die 32Bit den Fehler ignoriert aber die 64Bit nicht. Na ja es läuft ja jetzt. gruss |
AW: Variablen nicht NIL 64Bit
Zitat:
Du weist der Variablen einen Wert zu, aber dieser Wert wird NACH dieser Code-Zeile niemals verwendet. Diese Zeile ist also prinzipiell überflüssig. Ob du vorher die Variable mit ihrem Inhlat verwendet hast oder nicht, spielt hier keine Geige. Es geht um diese Zuweisung und den Code danach. Dein Code könnte also so aussehen
Delphi-Quellcode:
und müsste jetzt 3 Warnungen weniger produzieren
var
Graphics: LONG_PTR; Fam: GpFontFamily; TempFont: GpFont; rb: TRect; xWidth, YHeight: Integer; strFormat: GPSTRINGFORMAT; boundingBox, layoutRect: TGPRectF; begin result := GenericError; strFormat := nil; Fam := nil; TempFont := nil; ..// hier kommt Warnung unter D2010 in Delphi 10.2.3 nicht. Deshalb war es vorher nicht addiert. // habe es aber jetzt trotzdem addiert und ignoriere die Warnung. Graphics := 0; try // ... schnipp ... schnapp ... finally if Graphics <> 0 then begin GdipCheck(GdipDeleteGraphics(Graphics)); //Graphics := 0; end; if Assigned(TempFont) then begin GdipCheck(GdipDeleteFont(TempFont)); // Und hier kracht es unter Win10 wenn TempFont mit irgendwas gefüllt wird. (In D2010 nicht! ) //TempFont := nil; end; if Assigned(Fam) then begin GdipCheck(GdipDeleteFontFamily(Fam)); //Fam := nil; end; end; end; |
AW: Variablen nicht NIL 64Bit
Zitat:
was steht hier
Delphi-Quellcode:
und was kommt dann?
GdipCheck(GdipMeasureString(Graphics, PWideChar(UseText), length(UseText), TempFont,
@layoutRect, strFormat, @boundingBox, nil, nil));
Delphi-Quellcode:
Das // ... schnipp ... schnapp ... hättest du besser mal nicht entfernt.
if Assigned(TempFont) then
begin GdipCheck(GdipDeleteFont(TempFont)); // Und hier kracht es unter Win10 wenn TempFont mit irgendwas gefüllt wird. (In D2010 nicht! ) TempFont := nil; end; Denn das ist die Zeile in der TmpFont verwendet wird. Du wolltest doch ein Beispiele warum verwendest du es dann nicht so wie gezeigt und wirfst den benötigten Part einfach raus. Sorry du bist einfach nur Lustig. Thema ist erledigt.. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:00 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