Autor Téma: zoufalství nad TStyledControl  (Přečteno 2560 krát)

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 12
    • Verze Delphi: D5, XE2
zoufalství nad TStyledControl
« kdy: 21-02-2014, 10:25:44 »
Zdravím vespolek.
Líbí se mi nápad s Firemonkey styly a tak se pokouším o tvorbu vlastní stylovatelné komponenty, ale místo produktivní práce narážím na jeden problém za druhým. Momentálně mě deptá defaultní styl komponenty a jeho editace. Vytvořím potomka TStyledControl a všechno jakžtakž funguje, ale když pak komponentu umístím na formulář klepnu na ni pravým tlačítkem a dám "Edit custom style", kromě vytvoření StyleBooku na formu se nestane vůbec nic. Při volbě "Edit default style" to sice načte defaultní styl a můžu ho i editovat, ale pokud ručně nevyplním název stylu do property StyleLookup, upravený styl se nepoužije. Když už jednou načtu default style, pak funguje i "Edit custom style". Jedná se o další z nezčetných bugů, nebo je v tom nějaký chyták, na který jsem zatím nepřišel?

Udělal jsem na pokus úplně holou komponentu jako potomka TTextControl a styl jsem přesně okopíroval ze zdrojáků FMX (použil jsem "buttonstyle") a chová se to stejně.
Mám "prastarou" verzi Delphi XE2 Update 4

Pokuston.pas
Kód: Delphi [Vybrat]
  1. unit Pokus;
  2.  
  3. interface
  4.  
  5. uses
  6.   System.SysUtils, System.Classes, System.Types, FMX.Types;
  7.  
  8. type
  9.   TPokuston = class(TTextControl)
  10.   private
  11.     FNeco : Boolean;
  12.     { Private declarations }
  13.   protected
  14.     { Protected declarations }
  15.     function GetStyleObject : TControl; override;
  16.   public
  17.     { Public declarations }
  18.   published
  19.     { Published declarations }
  20.     property Neco : Boolean read FNeco write FNeco;
  21.   end;
  22.  
  23.   {$IFDEF MSWINDOWS}
  24.   {$R *.win.res}
  25.   {$ENDIF}
  26.  
  27. procedure Register;
  28.  
  29. implementation
  30.  
  31. procedure Register;
  32. begin
  33.   RegisterComponents('Pokus', [TPokuston]);
  34. end;
  35.  
  36. { TPokuston }
  37.  
  38. function TPokuston.GetStyleObject: TControl;
  39. var
  40.   S: TResourceStream;
  41. const
  42.   Style = 'PokustonStyle';
  43. begin
  44.   if (FStyleLookup = '') then
  45.   begin
  46.     if FindRCData(HInstance, Style) then
  47.     begin
  48.       S := TResourceStream.Create(HInstance, Style, RT_RCDATA);
  49.       try
  50.         Result := TControl(CreateObjectFromStream(nil, S));
  51.         Exit;
  52.       finally
  53.         S.Free;
  54.       end;
  55.     end;
  56.   end;
  57.   Result := inherited GetStyleObject;
  58. end;
  59.  
  60. end.

Pokuston.win.rc
Kód: Delphi [Vybrat]
  1. PokustonStyle RCDATA "Pokuston_win.style"

