Website-Icon Embarcadero RAD Studio, Delphi, & C++Builder Blogs

Delphi-Bindungsausdrücke, -Eigenschaften und -Komponenten

controlsbinding

Wenn wir den Blogbeitrag der letzten Woche zu Bindungsausdrücken fortsetzen, sehen wir uns an, wie Komponenten teilnehmen können, aber Ausdrücke erstellen, die sich auf Eigenschaften beziehen.


Letzte Woche habe ich die Delphi RTL Expression Engine im Blogbeitrag unter  https://blog.marcocantu.com/blog/2021-may-delphi-expression-engine.html vorgestellt . Machen wir nun einen weiteren Schritt. Ich möchte erklären, wie Komponenten und ihre Eigenschaften Teil dieser Ausdrücke sein können. In diesem Fall werten wir nicht einfach einen Ausdruck aus, sondern wollen zwei separate Ausdrücke in einer „Bindung“ verknüpfen.

Bindung von zwei Komponenten

Angenommen, Sie haben ein Formular mit einem SpinEdit und einem ProgressBar. Mit einer verwalteten Bindung können Sie einen Eingabeausdruck (mit einem oder mehreren Eingabeobjekten) und einen Ausgabeausdruck (wieder mit einem oder mehreren Objekten) bereitstellen. Wie Sie im folgenden Code sehen können, ist jedes Objekt dem Ausdruck zugeordnet, der einen Namen  bereitstellt,  z. B. spin1 für die SpinEdit1-Komponente, und der Ausdruck kann auf das Objekt und seine Eigenschaften verweisen, wie in  spin1.Value . Das gleiche passiert für die Ausgabe. Sie können auch einen Ausgabekonverter angeben, den ich hier weggelassen habe:

[crayon-6768935d4a9d3151648440/]
Mit diesem Konfigurationscode wird beim Aufrufen von  BindingExpression1.Evaluate  der Wert von SpinEdit in die ProgressBar kopiert. Sie können den gleichen Aufruf ausführen, um den Wert zu aktualisieren, aber Sie können das Konzept auch abstrahieren, indem Sie der Bindungsarchitektur mitteilen, dass die value-Eigenschaft der Spin-Bearbeitung geändert wurde. Das System ermittelt automatisch, ob es einen oder mehrere Ausdrücke gibt, die die Eigenschaft betreffen, und aktualisiert sie:
[crayon-6768935d4a9d8005345101/]
Dieser Perspektivwechsel (ein Wert hat sich geändert, kein Ausdruck muss neu berechnet werden) ist von grundlegender Bedeutung, da er das Datenmodell vollständig von der zugehörigen Benutzeroberfläche abstrahiert. Wir kommen dazu, aber lassen Sie mich zuerst die einfache Benutzeroberfläche der Anwendung zeigen:

Binden von Objekten und UI-Steuerelementen

Dies wird im zweiten Teil des Beispiels besser erklärt, in dem ein Bearbeitungsfeld an ein Objekt im Speicher gebunden ist. Die TMyObject-Klasse hat eine Name- und eine Value-Eigenschaft. So binden Sie ein Objekt an die Benutzeroberfläche:
[crayon-6768935d4a9d9938221956/]
In diesem Code ist MyObj ein Objekt der Klasse TMyObject. Seine Name-Eigenschaft ist mit der edName-Komponente Text verknüpft. Auch hier aktualisiert das Aktualisieren des Ausdrucks die Ausgabe. Das Objekt sollte jedoch keine Kenntnisse der Steuerelemente der Benutzeroberfläche oder der Benutzeroberflächenbindungen haben. Um das Objekt zu instrumentieren, müssen Sie das System lediglich benachrichtigen, dass sich der Wert geändert hat:
[crayon-6768935d4a9db867879716/]
Wenn sich die Daten mit diesem Code ändern, wird die Benutzeroberfläche automatisch aktualisiert, um dies widerzuspiegeln:
[crayon-6768935d4a9dc709135608/]
Ich bin mir nicht 100% sicher, wie Sie die mit Bindungen in Delphi implementierten Muster aufrufen möchten, aber es bietet sicherlich eine vollständige Trennung und Abstraktion des Datenmodells mit der Benutzeroberflächenansicht.

Es gibt noch viel mehr zu entdecken

Als Nächstes können wir uns ansehen, wie Sie mit bidirektionalen Bindungen arbeiten können und wie Sie die gesamte obige Logik mithilfe bestimmter Komponentendesigner definieren können, um den erforderlichen Code zu reduzieren. Hinter Visual Live Bindings steckt eine Menge Technologie, die das potenzielle Endziel ist und über das wir oft diskutieren. Live-Bindungen sind schön, aber die Bindungstechnologie in Delphi RTL ist der Ort, an dem die Macht lebt.

Die mobile Version verlassen