Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   iOS Layout.AddAttributes Fehler oder Feature? (https://www.delphipraxis.net/177791-layout-addattributes-fehler-oder-feature.html)

Mavarik 27. Nov 2013 18:37

Layout.AddAttributes Fehler oder Feature?
 
Hallo Zusammen!

Wir mal was neues...

gegeben sei folgende Funktion:

Delphi-Quellcode:
  Procedure DP(Var AFont : TFont;Var ALayout:TTextLayout);
  begin
    ALayout.ClearAttributes;
    AFont.Size  := 12;
    ALayout.AddAttribute(TTextRange.Create(10,20),TTextAttribute.Create(AFont,TAlphaColorRec.Black));
    AFont.Size  := 22;
    ALayout.AddAttribute(TTextRange.Create(40,60),TTextAttribute.Create(AFont,TAlphaColorRec.Black));
  end;
Funktioniert das? Nein... Warum nicht? Weil der Font-Teil keine Klasse ist, sondern in einen Record kopiert wird.
Somit werden beide Bereiche mit Font.Size = 22 gerändert.

Noch besser finde ich jedoch:

Delphi-Quellcode:
  Procedure DP(Var AFont : TFont;Var ALayout:TTextLayout);
  Var LP : TFont;
  begin
    ALayout.ClearAttributes;
    AFont.Size  := 12;
    LP := TFont.Create;
    LP.Assign(AFont);
    ALayout.AddAttribute(TTextRange.Create(10,20),TTextAttribute.Create(LP,TAlphaColorRec.Black));
    AFont.Size  := 22;
    LP := TFont.Create;
    LP.Assign(AFont);
    ALayout.AddAttribute(TTextRange.Create(40,60),TTextAttribute.Create(LP,TAlphaColorRec.Black));
  end;
Da der Layout.EndUpdate außerhalb des Procedure Scope ist hat ARC die TFonts gekillt und es gibt eine nette Exception!

Ich finde das ist ein Designfehler!

Mavarik

daywalker9 27. Nov 2013 19:03

AW: Layout.AddAttributes Fehler oder Feature?
 
Solltest Du nicht bei deinem zweiten Code LP anstatt Font übergeben an TTextAttribute.Create?

Mavarik 28. Nov 2013 06:25

AW: Layout.AddAttributes Fehler oder Feature?
 
Zitat:

Zitat von daywalker9 (Beitrag 1237681)
Solltest Du nicht bei deinem zweiten Code LP anstatt Font übergeben an TTextAttribute.Create?

Geändert... Hatte ich falsch rein kopiert... Aber es sieht danach aus, dass es nicht "nur" daran liegt.

Daniel 28. Nov 2013 07:40

AW: Layout.AddAttributes Fehler oder Feature?
 
Der Typ
Delphi-Quellcode:
TTextAttribute
arbeitet mit Referenzen auf die Fonts - es wird eben gerade nichts kopiert. Das erklärt das Verhalten Deines ersten Beispiels. Dieses Record ist nicht mehr als ein Container, der Attribute sammelt. Es mag bestimmt Fälle geben, in denen eine echte Kopie der Daten wünschenswert wäre, aber das Arbeiten mit Referenzen halte ich nicht für an den Haaren herbeigezogen oder für einen Designfehler.

Den zweiten Fall kann ich nicht nachvollzihen- hast Du mal ein komplettes Beispiel, das den Fehler demonstriert.
Delphi-Quellcode:
TTextAttribute
hält ja immerhin eine starke Referenz auf den Font, so dass ARC an dieser Stelle nicht zuschlagen dürfte.


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