Pokuston_win.style  (okopírováno z 'Redist\Styles\Fmx\Windows7.Style')
Kód: Delphi [Vybrat]
  1. object _1: TLayout
  2.   object TLayout
  3.     StyleName = 'PokustonStyle'
  4.     DesignVisible = False   <---- tohle tady moc nechápu
  5.     Position.Point = '(367,389)'    <---- tohle nechápu už vůbec, ve výsledku to "offsetne" pozici komponenty na formuláři, ale budiž
  6.     Width = 91.000000000000000000
  7.     Height = 24.000000000000000000
  8.     object TRectangle
  9.       StyleName = 'background'
  10.       Align = alContents
  11.       Width = 91.000000000000000000
  12.       Height = 24.000000000000000000
  13.       HitTest = False
  14.       Fill.Color = xFFEFEFEF
  15.       Stroke.Kind = bkNone
  16.       XRadius = 3.000000000000000000
  17.       YRadius = 3.000000000000000000
  18.       object TRectangle
  19.         Align = alContents
  20.         Width = 91.000000000000000000
  21.         Height = 24.000000000000000000
  22.         HitTest = False
  23.         Fill.Kind = bkGradient
  24.         Fill.Gradient.Points = <
  25.           item
  26.             Color = x24F4F4F4
  27.           end
  28.           item
  29.             Color = x24EAEAEA
  30.             Offset = 0.499000012874603300
  31.           end
  32.           item
  33.             Color = x4E868686
  34.             Offset = 0.500000000000000000
  35.           end>
  36.         Stroke.Color = xC84F4F4F
  37.         XRadius = 3.000000000000000000
  38.         YRadius = 3.000000000000000000
  39.       end
  40.       object TColorAnimation
  41.         Duration = 0.200000002980232200
  42.         Trigger = 'IsMouseOver=true'
  43.         StartValue = xFFEFEFEF
  44.         StopValue = xFFA5D9FF
  45.         PropertyName = 'Fill.Color'
  46.       end
  47.       object TColorAnimation
  48.         Duration = 0.200000002980232200
  49.         Trigger = 'IsMouseOver=false'
  50.         StartValue = xFFA5D9FF
  51.         StopValue = xFFEFEFEF
  52.         PropertyName = 'Fill.Color'
  53.       end
  54.       object TInnerGlowEffect
  55.         Trigger = 'IsPressed=true'
  56.         Enabled = False
  57.         Softness = 0.400000005960464400
  58.         GlowColor = xFF4F4848
  59.         Opacity = 0.899999976158142100
  60.       end
  61.       object TRectangle
  62.         Align = alClient
  63.         Position.Point = '(1,1)'
  64.         Locked = True
  65.         Width = 89.000000000000000000
  66.         Height = 22.000000000000000000
  67.         Padding.Rect = '(1,1,1,1)'
  68.         HitTest = False
  69.         Fill.Kind = bkNone
  70.         Stroke.Color = x96FCFCFC
  71.         XRadius = 2.000000000000000000
  72.         YRadius = 2.000000000000000000
  73.       end
  74.     end
  75.     object TText
  76.       StyleName = 'text'
  77.       Align = alClient
  78.       Position.Point = '(5,3)'
  79.       Locked = True
  80.       Width = 81.000000000000000000
  81.       Height = 18.000000000000000000
  82.       Padding.Rect = '(5,3,5,3)'
  83.       HitTest = False
  84.       Text = 'button'
  85.     end
  86.     object TGlowEffect
  87.       Trigger = 'IsFocused=true'
  88.       Enabled = False
  89.       Softness = 0.200000002980232200
  90.       GlowColor = x82005ACC
  91.       Opacity = 0.899999976158142100
  92.     end
  93.   end
  94. end
nil

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 459
  • Karma: 20
    • Verze Delphi: D2007, XE3
Re:zoufalství nad TStyledControl
« Odpověď #1 kdy: 25-02-2014, 06:39:11 »
No ja s firemonkey zatial moc nerobim, len tak jednym okom sledujem dianie okolo FM, pretoze koncept ako taky sa mi velmi paci. Ale co som tak cital tak prve verzie FM boli fakt neskutocne problematicke a ja by som v XE2 uricite neprodukoval ziadnu aplikaciu zalozenu na FM. Velky pokrok ohladom FM bol tusim urobeny v XE4. A aj tak je dobre sa poohliadnut po co najnovsej verzii, pretoze myslim ze uplne zahojena nebude ani ta posledna verzia v XE5, ale oproti XE2 sa to uz neda ani porovnat.

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 262
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:zoufalství nad TStyledControl
« Odpověď #2 kdy: 25-02-2014, 16:13:29 »
Bohužel jako nadšenec-samouk nemám na to, abych si za €1000 koupil bug-fixy k tomuhle šmejdu. Obchodní model společnosti Embarcadero je prostě psycho. Jediné pozitivum je, že i když oprava chyb z jedné verze může přijít až o několik verzí později (můj bug report z XE2 vyřešili "už" v XE4), ve skutečnosti je čekání pouze několik měsíců...od loňska už stihli tři full releasy, pokud se nepletu.

Zatím jsem se hrabal převážně jen ve Firemonkey, tak doufám, že až se podívám na VCL, tak najdu vyleštěný drahokam, abych si spravil chuť ;)
nil

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2329
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:zoufalství nad TStyledControl
« Odpověď #3 kdy: 25-02-2014, 22:01:17 »
Problem je v tom, ze v XE2 byla Firemonkey jen trochu predelana  puvodni koupena knihovna - kterou ale hodne lidi pouzivalo (tu knihovnu).  Zasadni zmeny jsou az v pozdejsich verzich. To jen tak na vysvetlenou.
Embarcadero MVP - Czech republic