Oberflächenverarbeitung optimieren

Bei der Softwareentwicklung kann die Oberflächenentwicklung viel Zeit in Anspruch nehmen. Mit den geeigneten Technologien kann jedoch so mancher Fallstrick überwunden und sogar das Laufzeitverhalten der Applikation verbessert werden.

Um auf Oberflächenobjekte zugreifen zu können, braucht der Entwickler etwas um es "greifen" zu können. In CONZEPT 16 bilden die sogenannten Deskriptoren (engl. Handle) den "Griff" für alle Arten von Objekten, so auch für Oberflächenobjekte.
Eine einfache, jedoch veraltete, Variante den Deskriptor eines Oberflächenobjektes zu ermitteln sieht so aus:

$<Objektname>

Dieser Ausdruck gibt den Deskriptor eines Oberflächenobjektes zurück. Bei jedem Ausführen dieses Ausdrucks wird in den geladenen Dialogen nach einem Objekt mit dem angegeben Namen gesucht.
Der ermittelte Deskriptor kann direkt in einer Anweisung verwendet werden, beispielsweise so:

$edNameFirst->wpHelpTip # 'Vorname';

Die $-Schreibweise ist im Prinzip eine Kurzform des folgenden Ausdrucks:

<Startobjekt>->WinSearch('<Objektname>')
Beispiel
tWinEdit # tWinFrame->WinSearch('edNameFirst');

Die Funktion WinSearch() sucht im Startobjekt nach einem Objekt mit dem übergebene Namen. Im Gegensatz zur $-Schreibweise, muss hier immer ein Startobjekt für die Suche angeben werden. Die Vorteile der Funktion WinSearch() gegenüber der $-Schreibweise sind, dass der Objektname zur Laufzeit dynamisch bestimmt werden kann und das er Platzhalterzeichen (Wildcards) enthalten darf.
Bei den beiden erwähnten Varianten ist aber Folgendes zu beachten: Wird kein Objekt mit dem angegeben Namen gefunden, ergibt der Ausdruck den Wert 0 (Null) und ein Zugriff auf dieses nicht vorhandene Objekt resultiert in dem Laufzeitfehler "Deskriptor ungültig".
Wird ein Dialog im Laufe des Entwicklungsprozesses angepasst, ist dies ein typischer Fehler, der jedoch mit einfachen Mitteln umgangen werden kann.
Mit dem with-Konstrukt wird eine logische Verbindung von der Prozedur zu den Dialogen, die sie verwendet hergestellt. Das heißt, dass die Prozedur sich nur dann fehlerfrei übersetzen lässt, wenn die referenzierten Objekte auch tatsächlich vorhanden sind. Dadurch wird verhindert, dass ein Oberflächenobjekt innerhalb einer Prozedur referenziert wird, das gar nicht vorhanden ist, weil es umbenannt oder gelöscht wurde.
Ein weiterer Vorteil der Referenzierung mit einem with-Konstrukt ist, dass der Deskriptor schneller ermittelt werden kann, als bei der $-Schreibweise. Welches Objekt referenziert wird, wird nämlich schon beim Übersetzen der Prozedur hinterlegt, so dass nicht bei jedem Zugriff darauf danach gesucht werden muss.
Die Verwendung sieht wie folgend aus:

with <Dialogname> ... $:<Objektname> ...
Beispiel
with Contact $:edNameFirst->wpHelpTip # 'Vorname';

Zu beachten ist der Doppelpunkt zwischen dem $-Zeichen und dem Objektenamen!
Soll mehrfach auf Oberflächenobjekte zugegriffen werden, kann alternativ auch die folgende Schreibweise verwendet werden:

with <Dialogname>
{
  ... $:<Objektname> ...
  ... $:<Objektname> ...
}
Beispiel
with Contact
{
  $:edNameFirst->wpHelpTip   # 'Vorname';
  $:edNameFirst->wpLengthMax # 40;
  $:edNameLast->wpHelpTip    # 'Nachname';
  $:edNameLast->wpLengthMax  # 40;
}

Egal ob die Referenzierung von Oberflächenobjekten mit oder ohne with-Konstrukt vorgenommen wird: Vorraussetzung ist natürlich, dass der Dialog, in dem die Objekte enthalten sind, geladen ist.
Wird die Objektstruktur eines Dialoges verändert, auf dessen Objekte innerhalb einer Prozedur per with-Konstrukt zugegriffen wird, muss diese Prozedur nach dem Speichern des Dialoges erneut übersetzt werden. Ansonsten tritt beim Zugriff auf ein per with referenziertes Objekt der Laufzeitfehler "Frame abweichend" auf.

Klicken Sie hier, um die Nutzungsbedingungen für unseren Blog zu lesen.

