Ich habe noch ein wenig probiert und noch ein paar Punkte herausbekommen - aber keine Lösung gefunden.
Wenn ich aus meinem Framework heraus ein Control neu zeichnen lasse wird bis zum Formular hoch das entsprechende Rect als ungültig deklariert.
Allerdings erreiche ich eine wirkliche Neuzeichnung des Formulars erst durch eine Größenänderung des Formulars.
Im Formular reicht ein Timer, der ein Invalidate ausführt.
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Invalidate;
end;
In meinem Framework ermittle ich das korrekte Form, kann aber kein Neuzeichnen veranlassen.
Mit EndUpdate und ReCreate klappt das aber das Formular wird kurz ausgeblendet und neu gezeichnet.
Delphi-Quellcode:
procedure TssfCtrl.RefreshControl(Control: TControl);
var
P: TFmxObject;
begin
if not Assigned(Control) then
Exit;
// Control.BeginUpdate;
// Control.Repaint;
// Control.EndUpdate;
// Exit;
P := Control.Parent;
while Assigned(P.Parent) do
P := P.Parent;
if (P is TForm) then
begin
// public Methoden:
// (P as TForm).Invalidate; // nix
//
// (P as TForm).BeginUpdate;
// (P as TForm).EndUpdate; // flackert
//
// protected Methoden:
// TCrackForm(P).Realign; // nix
// TCrackForm(P).Resize; // nix
// TCrackForm(P).Recreate; // flackert
// TCrackForm(P).Updating; // nix
// TCrackForm(P).Updated; // nix
// TCrackForm(P).UpdateStyle; // nix
// TCrackForm(P).ResizeHandle; // nix
end;
end;
Das Zeichnen meines eigentlichen Controls kann ich an der Stelle sogar weg lassen (wird schon durch die Eigenschaftsänderung veranlasst).
Offenbar kriegt der Mainthread wohl irgendwie von der Änderung nichts mit (obwohl ich gar nicht wirklich sagen kann in welchem Prozess die Änderung gezeichnet wird).
In dem Zusammenhang stellt sich natürlich auch noch die Frage, wie das mit dem Repaint dann unter Mac bzw. auf den mobilen Plattformen laufen würde.
Falls jemand mit meinem Baustellenprojekt (XE3) mal herumspielen will könnte ich das mal per Mail schicken.