Wie war das? Eine Ableitung erbt alle Eigenschaften seines jeweiligen Vorgängers???
Mein Projekt hat mich zur Verzweiflung gebracht. Die zweite spezialisierte Ableitung eines Edits (die erste implementiert ein Databinding und die zweite soll in ein Gitter eingepasst werden) wurde einfach nicht angezeigt. !!!???
Zwar wurden Eingaben in die Datenschicht geschickt aber auf dem Bildschirm nichts angezeigt.
Dann habe ich das Problem immer weiter vereinfacht und festgestellt, dass der zweiten Ableitung keine StyleRessource mehr zugewiesen ist.
Delphi-Quellcode:
procedure TCustomEdit.ApplyStyle;
var
T: TFmxObject;
begin
inherited ApplyStyle;
if FInputSupport then
Cursor := crIBeam
else
Cursor := crDefault;
T := FindStyleResource('content'); // <--- StyleRessource verwenden
if Assigned(T) and (T is TControl) then
begin
FContent := TControl(T);
FContent.OnPaint := DoContentPaint;
end;
T := FindStyleResource('selection');
if Assigned(T) and (T is TBrushObject) then
begin
FSelectionFill.Assign(TBrushObject(T).Brush);
end;
{ from style }
T := FindStyleResource('foreground');
// apply the font fill style only if the user hasn't changed the font fill anteriorly
if (not FFontColorBeforeStyle) and Assigned(T) and (T is TBrushObject) then
FFontColor := TBrushObject(T).Brush.Color;
T := FindStyleResource('font');
if (not FFontBeforeStyle) and Assigned(T) and Supports(T, IFontObject) and not Font.IsSizeStored then
FFont.Assign((T as IFontObject).Font);
{ Container for store buttons}
T := FindStyleResource('buttons');
if Assigned(T) and (T is TControl) then
begin
FButtonsLayout := T as TControl;
RealignButtonsContainer;
end;
// now we are sure that if the user changed the font fill before style application,
// the correct information will be reflected; change the switches so that from now on
// we have the normal flow of style application
FStyleApplied := True;
FFontBeforeStyle := False;
FFontColorBeforeStyle := False;
end;
function TStyledControl.FindStyleResource(const AStyleLookup: string): TFmxObject;
begin
Result := nil;
if Assigned(FResourceLink) then // <-- ist bei TEdit und TEditA zugewiesen aber bei TEditB=NIL !!!???
Result := FResourceLink.FindStyleResource(AStyleLookup);
if Not Assigned(Result) then
Result := inherited FindStyleResource(AStyleLookup);
end;
Anbei ein kleines Demoprojekt für XE3 und hier mal der Quelltext:
Delphi-Quellcode:
unit fRessourceTest;
interface
uses
System.SysUtils, System.Types, System.Rtti, System.Classes,
System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Edit;
type
TForm1 =
class(TForm)
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
Panel2: TPanel;
Button3: TButton;
Panel3: TPanel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
uses
System.UITypes;
type
TEditA =
class(TEdit)
end;
TEditB =
class(TEditA)
end;
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
TEdit.Create(Self).Parent := Panel1;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
TEditA.Create(Self).Parent := Panel2;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
TEditB.Create(Self).Parent := Panel3;
end;
end.
Hat jemand eine Erklärung?
Kann jemand helfen?
Wie kann ich die "originale" Style-Ressource zuordnen?
So langsam wird mir FMX wirklich suspekt, wobei ich zwischendurch auch schon ein paar nette Dinge realisieren konnte (und auf dem Weg weiter voran kommen wollte).
Zwischenfazit:
- LiveBindings sind Schrott
- Styles sind für den Komponentenbau unzweckmäßig (für Füllmuster u.ä. ok aber nicht für funktionelle Bestandteile)
- sonst ist das Konzept (Win-Unabhängigkeit und freie Scalierbarkeit) aber schon vielversprechend