Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   EllipsisCharacter funktioniert nicht (https://www.delphipraxis.net/191732-ellipsischaracter-funktioniert-nicht.html)

Zacherl 21. Feb 2017 23:43

AW: EllipsisCharacter funktioniert nicht
 
Zitat:

Zitat von EWeiss (Beitrag 1362289)
mit begin.. end else oder mit try.. finally arbeite ist gehüpft wie gesprungen.
Ich sehe keine Bereicherung bei dieser Verwendung.

Schau dir nochmal das Beispiel aus meinem Edit an, vielleicht wird dann klarer was ich meine.

Konkret hat try..finally für dich in deinem Codebeispiel die folgenden Vorteile:
  1. Die Tiefe deiner Verschachtelung nimmt nicht pro Objekt/Handle um eine Ebene zu
  2. Du hast keine redundanten Finalisierungen

Klar kannst du es auch ohne try..finally hinbekommen, dass deine Objekte nur finalisiert werden, wenn sie zuvor auch korrekt initialisiert wurden, aber dann landest du zwangsweise bei Variante 1 oder 2 meines "C" Negativbeispiels.

Edit:
Zitat:

Zitat von EWeiss (Beitrag 1362289)
Andererseits prüfe ich nie auf Nil..
Sondern auf bsp.
Delphi-Quellcode:
if Assigned(Fam) then

Zitat:

Zitat von EWeiss (Beitrag 1362289)
Zitat:

Die Exception-Hilfsfunktion ist hierbei natürlich optional
Es ist Gewohnheit die Bedingungen direkt ohne Umwege zu prüfen. (Sehe da kein Manko in irgendeiner weise).

Beides vollkommen legitim :) Der Springende Punkt ist eher, dass mit deiner Überprüfung ein neuer Block (und damit eine neue Verschachtelungs-Ebene) einhergeht, während bei der try..finally Variante lediglich ein
Delphi-Quellcode:
Exit
bzw. ein
Delphi-Quellcode:
raise
folgen muss.

EWeiss 21. Feb 2017 23:54

AW: EllipsisCharacter funktioniert nicht
 
Zitat:

Der Springende Punkt ist eher, dass mit deiner Überprüfung ein neuer Block (und damit eine neue Verschachtelungs-Ebene) einhergeht, während bei der try..finally Variante lediglich ein Exit bzw. ein raise folgen muss.
Wo ist in dem Fall denn das Problem ?
Wird der Code Langsamer ? oder was sonst.
Im Moment sehe ich nur das ich vielleicht ein paar Zeilen mehr schreiben muss wobei das Ergebnis das gleiche ist.
Mir erschließt sich das nicht so richtig.

So wie ich hier im Forum sehe verwenden viele meine Variante über Verschachtelungen.

EDIT:
Zitat:

2.Du hast keine redundanten Finalisierungen
Das heißt ich muss nicht auf NIL prüfen ?
Dann wäre es sicherlich eine Bereicherung.

gruss

Zacherl 22. Feb 2017 00:02

AW: EllipsisCharacter funktioniert nicht
 
Zitat:

Zitat von EWeiss (Beitrag 1362291)
Wird der Code Langsamer ? oder was sonst.
Im Moment sehe ich nur das ich vielleicht ein paar Zeilen mehr schreiben muss wobei das Ergebnis das gleiche ist.

Nein, langsamer wird der Code nicht. Es hat einfach kosmetische Gründe, die auf ein paar Grundprinzipien der Programmierung zurückzuführen sind. Redundanzen sind immer schlecht, da sollten wir uns einig sein, da sie die Wartbarkeit von Code einfach nur unnötig verkomplizieren. Verschachtelungen sind nicht grundlegend verkehrt, bloß wird der Code ab einer gewissen Tiefe dadurch einfach extrem schwer zu lesen (und man hat dank konstanter Einrückung irgendwann nur noch 10 Zeichen pro Zeile zur Verfügung :stupid:).

Zacherl 22. Feb 2017 00:03

AW: EllipsisCharacter funktioniert nicht
 
Zitat:

Zitat von EWeiss (Beitrag 1362291)
Zitat:

2.Du hast keine redundanten Finalisierungen
Das heißt ich muss nicht auf NIL prüfen ?
Dann wäre es sicherlich eine Bereicherung.

Nein, das war nicht gemeint, aber du sparst dir diesen Teil
Delphi-Quellcode:
  GdipDeleteGraphics(Graphics);
  GdipDeleteFont(TempFont);
  GdipDeleteFontFamily(Fam);
  GdipDeleteStringFormat(strFormat);
zweimal zu schreiben.

EWeiss 22. Feb 2017 00:07

AW: EllipsisCharacter funktioniert nicht
 
Zitat:

Zitat von Zacherl (Beitrag 1362293)
Zitat:

Zitat von EWeiss (Beitrag 1362291)
Zitat:

2.Du hast keine redundanten Finalisierungen
Das heißt ich muss nicht auf NIL prüfen ?
Dann wäre es sicherlich eine Bereicherung.

Nein, das war nicht gemeint, aber du sparst dir diesen Teil
Delphi-Quellcode:
  GdipDeleteGraphics(Graphics);
  GdipDeleteFont(TempFont);
  GdipDeleteFontFamily(Fam);
  GdipDeleteStringFormat(strFormat);
