Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.898 Beiträge
 
Delphi 12 Athens
 
#10

AW: super-buggy MultiView-Komponente - Tipps? Workarounds?

  Alt 11. Okt 2018, 05:17
FindStyleResource am Besten innerhalb von OnApplyStyleLookup oder OnUpdateObjcts benutzen,
in deinem Fall wird es aber schwierig, weil anscheinend gar keine Styled Controls benutzt werden.
Du könntest versuchen statt TLayout TPanel als Basiscontrol zu benutzen, das hat nämlich diese Events.

Ich würde auch versuchen nur ein Panel, statt Left/Right, zu verwenden.
Das sollte im aktuellen Design noch gut möglich sein, wenn man z.B. eine Eigenschaft definiert "FromLeft" die alle relevanten Komponenten, und die Richtung umkehrt
(also z.B. Align von MostRight zu MostLeft.
Es würde ressourcen sparen, und man müsste man sich nur noch um ein Panel kümmern.

Was ich gerne benutze ist dem Frame noch ein Interface zu geben, um es besser zu kapseln und zu modularisieren
Delphi-Quellcode:
type
  IMultiViewUserFrame = interface
  ['{FFE7532C-C203-412C-B658-10F720AADB05}']
      function GetFromLeft : Boolean;
      procedure SetFromLeft(const AValue : Boolean);

      property FromLeft : Boolean read GetFromLeft write SetFromLeft;
  end;


type
  TMultiViewUserFrame = class(TFrame, IMultiViewUserFrame)
  ...
Damit kann man dann beim Aufruf ein Interface benutzen, und dann dein gewünschtes Verhalten steuern.
Das macht aber beim aktuellen TFrameStand nicht so viel Sinn, weil ja auch immer die Klassen verfügbar sind, aber ich wollte immer mal versuchen den FrameStand etwas umzubauen, so das interfaces statt Klassen benutzt werden können.
Das würde den ganzen Aufbau etwas besser entkoppeln, und modularer und besser testbar machen.
Denn ich habe immer die Befürchtung das in größeren Projekten dieser Framestand mal schnell zu komplex werden kann (auf mobilen Plattformen).

Delphi-Quellcode:
procedure TForm1.ButtonShowLeftSideClick(Sender: TObject);
var flani:TFloatAnimation;
  LFrameIntf: IMultiViewUserFrame;
begin
  //Frame im Stand aufrufen:
  LFrameInfoLeft := FrameStand1.New<TMultiViewUserFrame>(LayoutForMVFrameLeft, 'LikeMultiViewLeft');

  LFrameIntf := LFrameInfoLeft.Frame; // Hier könnte das interface benutzt werden
  LFrameIntf.FromLeft := True;


  LFrameInfoLeft.Show;
  //Buttons en/disable
  ButtonShowLeftSide.Enabled:=false;
  ButtonSlideOutLeft.Enabled:=true;
end;
Rollo
  Mit Zitat antworten Zitat