Frage

Ich habe in den letzten 3 Jahren Delphi gelernt, auf einem Hobby / berufliche Ebene. Ich bin glücklich, zu sagen, dass ich jetzt so weit fortgeschritten, dass ich auf meinem frühen Code mit Schrecken und Scham zurückblicken kann. So bin ich jetzt durch einige meiner frühen apps gehen und Umschreiben / sie Refactoring.

Einer der schlechten Gewohnheiten Ich versuche, weg von ihnen Komponenten auf einem Formular von einem anderen Gerät zugreifen. In dem Bemühen, dies zu erzwingen, ich habe mit der Verwendung von Frames als Methode der Information Hiding experimentiert. Anstatt also ein Formular mit Komponenten auf sie zu haben, ich bin ein Rahmen zu schaffen, alle Formularkomponenten zu halten, dann auf einem Formular den Rahmen setzen, den Rahmen Erklärung in die privaten Erklärungen bewegen,

type
  TMyForm = class(TForm)
   private
    MyFrame: TMyFrame;
    procedure SetTimeDate(const Value: TMyItem);
    function ReadTimeDate:TMyItem ;

dann den Rahmen in der Form Initialisierungssektion Registrierung

initialization 
begin
RegisterClasses([TMyFrame])

Ich erklärte dann die Eigenschaften I im öffentlichen Abschnitt des Formulars Einheit benötigen, die den Zugriff auf den Rahmen und seine Komponenten hat.

  public
    property TimeDate: TOverlayItem  read ReadTimeDate  write SetTimeDate;

ich auch Frames verwenden oft wiederholt Komponentengruppen zu konsolidieren.

Dies scheint für die Zwecke zu arbeiten I (versteckt MyFrame und seine Komponenten) wollen, aber Hat jemand irgendwelche Erfahrungen dieser Methode haben?

Gibt es irgendwelche Nachteile mit Frames verwenden? Bin gewinnt ich eigentlich keinen Nutzen aus diesem? Gibt es Probleme mit verschachtelten Frames innerhalb von Frames verwenden? Gibt es gute Praxis Führungen mit Frames in Delphi? Gibt es bessere / einfachere Wege, die gleiche Wirkung hinsichtlich Erreichung Information Hiding in Delphi GUI?

HMCG

War es hilfreich?

Lösung

Es klingt wie Sie immer noch eine Menge Logik in Ihrer UI Schicht. Formulare / Panels nicht haben sollte, die viel Wert Eigenschaften (außer vielleicht für Dialoge).

Wenn Sie mehr Struktur wollen als auf dem MVC-Muster nachlesen.

Nachdem alles gesagt, dass kann Frames ein guter Weg sein, um die GUI zu organisieren. Wie mit allem, nicht übermäßigem Gebrauch.

Andere Tipps

Ich mag Rahmen, der allgemein für komplexe wiederverwendbare Bits zu schaffen. Zum größten Teil ich glaube, sie eine wirklich saubere Art und Weise zu konstruieren Bildschirme sein können. Wie jedoch von Henk Holterman erwähnt Ihre Bildschirm und Rahmen sollten nur Logik für das Funktionieren des UI im Zusammenhang enthalten und so unwissend wie möglich über die Business-Logik sein.

Ein paar Punkte re Frames und Informationen auf der Benutzeroberfläche versteckt:

  1. Wie auf Stackoverflow in einer anderen Frage diskutiert müssen vorsichtig sein, wenn Event-Handler mit in Ihr Rahmen.
  2. Frames hat noch viele veröffentlichten Eigenschaften und nicht wirklich das Problem der Formen löst unpassend mit einem der anderen Bits in der Lage zu fummeln. Auch wenn Sie es nicht tun, wenn der Code es ermöglicht, jemand wird schließlich Code schreiben, wo es Stampfer nicht sollte. Ich entferne immer die globalen Formularvariablen Delphi mit dem Code besudelt und schreibe oft Wrapper-Objekte oder Schnittstellen implementieren, die den Zugriff auf die Benutzeroberfläche gesteuert bieten.

Also anstatt Code wie folgt aufweist:

ClientForm := TClientViewForm.Create(Self);
try
  ClientForm.Client := MyClient;
  ClientForm.ShowModal;
finally
  ClientForm.Free;
end;

Ich werde im Allgemeinen Menschen zwingt, etwas Derartiges zu schreiben:

ClientViewer := TClientViewer.Create(MyClient);
try
  ClientViewer.Show;
finally
  ClientViewer.Free;
end;

oder auch

TClientViewer.ShowClient(MyClient);

und die Klassenmethode hat ShowClient das Bit Griff in der ersten Auflistung gezeigt. Auf diese Weise der anruf Code nie die Form Zeiger empfängt und alle Bits nicht berühren kann, die nicht ausdrücklich von der Wrapper-Klasse zur Verfügung gestellt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top