AGB  ·  Datenschutz  ·  Impressum  







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

Variablen nicht NIL 64Bit

Ein Thema von EWeiss · begonnen am 1. Sep 2018 · letzter Beitrag vom 12. Sep 2018
Antwort Antwort
Seite 2 von 4     12 34      
Schokohase
(Gast)

n/a Beiträge
 
#11

AW: Variablen nicht NIL 64Bit

  Alt 1. Sep 2018, 13:37
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:
[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
und jetzt mal so
Delphi-Quellcode:
procedure Test;
var
  SomeThing:TObject;
begin
  SomeThing := nil;
  if Assigned(SomeThing) then
    begin
      SomeThing.Free();
      SomeThing := nil;
    end;
end;
Code:
[dcc32 Hinweis] Project1.dpr(18): H2077 Auf 'SomeThing' zugewiesener Wert wird niemals benutzt
Wollen wir diese letzte Warnung auch noch wegbekommen?
Delphi-Quellcode:
procedure Test;
var
  SomeThing:TObject;
begin
  SomeThing := nil;
  if Assigned(SomeThing) then
    begin
      SomeThing.Free();
      SomeThing := nil;
    end;

  FreeAndNil( SomeThing );
end;
Bitteschön.

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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

AW: Variablen nicht NIL 64Bit

  Alt 1. Sep 2018, 13:42
Zitat:
Jetzt die Preisfrage: Warum ist das so (und vor allem ist das unter Delphi 10.2.3 so völlig korrekt)
Die Antwort:
TempFont := Nil steht in der ersten Zeile..
Aber ihr scheint es nicht zu verstehen.

Delphi-Quellcode:
var
   TempFont: GpFont;
//..
begin
     TempFont := nil;

     if Assigned(TempFont) then
     begin
       GdipCheck(GdipDeleteFont(TempFont)); // Lösche das Font Object
       TempFont := nil;
     end;

end;
Oder kannst du sehen das irgendwo ein Try final block oder ähnliches steht was die Warnung berechtigter weise ausgibt?
Zitat:
Delphi 10.2.3 so völlig korrekt
NÖ weil sie unter Delphi2010 ausgespuckt wird und nicht unter Delphi 10.2.3..

Zitat:
Jetzt die Preisfrage:
Brauchst du eine Brille oder liest du meine Beiträge nicht!
Zitat:
Wer es weiß, darf sich ein Bonbon nehmen.
Du dir zwei wenn du meine Beiträge mal vorher lesen würdest.

Zudem TempFont wird weiter unten im Code noch verwendet habe den Teil nur nicht addiert. bzw.. zwischen TempFont := Nil und Asssign

gruss

Geändert von EWeiss ( 1. Sep 2018 um 13:51 Uhr)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#13

AW: Variablen nicht NIL 64Bit

  Alt 1. Sep 2018, 13:47
Da du offensichtlich die Hinweise nicht korrekt deuten kannst hier eine kleine Hilfestellung.

Delphi-Quellcode:
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;
Ich habe den Hinweistext unter die betreffende Codezeile eingefügt.

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;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#14

AW: Variablen nicht NIL 64Bit

  Alt 1. Sep 2018, 13:48
lies mein Edit!

gruss

Geändert von EWeiss ( 1. Sep 2018 um 13:52 Uhr)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#15

AW: Variablen nicht NIL 64Bit

  Alt 1. Sep 2018, 13:51
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#16

AW: Variablen nicht NIL 64Bit

  Alt 1. Sep 2018, 13:57
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.
Nicht schon wieder mit deinen Beispielen das hatten wir schon, aber gut..

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;

Geändert von EWeiss ( 1. Sep 2018 um 14:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#17

AW: Variablen nicht NIL 64Bit

  Alt 1. Sep 2018, 14:08
NÖ weil sie unter Delphi2010 ausgespuckt wird und nicht unter Delphi 10.2.3..
Dann compilierst du was anderes oder mehr als hier gezeigt.

Ich habe mal die nötigen GDI+ Deklarationen extrahiert, da es die unter D2010 im Standard noch nicht gibt. Dieses Programm
Delphi-Quellcode:
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.
gibt sowohl unter D2010 als auch unter Delphi 10.2.3 nur einen Hinweis
Zitat:
H2077 Auf 'TempFont' zugewiesener Wert wird niemals benutzt
für die zweite Zuweisung von TempFont innerhalb des if-then-Blocks aus. Die erste Zuweisung auf nil wird nicht bemängelt. Die beiden Compiler arbeiten in diesem Fall also identisch und auch korrekt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#18

AW: Variablen nicht NIL 64Bit

  Alt 1. Sep 2018, 14:12
Zitat:
Die beiden Compiler arbeiten in diesem Fall also identisch und auch korrekt.
Das ist ja was mich stutzig macht und warum bei mir so seltsame dinge auftreten.. keine Ahnung was da bei mir los ist.
Eigentlich dürfte diese Warnung nicht auftreten.

Ich lasse es jetzt drin stört nicht weiter.

Danke für den Test!

Delphi-Quellcode:
  if Assigned(TempFont) then begin
     GdipDeleteFont(TempFont);
     TempFont := nil; // H2077 Auf 'TempFont' zugewiesener Wert wird niemals benutzt
   end;
Ist logisch weil du den Font vorher nicht verwendest.
Aber Ich. Siehe!
Assigned(TempFont) steht ja erst hinter dieser zeile

Delphi-Quellcode:
        GdipCheck(GdipMeasureString(Graphics, PWideChar(UseText), length(UseText), TempFont,
             @layoutRect, strFormat, @boundingBox, nil, nil));
Eigentlich müsste es unter beiden Systemen krachen wenn TempFont nicht definiert wurde.
Liegt vielleicht doch an der GDIPlus. Das die 32Bit den Fehler ignoriert aber die 64Bit nicht.
Na ja es läuft ja jetzt.

gruss

Geändert von EWeiss ( 1. Sep 2018 um 14:36 Uhr)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#19

AW: Variablen nicht NIL 64Bit

  Alt 1. Sep 2018, 14:51

Delphi-Quellcode:
  if Assigned(TempFont) then begin
     GdipDeleteFont(TempFont);
     TempFont := nil; // H2077 Auf 'TempFont' zugewiesener Wert wird niemals mehr benutzt
   end;
Ist logisch weil du den Font vorher nicht verwendest.
Aber Ich. Siehe!
Du hast den Sinn der Warnung immer noch nicht verstanden.

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:
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;
und müsste jetzt 3 Warnungen weniger produzieren

Geändert von Schokohase ( 1. Sep 2018 um 14:55 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#20

AW: Variablen nicht NIL 64Bit

  Alt 1. Sep 2018, 14:57
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.
siehe mein code vielleicht verstehst du es dann.

was steht hier
Delphi-Quellcode:
        GdipCheck(GdipMeasureString(Graphics, PWideChar(UseText), length(UseText), TempFont,
             @layoutRect, strFormat, @boundingBox, nil, nil));
und was kommt dann?

Delphi-Quellcode:
     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;
Das // ... schnipp ... schnapp ... hättest du besser mal nicht entfernt.
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

Geändert von EWeiss ( 1. Sep 2018 um 15:05 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 10:18 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