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 3 von 4     123 4      
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#21

AW: Variablen nicht NIL 64Bit

  Alt 3. Sep 2018, 09:57
Ich bin mir ziemlich sicher, dass das "schnipp schnapp" nur dazu diente, Teile vom Code in denen er nichts geändert hat nicht unnötig nochmals zu posten um den Abschnitt klein und übersichtlich zu halten. Ob da etwas steht oder nicht macht für den genannten Weg hin zur "Compilerhinweis-Freiheit" nämlich keinen Unterschied. Manchmal frage ich mich, warum du überhaupt Fragen stellst, wenn du am Ende eh nicht wirklich Hilfe annimmst und (meist fälschlicherweise) meinst es wäre doch eh von Anfang an alles richtig bei dir. Komisches Verhalten um ehrlich zu sein. Auch nicht lustig.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Variablen nicht NIL 64Bit

  Alt 3. Sep 2018, 13:20
Ich hab mal an die entsprechenden Stellen Kommentare gepackt und sie mit SG markiert.

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.

                     // SG: Einige Hinweise in Bezug auf nicht initialisierte Variablen oder nicht benutzte Werte
                     // wurden erst jüngst in 10.1 oder 10.2 gefixt, siehe Changelogs/fixed issues, daher fälschlicherweise Hinweis unter Delphi 2010
  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 // SG: Dieser Code kann ausgeführt werden wenn z.B. oben if Assigned(Fam) false lieferte.
                               // Dann wird TempFont nämlich nicht durch GdipCreateFont gesetzt und ist somit nicht initialisiert
                               // Da nun aber auf dem Stack unter 32bit "immer" nil stand, hat man hier Glück gehabt
    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;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#23

AW: Variablen nicht NIL 64Bit

  Alt 3. Sep 2018, 13:57
Zitat:
// SG: Einige Hinweise in Bezug auf nicht initialisierte Variablen oder nicht benutzte Werte
// wurden erst jüngst in 10.1 oder 10.2 gefixt, siehe Changelogs/fixed issues, daher fälschlicherweise Hinweis unter Delphi 2010
Und genau das war mein Problem weshalb ich TempFont := nil; vorher nicht selbst definiert und auf NIL gesetzt habe.
Das haben aber einige Leute hier nicht verstanden und haben versucht mir was zu erklären was mir selbst vorher schon klar war.
Deshalb habe ich auf diese Beiträge auch nicht mehr bzw. patzig geantwortet.

Durch das setzen von NIL ist ja nun alles geklärt und das Thema erledigt.
Auch wenn D2010 mir immer noch falsche Hinweise ausgibt.. sei's drum.
Man baut sich solche unnötigen Fehler selbst ein weil man sich auf den Compiler und seinen Warnungen verlässt
stimmen diese nicht nun dann kracht es wie hier geschehen.

@Stevie Danke du hast mich verstanden und nicht versucht mich zu belehren.

PS:
Zitat:
Manchmal frage ich mich, warum du überhaupt Fragen stellst, wenn du am Ende eh nicht wirklich Hilfe annimmst und (meist fälschlicherweise) meinst es wäre doch eh von Anfang an alles richtig bei dir. Komisches Verhalten um ehrlich zu sein. Auch nicht lustig.
Vielleicht liegt es ganz einfach daran das ihr meine Beiträge nur überfliegt und nicht lest was dort steht.
Ich habe von Anfang an deutlich darauf hingewiesen!
Zitat:
In D2010 bekomme ich dann aber eine Warnung.. Variable wird nicht verwendet.
Die ganzen Seitenlangen Belehrungen wie oder warum eine Variable nicht initialisiert wird hättet ihr euch sparen können das ist und war mir vorher schon bekannt.
Es hatte unter 32Bit keinerlei Auswirkung nachdem ich diese auf Grund der Warnung entfernt hatte, hingegen unter 64Bit schon.

gruss