zweimal zu schreiben.

JA das habe ich gerade bemerkt.. (und das Exit; )
Ok das ist ein Grund für mich diesen Block bei bestimmten Konstellationen zu verwenden.

Danke! :)

gruss

EWeiss 22. Feb 2017 00:32

AW: EllipsisCharacter funktioniert nicht
 
Ok habe es geändert und auch deine Exception Funktion mit eingebunden. ;)

Delphi-Quellcode:
function TSkinListView.DrawEllipsisText(DC: Hdc; UseText: WideString; rec: TRect;
  ColrARGB: COLORREF; UseFont: WideString; UseSize: Single; FontStyle: TFontStyle;
  ShadowOffset: Single; UseStrFormat: Integer; WordWrap: Bool = False): GpStatus;
var
  Width: Integer;
  Fam: GpFontFamily;
  TempFont: GpFont;
  Graphics: Cardinal;
  rectF: TGPRectF;
  Rect, rc, rc2: TRect;
  strFormat: Pointer;
begin

  Result := GenericError;

  Graphics := 0;
  strFormat := nil;
  TempFont := nil;
  Fam := nil;

  try
    GdipCheck(GdipCreateFromHDC(DC, Graphics));
    GdipCheck(GdipCreateFontFamilyFromName(UseFont, nil, Fam));
    if assigned(Fam) then
    begin
      GdipCheck(GdipCreateFont(Fam, UseSize, FontStyle, 2, TempFont));
      if assigned(TempFont) then
      begin
        GdipCheck(GdipCreateStringFormat(0, 0, strFormat));
        GdipCheck(GdipMeasureString(Graphics, UseText, length(UseText), TempFont, @layoutRect, strFormat,
            @boundingBox, nil, nil));

        GetWindowRect(HeaderHandle, rc);
        GetWindowRect(Handle, rc2);

        Width := (rec.Right - rec.Left) + ((rc.Left - rc2.Left) - 1);
        if boundingBox.Width > Width then
        begin
          rectF := MakeRect(rec.Left, rec.Top, Width, rec.Bottom);
          Rect.Left := round(rectF.x);
          Rect.Top := round(rectF.y);
          Rect.Bottom := round(rectF.Height);
          Rect.Right := round(rectF.Width);

          UseStrFormat := ZD_Ellipsis;
          Result := DrawTextToDC(DC, UseText, Rect, ColrARGB, UseFont, UseSize, FontStyle, ShadowOffset,
            UseStrFormat, True);
        end
        else
        Result := DrawTextToDC(DC, UseText, rec, ColrARGB, UseFont, UseSize, FontStyle, ShadowOffset,
          UseStrFormat, WordWrap);
        end;
    end;
  finally
    if Graphics <> 0 then
      GdipCheck(GdipDeleteGraphics(Graphics));
    if assigned(TempFont) then
      GdipCheck(GdipDeleteFont(TempFont));
    if assigned(Fam) then
      GdipCheck(GdipDeleteFontFamily(Fam));
    if assigned(strFormat) then
      GdipCheck(GdipDeleteStringFormat(strFormat));
  end;

end;
Ich kann mir jetzt auch noch so etwas sparen.

Delphi-Quellcode:
      if GdipDrawString(Graphics, PWideChar(sTxt), -1, curFont, @rcLayout, strFormat, brush)
        = OK then
        // Resourcen freigeben
        GdipDeleteBrush(brush)
      else
      begin
        GdipDeleteBrush(brush);
        exit;
      end;
Delphi-Quellcode:
      try
        GdipCheck(GdipDrawString(Graphics, PWideChar(sTxt), -1, curFont, @rcLayout, strFormat, brush))
      finally
        // Resourcen freigeben
        if Assigned(brush) then
          GdipCheck(GdipDeleteBrush(brush));
      end;
Von daher ;)
Na ja lohnt sich doch nehme alles zurück.
Bei mir muss das schon einen sinn ergeben einfach etwas zu übernehmen weil es jemand sagt ist nicht so mein Ding :)
Man muss es auch verstehen.

gruss

Luckie 22. Feb 2017 01:07

AW: EllipsisCharacter funktioniert nicht
 
Wo bitte habe ich dich als dumm bezeichnet? Ich habe dir nur versucht zu erklären, dass das pauschale Ablehnen eines Sprachkonstrukts eventuell auf Unwissenheit zurück zu führen ist. Aber mittlerweile wurde dir ja sehr gut mit Beispielen die Nützlichkeit gezeigt.

EWeiss 22. Feb 2017 02:15

AW: EllipsisCharacter funktioniert nicht
 
Zitat:

Zitat von Luckie (Beitrag 1362296)
Wo bitte habe ich dich als dumm bezeichnet? Ich habe dir nur versucht zu erklären, dass das pauschale Ablehnen eines Sprachkonstrukts eventuell auf Unwissenheit zurück zu führen ist.

Unwissenheit <> Dumm ;)
Bau mir jetzt den Kompletten Code um.. Dauert ein paar Stunden. Aber auf der Basis lohnt sich das.
Kein Problem :cheers:

Zitat:

Aber mittlerweile wurde dir ja sehr gut mit Beispielen die Nützlichkeit gezeigt.
Da ist was dran.. Danke nochmal dafür.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 Uhr.
Seite 2 von 2     12   

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