4 Antworten

  1. Praktisch wäre in manchen Situationen auch eine Präfix-Syntax. Warum nicht z.B. den OK-Butten in mehreren verschiedenen Frames über $frm1:Ok->wpBlabla und $frm2:Ok->wpBlabla oder ähnlich referenzieren.
    Dadurch könnten gleich mehrere Anwendungsfälle adressiert werden:
    1) Kurze ad-hoc Validierung von nur wenigen Controls
    2) das Einbinden verschiedener Frames könnte man u. U. mittels eines Define erledigen
    3) bei der Verwendung mehrerer Frames würde eine unübersichtliche Verschachtelung wie bei den With-Konstrukten vermieden
    Bonus: Es wäre ähnlich zur Präfix-Syntax bei den Prozeduren – LIB.Library:fun(A, B, …)

  2. Uns gefallen die Vorteile des With-Konstrukts, da dadurch unnötige Laufzeitfehler vermieden werden können.

    Allerdings haben wir bisher auf deren Anwendung mehrheitlich verzichtet, da uns das Ganze etwas umständlich dünkt. In einer Prozedur mit hunderten von Events muss das With-Konstrukt für jeden Event separat aufgeführt werden.

    Wir würden es begrüssen, wenn der zugrundeliegende Dialog (vorteilhaft sogar mehrere, vorausgesetzt es wird mit eindeutigen Objektnamen gearbeitet) einmalig eingangs Prozedur gesetzt werden könnte. So ähnlich wie ein Include, z.B. "@F:frmContact".

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Leave the field below empty!

Wünsche, Fragen oder Feedback sind willkommen:

Nutzungsbedingungen der Kommentarfunktion im Blog

1. Allgemeines

Vectorsoft AG („Anbieter“) stellt für Internetnutzer („Nutzer“) auf der Website
vectorsoft.de einen öffentlichen Blog bereit. Der öffentliche Blog dient dem
Informations- und Gedankenaustausch. Die Nutzer, welche sich mit Beiträgen und
Kommentaren beteiligen, verpflichten sich dazu, die Blog-Nutzungsbedingungen
einzuhalten und tragen die Verantwortung für die Richtigkeit und Angemessenheit
sowie Freiheit von Rechtsverletzungen ihrer Beiträge. Mit Nutzung der
Kommentarfunktion in unserem Blog akzeptieren Sie diese Nutzungsbedingungen.

2. Netiquette

Wir bitten Sie von persönlichen Angriffen und Provokationen aufgrund anderer
Meinungen abzusehen. Bitte argumentieren Sie sachlich und bewegen Sie sich auf
der Basis einer konstruktiven Diskussionskultur. Ihr Kommentar sollte stets im
Zusammenhang mit dem jeweiligen Thema sein, um Ausschweifungen in andere
Themenbereiche zu vermeiden. Das mehrmalige Posten desselben Kommentars
oder mehrerer ähnlicher Kommentare ist nicht erlaubt.

3. Verbot rechtswidriger Inhalte

Mit Absenden Ihres Kommentars bestätigen Sie, dass Sie keine Urheberrechte oder andere Rechte Dritter verletzen. Volksverhetzende, rassistische Äußerungen, Anleitungen zu Straftaten und deren Verherrlichung, Gewaltdarstellungen, pornografische Inhalte und Äußerungen, die Persönlichkeitsrechte verletzen sind untersagt.

4. Keine Werbung

Die Nutzung der Kommentarfunktion ist für kommerzielle oder parteipolitische
Zwecke nicht erlaubt. Werbliche Beiträge aller Art werden von uns umgehend
gelöscht.

5. Angaben zum Namen

Bei der Eingabe Ihres Namens achten Sie auf die zuvor genannten Grundsätze.

6. Quellenangaben

Bitte geben Sie bei der beabsichtigten Veröffentlichung von Zitaten oder Beiträgen
Dritter die jeweiligen Quellen an und erläutern dessen Bezug zum Blogbeitrag.

7. Verstoß gegen die Nutzungsbedingungen

Beiträge, die gegen diese Richtlinie verstoßen werden umgehend gelöscht. Sollten
Sie selbst Verstöße bemerken, so senden Sie uns bitte den Link des betreffenden
Kommentars per E-Mail an . Wir weisen ausdrücklich daraufhin, dass wir einzelne Nutzer bei wiederholten oder schweren Verstößen gegen diese
Nutzungsbedingungen ausschließen werden.

Stand: Sept. 2024

Deine Trial Version - jetzt anfordern!

Teste yeet - unverbindlich und kostenfrei

IHRE EVALUIERUNGSLIZENZ - JETZT ANFORDERN!

TESTEN SIE DIE CONZEPT 16 VOLLVERSION - UNVERBINDLICH und KOSTENFREI

Melden Sie sich bei unserem Newsletter an

Anrede*
     
Zustimmung zur Datenverarbeitung gem. DSGVO*



WordPress Cookie-Hinweis von Real Cookie Banner