Geändert von EWeiss ( 3. Sep 2018 um 14:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#24

AW: Variablen nicht NIL 64Bit

  Alt 3. Sep 2018, 15:18
[OT]
@Emil,

Du musst die Beiträge einfach nicht als Angriff gegen Dich auffassen.
Wir versuchen, uns hier gegenseitig zu helfen.
Kann sein, dass man sich nicht immer komplett versteht, dann kann man versuchen, das auszuräumen.
Dennoch ist eine gut gemeinte Antwort eine nette Sache, auch wenn sie nicht zum Erfolg führt oder gar die Frage gar nicht beantwortet.

Ich hatte mir Deine Beiträge auch gerade durchgelesen, um evtl. helfen zu können. Deine Antworten machten es nicht einfacher, das Problem nachzuvollziehen.

Offensichtlich hat es Stevie ja jetzt aufklären können.

ME sollte aber das letzte "TempFont := nil;" einen Hinweis erzeugen, dass die Variable nicht mehr genutzt wird. Vielleicht ist das aber auch in verschiedenen Delphiversionen unterschiedlich...

@all:
Lässt sich dieser Hinweis eigentlich abschalten? Ich würde manchmal eine solche abschließende Zuweisung der Übersichtlichkeit halber gern vornehmen. Um keine Compiler-Hinweise zu erhalten schmeiße ich die dann aber doch raus.

[/OT]
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#25

AW: Variablen nicht NIL 64Bit

  Alt 3. Sep 2018, 15:25
Zitat:
Du musst die Beiträge einfach nicht als Angriff gegen Dich auffassen.
Wir versuchen, uns hier gegenseitig zu helfen.
Kann sein, dass man sich nicht immer komplett versteht, dann kann man versuchen, das auszuräumen.
Dennoch ist eine gut gemeinte Antwort eine nette Sache, auch wenn sie nicht zum Erfolg führt oder gar die Frage gar nicht beantwortet.
Du hast recht.. Danke.
Zitat:
ME sollte aber das letzte "TempFont := nil;" einen Hinweis erzeugen, dass die Variable nicht mehr genutzt wird.
Keine Ahnung was da schief läuft werde mal neu Installieren.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

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

AW: Variablen nicht NIL 64Bit

  Alt 3. Sep 2018, 15:38
Lässt sich dieser Hinweis eigentlich abschalten? Ich würde manchmal eine solche abschließende Zuweisung der Übersichtlichkeit halber gern vornehmen. Um keine Compiler-Hinweise zu erhalten schmeiße ich die dann aber doch raus.
Einzelne Hints lassen sich nicht abschalten (im Gegensatz zu Warnings) - man kann sie nur komplett aus oder an schalten.

ME sollte aber das letzte "TempFont := nil;" einen Hinweis erzeugen, dass die Variable nicht mehr genutzt wird. Vielleicht ist das aber auch in verschiedenen Delphiversionen unterschiedlich...
Wie schon gesagt, ist die Flow Analyse in einigen älteren Versionen noch etwas fehlerhaft, so dass manchmal Hints auftauchen, wo sie es nicht sollten und umgekehrt. Gerade, was Benutzung in try/finally oder excepts oder if statements angeht.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  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
 
#27

AW: Variablen nicht NIL 64Bit

  Alt 3. Sep 2018, 15:51
Lässt sich dieser Hinweis eigentlich abschalten? Ich würde manchmal eine solche abschließende Zuweisung der Übersichtlichkeit halber gern vornehmen. Um keine Compiler-Hinweise zu erhalten schmeiße ich die dann aber doch raus.
Wie Stevie schon sagte, kann man einzelne Hinweise global nicht abschalten. Allerdings kannst du die betreffende Zuweisung ausklammern (Hinweise (Delphi)):
Delphi-Quellcode:
{$HINTS OFF}
TempFont := nil;
{$HINTS ON}
Ob das nun allerdings der Lesbarkeit förderlich ist sei mal dahingestellt.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#28

AW: Variablen nicht NIL 64Bit

  Alt 3. Sep 2018, 15:58
Es ist ja eine Warnung kein Hint (Hinweis)

gruss
  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
 
#29

AW: Variablen nicht NIL 64Bit

  Alt 3. Sep 2018, 16:07
Es ist ja eine Warnung kein Hint (Hinweis)
TempFont := nil; // H2077 Auf 'TempFont' zugewiesener Wert wird niemals benutzt

H2077 ist ein Hinweis. Warnungen haben W-Nummern. Siehe auch hier:
Zitat:
[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
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#30

AW: Variablen nicht NIL 64Bit

  Alt 3. Sep 2018, 16:24
OK sorry

gruss

Geändert von EWeiss ( 4. Sep 2018 um 01:02 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


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 03:49 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