home *** CD-ROM | disk | FTP | other *** search
/ TopWare Tools / TOOLS.iso / tools / top1309 / twizard.doc < prev    next >
Encoding:
Text File  |  1994-02-21  |  85.0 KB  |  2,689 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.    Turbo Wizard Version 1.xx
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.    Dokumentation der Sharewareversion
  16.  
  17.    Copyright (c) 1994 by Ulrich Albrecht
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.                                     - 2 -
  68.  
  69.    Inhalt
  70.  
  71.    Vorbemerkung...........................................................3
  72.    Rechtliches............................................................5
  73.    Einführung.............................................................6
  74.    Installation...........................................................8
  75.      EMS Unterstützung....................................................8
  76.    Das Arbeiten mit dem Wizard............................................9
  77.      Elemente der Arbeitsumgebung.........................................9
  78.      Projekte anlegen und öffnen..........................................9
  79.      Objekte einfügen und bearbeiten......................................9
  80.      Bearbeitung von Dialogobjekten......................................11
  81.      Die Quelltexterzeugung..............................................13
  82.      Der Testmodus.......................................................13
  83.      Turbo Vision 1.0 oder 2.0 ?.........................................14
  84.    Der Ressourceneditor..................................................15
  85.    Das Hilfekonzept von Turbo Vision und Turbo Wizard....................16
  86.      Der Hilfekontext eines Objektes.....................................16
  87.      Festlegung des Hilfekontext.........................................16
  88.      Die Funktion TStatusLine.Hint(AHelpCtx): String;....................17
  89.      Der Hilfecompiler TVHC.EXE..........................................17
  90.      Der Hilfeeditor des Turbo Wizard....................................18
  91.      Die Prozedur ShowHelp...............................................20
  92.    Statuszeilen..........................................................22
  93.      Reihenfolge und Auswertung der Statuszeilen.........................22
  94.      Grenzen und Probleme bei Statuszeilen...............................24
  95.      Der Quelltext einer Statuszeile.....................................24
  96.    Menübalken............................................................25
  97.      Der Quelltext eines Menübalkens.....................................26
  98.    Dialoge...............................................................27
  99.      Grundsätzliche Optionen.............................................27
  100.      Ressourcendateien verwenden.........................................28
  101.      Stack schonen.......................................................28
  102.      Record auf dem Stack oder Heap anlegen..............................28
  103.      Recordtyp lokal oder global deklarieren.............................29
  104.      Zentrierung in X- oder Y-Richtung...................................29
  105.      Der Typ TWDialog....................................................29
  106.      Reihenfolge der Dialogelemente......................................29
  107.      Die HandleEvent-Methode eines abgeleiteten Dialogtypen..............30
  108.      Verschiedene Möglichkeiten der Befehlauswertung.....................31
  109.    Der Datenrecord.......................................................32
  110.      Bedeutung der Dialogelementnamen....................................32
  111.      Globale oder lokale Deklaration.....................................32
  112.      Records auf dem Heap einrichten.....................................32
  113.      Initialisierung des Records.........................................33
  114.    Prozedurbezeichner....................................................34
  115.      Die TWApplication.HandleEvent-Methode...............................35
  116.      Die Schnittstelle zu eigenen Prozeduren und Funktionen..............37
  117.    Einbinden eigener Units und externer Prozeduren.......................38
  118.  
  119.    Anhang A: Dateischlüssel..............................................39
  120.    Anhang B: Coming Attractions..........................................42
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.                                     - 3 -
  132.  
  133.    Vorbemerkung
  134.  
  135.    Turbo Wizard ist Shareware. Sie dürfen dieses Programm 30 Tage
  136.    kostenfrei ausprobieren und auf seine Tauglichkeit testen. Wenn
  137.    Sie Turbo Wizard danach weiterhin nutzen wollen, sollten Sie sich
  138.    registrieren lassen. Wenn Sie sich nicht registrieren lassen,
  139.    sollten Sie nach dieser Zeitspanne aufhören, mit dem Programm zu
  140.    arbeiten. Es klingt zugegebenermaßen unglaubwürdig, aber die
  141.    Gefahr, von einem Blitz erschlagen zu werden steigt proportional
  142.    zur Anzahl der unregistrierten Programme auf Ihrer Festplatte.
  143.    Die auffällige Häufung von Naturkatastrophen in den letzten
  144.    Jahren ist ein eindrucksvoller Beweis.
  145.  
  146.    Für all diejenigen, die Wind und Wetter nicht fürchten, gibt es
  147.    allerdings noch ein paar andere Gründe, sich registrieren zu
  148.    lassen:
  149.  
  150.    ■ Eine Vollversion, die im 286er Protected Mode läuft, die
  151.    Einbindung eines Compilers und Debuggers möglich macht und einige
  152.    weitere Features von Turbo Vision 2.0 unterstützt. In dieser
  153.    erweiterten Version können Sie Prototypen direkt aus dem Wizard
  154.    heraus compilieren, ausführen und (wenn Sie einen Debugger haben)
  155.    sogar debuggen. Außerdem verfügt dieses Programm über eine
  156.    ausgefeiltere Fehlerbehandlung und über die Möglichkeit, für alle
  157.    Menübefehle eigene Hotkeys zu definieren.
  158.  
  159.    ■ Sie erhalten eine erweiterte Dokumentation (auf Diskette).
  160.  
  161.    ■ Sie erhalten das Recht auf telefonischen oder schriftlichen
  162.    Support. Ich rufe allerdings in der Regel nicht zurück.
  163.  
  164.    ■ Sie können als registrierter Anwender sicher sein, daßz ich
  165.    Ihre Verbesserungsvorschläge und Änderungswünsche bedeutend
  166.    wohlwollender behandle, als dumme Ratschläge von
  167.    Trittbrettfahrern. Je mehr Registrierungen ich erhalte desto
  168.    größer ist der Anreiz, Turbo Wizard zu einem mächtigeren
  169.    Programmgenerator auszubauen. Und Sie wären dann der erste, der
  170.    davon erfährt.
  171.  
  172.    ■ Es kostet nur 50 DM. Wenn Sie die Arbeitszeit, die Sie mit dem
  173.    Wizard bei der Programmierung sparen können, bezahlen müßten,
  174.    käme Sie das sicherlich teurer.
  175.  
  176.    Natürlich bin ich auch an Fehlerreports und Hinweisen
  177.    nichtregistrierter Anwender interessiert.
  178.  
  179.    Shareware lebt davon, daß die Anwender ihre Wünsche direkt an
  180.    den/die Entwickler übermitteln, die wiederum schneller auf solche
  181.    Wünsche reagieren können als große Softwarehäuser mit starreren
  182.    Strukturen. Sharewareautoren leben allerdings auch davon, daß
  183.    sich ab und zu mal ein Anwender registrieren läßt.
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.    
  192.  
  193.  
  194.  
  195.                                     - 4 -
  196.  
  197.    Wenn Sie Turbo Wizard also geprüft und für gut (oder zumindest
  198.    brauchbar) befunden haben und weiterhin nutzen möchten senden Sie
  199.    einen Verrechnungsscheck über DM 50 an folgende Adresse:
  200.  
  201.                             Ulrich Albrecht
  202.                             ThomashofStraße 23
  203.                             52070 Aachen
  204.                             Tel. 0241/153824
  205.  
  206.  
  207.    Geben Sie bitte deutlich und lesbar Namen bzw. Firmennamen,
  208.    Anschrift und Diskettenformat an. Die Lieferung erfolgt frei Haus
  209.    auf dem Postwege. Der Preis versteht sich als Gebühr für eine
  210.    Einzelplatzlizenz.
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.    
  256.  
  257.  
  258.  
  259.                                     - 5 -
  260.  
  261.    Rechtliches
  262.  
  263.    Ich übernehme keinerlei Haftung oder Gewährleistung für die
  264.    Funktionsfähigkeit dieses Programms oder für Schäden
  265.    irgendwelcher Art, Datenverluste eingeschlossen, die bei der
  266.    Arbeit mit diesem Programm entstehen.
  267.  
  268.    Das Programm und diese Dokumentation unterliegen den jeweils
  269.    gültigen urheberrechtlichen Bestimmungen. Für die Weitergabe
  270.    gelten folgende Regeln:
  271.  
  272.    Privatpersonen dürfen die Sharewareversion von Turbo Wizard frei
  273.    kopieren und weitergeben, solange diese Dokumentation, die
  274.    Hilfedatei TWIZARD.HLP und die Dateien XHELP60.TPU, XHELP70.TPU
  275.    und XHELP70.TPP mit weitergegeben werden.
  276.  
  277.    Händler dürfen Turbo Wizard kopieren und (wiederum nur in
  278.    Verbindung mit den genannten Dateien) für eine angemessene
  279.    Aufwandsentschädigung weitergeben. Sie müssen ihre Kunden dabei
  280.    darauf hinweisen, daß mit diesem Betrag keineswegs ein Erwerb der
  281.    Nutzungsrechte an diesem Programm verbunden ist, sondern daß es
  282.    sich dabei um eine Art Kopiergebühr handelt.
  283.  
  284.    Die Weitergabe des Wizard zusammen mit handbuchähnlichen
  285.    Druckerzeugnissen ("Bookware") bedarf meiner ausdrücklichen,
  286.    schriftlichen Genehmigung.
  287.  
  288.    Die Bezeichnungen Turbo Pascal, Borland Pascal mit Objekten und
  289.    Turbo Vision sind geschützte Warenzeichen der Firma Borland
  290.    International.
  291.    Rücksicht auf ihre freie Verwendbarkeit benutzt.
  292.  
  293.    Turbo Wizard wurde geschrieben und erzeugt mit Borland Pascal für
  294.    Objekte 7.0 unter Benutzung von Turbo Vision
  295.  
  296.    Copyright (c) 1994 by Ulrich Albrecht
  297.  
  298.    Die Programmdatei TWIZARD.EXE wurde mit dem Exe-Komprimierer
  299.    LZEXE 0.91 von Fabrice Bellard behandelt, einem bemerkenswerten
  300.    Programm, das dessen Autor dankenswerterweise als Public Domain
  301.    veröffentlicht hat.
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.    
  320.  
  321.  
  322.  
  323.                                     - 6 -
  324.  
  325.    Einführung
  326.  
  327.  
  328.    Turbo Wizard ist ein Programm, das Sie bei der Programmierung mit
  329.    Turbo Vision unterstützt, der objektorientierten Bibliothek von
  330.    Bildschirmelementen, die mit den Pascalcompilern der Firma
  331.    Borland ab der Version 6.0 mitgeliefert wird. Turbo Wizard
  332.    erzeugt den Quelltext zu Bildschirmelementen wie Menüs und
  333.    Dialogen, die Sie einfach mit der Maus am Bildschirm
  334.    "zusammenklicken".
  335.  
  336.    Sie können mit Turbo Wizard auf einfache Weise:
  337.  
  338.      ■ Menübalken erstellen.
  339.  
  340.      ■ Statuszeilen für unterschiedliche Programmkontexte
  341.      bereitstellen.
  342.  
  343.      ■ Modale und nichtmodale Dialoge entwerfen, die (beinahe) alle
  344.      Standardelemente enthalten können, die in Turbo Vision
  345.      vorgesehen sind. Zusätzlich können Sie die Quelltexterzeugung
  346.      so steuern, daß auch von Ihnen selbst abgeleitete Objekte in
  347.      der Regel einfach einzubinden sind. Turbo Wizard deklariert für
  348.      Sie auch die passenden Datenrecords zum einfachen
  349.      Datenaustausch mit diesen Schnittstellenobjekten. Sie können
  350.      Standard-Dialogtypen verwenden, aber auch die neu entworfenen
  351.      Dialoge als eigene, von TDialog abgeleitete Objekttypen
  352.      deklarieren. In diesem Fall implementiert der Wizard für Sie
  353.      einen passenden Constructor Load oder Init, eine Methode Store,
  354.      eine Methode HandleEvent und legt einen individuellen
  355.      TStreamRec an, um diesen neuen Typen direkt in einem Stream
  356.      verwenden zu können.
  357.  
  358.      ■ Ein komplexes Online-Hilfesystem inklusive alphabetisch
  359.      sortiertem Index und Hinweisen in der Statuszeile erstellen.
  360.      Erstellen Sie die Programmdokumentation gleich mit der
  361.      Oberfläche!
  362.  
  363.      ■ Sofort lauffähige Prototypen erstellen. Bevor Sie eine
  364.      einzige Zeile Programmcode eingetippt haben, läßt sich die
  365.      Oberfläche und die mit der Oberfläche verbundene Programmlogik
  366.      bereits überprüfen und vorführen. In der Vollversion können Sie
  367.      dazu sogar die Kommandozeilenversion des Compilers aufrufen und
  368.      den Prototypen testen, ohne den Wizard verlassen zu müssen.
  369.      (Die Vollversion läuft im 286-Protected Mode und erfordert
  370.      einen DPMI-Server. Die Möglichkeit der Weitergabe der
  371.      entsprechenden von Borland mitgelieferten Programme innerhalb
  372.      eines Sharewarepaketes erscheint mir rechtlich zumindest
  373.      zweifelhaft. Daher die Einschränkung.)
  374.  
  375.      ■ Das Stream-Konzept von Turbo Vision und die Verwendung von
  376.      Ressourcendateien, die bisher mit nicht unbeträchtlichem
  377.      zusätzlichen Arbeitsaufwand verbunden war, nutzen, ohne dafür
  378.      eine einzige Zeile Quelltext mehr schreiben zu müssen. Sie
  379.      erhalten automatisch kürzere, besser lesbare und besser zu
  380.      wartende Programme, die zudem auch noch über mehr
  381.      Arbeitsspeicher verfügen können.
  382.  
  383.    
  384.  
  385.  
  386.  
  387.                                     - 7 -
  388.  
  389.  
  390.  
  391.    Turbo Wizard kann Ihnen eine ganze Menge Arbeit abnehmen.
  392.    Trotzdem sollten Sie mit den grundlegenden Konzepten von Turbo
  393.    Vision vertraut sein und OOP von Ooops! zu unterscheiden wissen,
  394.    denn erstens ist die Kommentierung des vom Wizard erzeugten
  395.    Quelltextes spärlich (eine Verbesserung steht im Pflichtenheft
  396.    für spätere Updates), zweitens erzeugt der Wizard ja nur die
  397.    Benutzeroberfläche eines Programmes, das Sie selbst noch mit
  398.    Funktionalität auszustatten haben und drittens sollten Sie eh
  399.    nicht alles glauben, was irgendein Programm Ihnen erzählt.
  400.  
  401.    Auf eine ausführliche Vorstellung der in Turbo Vision
  402.    vorgesehenen Objekte und Prinzipien möchte ich bewußt verzichten.
  403.    Die Handbücher von Borland sind ausgezeichnete Wegweiser in die
  404.    Materie. Andere "Fachbücher" der einschlägigen Verlage sind
  405.    manchmal ganz brauchbar (häufig auch von schlichter Dämlichkeit
  406.    und eine gerechte Strafe für Raubkopierer), zumindest aber
  407.    zahlreich.
  408.  
  409.  
  410.    Um den Ausführungen dieser Dokumentation folgen zu können sollten
  411.    Sie...
  412.  
  413.      ■ wissen, was Units sind und wie Includedateien vom
  414.      Pascalcompiler behandelt werden;
  415.  
  416.      ■ die wichtigsten Elemente einer Turbo Vision Applikation
  417.      (Desktop, Menü, Statuszeile, Dialoge etc.) erkennen, wenn Sie
  418.      sie sehen;
  419.  
  420.      ■ wissen, was man unter einem Ereignis (Event) versteht und was
  421.      die Methode HandleEvent der Turbo Vision Objekte macht;
  422.  
  423.      ■ wissen, was ein Objekt ist, wie man Objekte ableitet, was
  424.      eine virtuelle Methode ist und welche Regeln für das
  425.      Überschreiben virtueller Methoden gelten;
  426.  
  427.      ■ eine zumindest vage Ahnung davon haben, was ein Stream ist.
  428.  
  429.  
  430.    Turbo Wizard verfügt über eine umfangreiche Onlinehilfe, die
  431.    ihnen einen schnellen Einstieg ermöglichen sollte. Ich möchte
  432.    Ihnen außerdem das Programm THELP.COM empfehlen, ein
  433.    speicherresidentes Programm, das Borland seinen Pascalcompilern
  434.    beilegt, und das ihnen zusätzlich die Onlinehilfe aus dem Hause
  435.    Borland zur Verfügung stellt.
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447.    
  448.  
  449.  
  450.  
  451.                                     - 8 -
  452.  
  453.    Installation
  454.  
  455.    Sie werden Turbo Wizard vermutlich in einer "gepackten" Datei
  456.    erhalten haben, sei diese nun selbstentpackend oder nicht.
  457.  
  458.    Die Installation von Turbo Wizard ist in jedem Falle einfach:
  459.  
  460.    ■ Legen Sie ein eigenes Unterverzeichnises (z.B. C:\TWIZARD) an;
  461.  
  462.    ■ Dekomprimieren Sie das gepackten Archives in das gewünschte
  463.    Verzeichnis. Da selbstentpackende Archive manchmal keine Angaben
  464.    über ein Zielverzeichnis verstehen, ist es sicherer, die
  465.    Archivdatei vorher in dieses Verzeichnis zu kopieren.
  466.  
  467.  
  468.    Da der Wizard mehrere Dateien gleichzeitig geöffnet hält, ist es
  469.    bei Problemen angebracht, den Eintrag FILES=?? in der Datei
  470.    CONFIG.SYS zu erhöhen.
  471.  
  472.    Turbo Wizard scheint unter Windows keine Probleme zu bereiten.
  473.  
  474.    Die Netzwerkfähigkeit ist nicht überprüft worden, es bestehen
  475.    allerdings gewisse Zweifel, da die Dateibehandlungsmethoden von
  476.    Borland Pascal nicht 100% "netzwerksicher" sind.
  477.  
  478.    EMS Unterstützung
  479.  
  480.    Da Turbo Wizard EMS-Speicher nutzen kann, um seine Overlays und
  481.    Ressourcen schneller laden zu können, kann es (vor allem bei
  482.    etwas träger Festplatte) sinnvoll sein, 256 kb EMS zu
  483.    konfigurieren.
  484.  
  485.  
  486.  
  487.  
  488.  
  489.  
  490.  
  491.  
  492.  
  493.  
  494.  
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.    
  512.  
  513.  
  514.  
  515.                                     - 9 -
  516.  
  517.    Das Arbeiten mit dem Wizard
  518.  
  519.    Elemente der Arbeitsumgebung
  520.  
  521.    Die Elemente, aus denen sich die Oberfläche des Wizard
  522.    zusammensetzt (Fenster, Rollbalken Buttons etc.) sind
  523.    größtenteils Standardelemente aus Turbo Vision. Die Bedienung
  524.    dürfte Ihnen daher von der Arbeit in der Turbo bzw. Borland
  525.    Pascal IDE bekannt sein. (Tatsächlich wurde die Oberfläche des
  526.    Wizard mit einigen Vorversionen entworfen)
  527.  
  528.    Eine erweiterte Funktionalität bieten die Listboxen, in denen der
  529.    Wizard Konstanten und Bezeichner anzeigt. Mit der Taste ENTF
  530.    können Sie hier zumeist einzelne Bezeichner (nach Rückfrage)
  531.    löschen. Bei Listboxen, zu denen eine Eingabezeile gehört, können
  532.    Sie einen zu editierenden Begriff in der Listbox anwählen, um ihn
  533.    in die Eingabezeile zu laden. Eine Änderung müssen Sie immer mit
  534.    der Eingabetaste bestätigen.
  535.  
  536.  
  537.    Projekte anlegen und öffnen
  538.  
  539.    Viele Eingaben, die Sie während der Arbeit an einem Prototypen
  540.    oder auch nur an einzelnen Dialogobjekten vornehmen, werden vom
  541.    Wizard in einer Projektdatei (Standarddateiendung .PRJ)
  542.    verwaltet. Sie stellt somit den Bezugsrahmen her, innerhalb
  543.    dessen der Quelltext sinnvoll erzeugt und letztendlich zu einem
  544.    lauffähigen Prototypen verbunden werden kann. Die Dateinamen der
  545.    Quelltextdateien werden folgerichtig vom Namen dieser
  546.    Projektdatei abgeleitet (einen Schlüssel zu Namen und Inhalt der
  547.    einzelnen Dateien finden Sie im Anhang A bzw. in der Onlinehilfe
  548.    des Wizard).
  549.  
  550.    Vor Ihrer ersten Arbeitssitzung sollten Sie ein eigenes
  551.    Unterverzeichnis für ein Projekt anlegen.
  552.  
  553.    Wenn Sie nun den Wizard starten können Sie im Menüpunk
  554.    "Datei│Projekt öffnen..." den Namen eines neu anzulegenden
  555.    Projektes eingeben. Der Wizard speichert bei Programmende den
  556.    Namen des zuletzt bearbeiteten Projektes und den gesamten Desktop
  557.    in einer Konfigurationsdatei (TWIZARD.CFG und TWIZARD.DSK) und
  558.    lädt diese Einstellungen automatisch beim nächsten Programmstart.
  559.    Sie können immer nur ein Projekt zugleich bearbeiten.
  560.  
  561.    Objekte einfügen und bearbeiten
  562.  
  563.    Wenn Sie eine Projektdatei öffnen bzw. neu anlegen wird das Menü
  564.    um einige Punkte erweitert. Die größte Bedeutung hat dabei das
  565.    Menü "Objekte". In ihm finden Sie alle Befehle, um Dialoge,
  566.    Dialogelemente, Menüs und Statuszeilen in die Arbeitsfläche
  567.    einzufügen. Wenn Sie einen Menübalken oder eine Statuszeile
  568.    einfügen, erscheinen diese an einem festgelegten Ort. Bei
  569.    Dialogen und Dialogelementen erscheint auf der Arbeitsfläche
  570.    zunächst ein türkisfarbenes Viereck, das Sie mit der Maus über
  571.    den Bildschirm bewegen und dessen Abmessungen Sie wie bei einem
  572.    Fenster ändern können, indem Sie an seiner rechten unteren Ecke
  573.    ziehen. Plazieren Sie dieses Rechteck an der gewünschten Stelle,
  574.  
  575.    
  576.  
  577.  
  578.  
  579.                                     - 10 -
  580.  
  581.    indem Sie die rechte Maustaste drücken. ESC bricht den Vorgang
  582.    ab. Achten Sie darauf, daß Sie Dialogelemente nur in den obersten
  583.    Dialog einfügen können und daß ein solches Element vollständig
  584.    innerhalb des Dialoges liegen muß. Die Größe eines bereits
  585.    eingefügten Dialoges können Sie ebenfalls durch Ziehen an der
  586.    unteren rechten Ecke ändern (eine Eigenschaft, die diese Dialoge
  587.    im späteren Programm natürlich nicht mehr haben).
  588.    Anzahl der einzufügenden Schaltfelder direkt aus der Höhe des
  589.    Feldes bestimmt. Wenn Sie allerdings beim Drücken der Maustaste
  590.    die STRG-Taste niederhalten, können Sie diese Voreinstellung
  591.    ändern. Dies ist sinnvoll, wenn Sie eine größere Anzahl von
  592.    Schaltern in diesem Feld unterbringen möchten: Turbo Vision ist
  593.    so freundlich, in einem solchen Fall die Schalter nebeneinander
  594.    darzustellen.
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.    
  640.  
  641.  
  642.  
  643.                                     - 11 -
  644.  
  645.    Bearbeitung von Dialogobjekten
  646.  
  647.  
  648.    Für die Bearbeitung bereits eingefügter Objekte gelten ein paar
  649.    einfache Regeln:
  650.  
  651.    Wenn Sie ein Objekt in einem Dialog mit der linken Maustaste
  652.    anklicken und zugleich die STRG-Taste drücken, können Sie es mit
  653.    der Maus einfach über den Bildschirm ziehen.
  654.  
  655.    Wenn Sie ein Objekt (auch Menüs und Statuszeilen) auf dem
  656.    Bildschirm mit der rechten Maustaste (im weiteren RMB: Right
  657.    Mouse Button) anklicken, so öffnet sich ein Dialog, in dem Sie
  658.    die für dieses Objekt spezifischen Eigenschaften bestimmen
  659.    können. Im allgemeinen handelt es sich dabei um die Parameter,
  660.    die im Quelltext dem Constructor des Objektes übergeben werden.
  661.    Diese Eigenschaften sind natürlich von Objekt zu Objekt
  662.    verschieden, und genauere Erläuterungen zur Bedeutung der
  663.    einzelnen Felder erhalten Sie in der Onlinehilfe und in Ihrer
  664.    Turbo Vision Dokumentation.
  665.  
  666.    Wenn Sie einen Menübalken mit dem RMB anklicken, können Sie
  667.    weitere Untermenüs in den Menübalken eintragen. Klicken Sie auf
  668.    einen bereits vorhandenen Eintrag, so können Sie Menübefehle und
  669.    Trennlinien in dieses Untermenü eintragen und konfigurieren.
  670.  
  671.    Auch bei Statuszeilen öffnet der RMB einen Dialog, über den Sie
  672.    neue Befehle eintragen, aber auch ganze Statuszeilen (TStatusDef)
  673.    für andere Programmkontexte (s.u) neu erstellen können.
  674.  
  675.    Im Eigenschaftendialog von Dialogelementen können Sie zusätzlich
  676.    bestimmen, unter welchem Namen die Variableninstanz des
  677.    jeweiligen Objektes auftauchen soll. Bestimmte Objekte wie Label
  678.    oder Button bleiben allerdings unbenannt, sie werden direkt z.B.
  679.    mit "Dialog^.Insert(New(PLabel, Init(...)));" eingefügt.
  680.  
  681.    Wenn Sie einen Dialog als neuen Objekttypen deklarieren wollen,
  682.    so können Sie über die Namensfelder seiner Elemente bestimmen, ob
  683.    Zeiger auf diese Objekte als Feldelemente des Dialogtypen
  684.    auftauchen sollen. Dazu müssen Sie deren Namen lediglich ein
  685.    ausrufezeichen voranstellen. Die so gekennzeichneten SubViews
  686.    werden dann in die Typendeklaration aufgenommen und außerdem in
  687.    den Load- und Store-Methoden des neuen Dialogtypen durch Aufruf
  688.    der Methoden "GetSubViewPtr()" und "PutSubViewPtr()"
  689.    berücksichtigt.
  690.  
  691.    Bei den meisten Objekten können Sie in diesem Dialog den Typ des
  692.    Objektes nachträglich verändern. Wenn Sie z.B. einen
  693.    selbstimplementierten Eingabezeilentyp "TDatumseingabe" verwenden
  694.    wollen, so ersetzen Sie im entsprechenden Feld den Eintrag
  695.    "PInputLine" durch "PDatumseingabe" (vorausgesetzt der Zeigertyp
  696.    auf TDatumseingabe heißt so). Der Wizard wird dann im Quelltext
  697.    statt "New(PInputLine, Init(R, <EingabeLänge>))" den Ausdruck
  698.    "New(PDatumsEingabe, Init(R, <EingabeLänge>))" verwenden. Dieses
  699.    Beispiel zeigt auch, wo die praktische Beschränkung dieses
  700.    Konzeptes liegt: alle Bezugnahmen auf die entsprechende Variable
  701.    werden zwar mit dem richtigen Typ vorgenommen, die Syntax des
  702.  
  703.    
  704.  
  705.  
  706.  
  707.                                     - 12 -
  708.  
  709.    Constructors wird allerdings vom Vorgänger übernommen, was eine
  710.    Nachbearbeitung erforderlich machen kann. Beachten Sie auch die
  711.    Bemerkungen zu diesem Thema in den Abschnitten über den
  712.    Ressourceneditor und den Datenrecord.
  713.  
  714.    Der Eigenschaftendialog enthält außerdem einen "Löschen"-Knopf,
  715.    um das Objekt wieder zu entfernen, Dialoge, Menübalken und
  716.    Statuszeilen auch einen "Quelltext schreiben"-Knopf, um die
  717.    Produktion des jeweiligen Codes auszulösen.
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746.  
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  
  753.  
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.    
  768.  
  769.  
  770.  
  771.                                     - 13 -
  772.  
  773.    Die Quelltexterzeugung
  774.  
  775.  
  776.    Wenn Sie den "Quelltext schreiben"-Knopf betätigen, erzeugt der
  777.    Wizard den Code, der ein Objekt in den Bildschirm einfügen würde,
  778.    das genau das gleiche Layout aufweist wie das von Ihnen
  779.    gestaltete Objekt. Wenn Sie einen Dialog auf diese Weise
  780.    niederschreiben, legen Sie zugleich den Namen der Prozedur fest,
  781.    die diesen Dialog in Ihrem Programm in den Desktop einfügen soll.
  782.    Diesen Prozedurnamen können Sie einem Menübefehl oder einem
  783.    Button in einem anderen Dialog zuordnen.
  784.  
  785.    Der Wizard wird dann in der HandleEvent-Methode der Application
  786.    bzw. an der Stelle, an der der Buttonbefehl ausgewertet werden
  787.    soll, dafür sorgen, daß diese Prozedur aufgerufen und der Dialog
  788.    eingefügt wird.
  789.  
  790.    Es ist auch möglich, Befehlen Prozedurnamen zuzuordnen, bevor
  791.    diese Prozeduren durch den Quelltext für einen Dialog
  792.    implementiert wurden. Der Wizard führt eine Liste der
  793.    Prozedurbezeichner mit und kann somit solche "Forward"
  794.    Deklarationen auflösen. Für alle Prozeduren, die nicht auf die
  795.    beschriebene Weise mit Leben gefüllt wurden, erzeugt der Wizard
  796.    eine Dummy-Funktion, sobald Sie einen Prototypen vorbereiten, so
  797.    daß Sie diesen Prototypen kompilieren und problemlos starten
  798.    können.
  799.  
  800.    Der Testmodus
  801.  
  802.    Turbo Wizard verfügt für die Quelltexterzeugung über einen
  803.    Testmodus, der es Ihnen erlaubt, den Code zu überpfüfen bevor die
  804.    tatsächichen Dateien erzeugt werden. Alle Ausgaben erfolgen in
  805.    diesem Testmodus nicht in Dateien, sondern in ein Textfenster.
  806.    Dies macht es einfacher, Fehler wie z.B. falsch benannte Objekte
  807.    aufzuspüren, bevor Ihre Festplatte unnötigerweise zu digitalem
  808.    Krautsalat fragmentiert wird.
  809.  
  810.    Die Umschaltung erfolgt durch den Menübefehl "Optionen│Ziel".
  811.    Dieser Menübefehl zeigt Ihnen auch an, in welchem Modus Sie sich
  812.    gerade befinden: "SCREEN" signalisiert den Testmodus, "DISK" den
  813.    "realen" Arbeitsmodus.
  814.  
  815.    Die Sharewareversion von Turbo Wizard beinhaltet eine gewisse
  816.    Einschränkung, die allerdings nur für Anwender von Turbo Vision
  817.    2.0 ärgerlich ist: Die Nachkommen von TValidator (Objekten, die
  818.    die Eingaben in einer InputLine überprüfen können) erzeugen nur
  819.    im Testmodus Quelltext. Sie können sich den Quelltext also
  820.    durchaus ansehen und auf seine Qualität überprüfen, um diese
  821.    Objekte allerdings in einem Programm zu benutzen, müssen Sie den
  822.    entsprechenden Text entweder abtippen, oder sich registrieren
  823.    lassen.
  824.  
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.    
  832.  
  833.  
  834.  
  835.                                     - 14 -
  836.  
  837.    Turbo Vision 1.0 oder 2.0 ?
  838.  
  839.  
  840.    Der Menübefehl "Optionen│Turbo Vision" läßt Sie wählen, für
  841.    welche Version von Turbo Vision der Wizard Quelltext erzeugen
  842.    soll. Es existieren folgende Unterschiede:
  843.  
  844.    Version 2.0 erlaubt den Gebrauch von TMultiCheckBoxes und (mit
  845.    der gerade genannten Einschränkung) Validierungsobjekten. In der
  846.    Schalterstellung "Version 1.0" werden die entsprechenden Befehle
  847.    gesperrt.
  848.  
  849.    Modale Dialoge werden in der Version 2.0 nicht mit dem Befehl
  850.    "Desktop^.ExecView(Dialog)", sondern mit
  851.    "Application^.ExecuteDialog(Dialog, <Recordaddresse>)",
  852.    nichtmodale Dialoge nicht mit "Desktop^.Insert(Dialog)" sondern
  853.    mit "Application^.InsertWindow(Dialog)" eingefügt. Diese in
  854.    Turbo Vision 2.0 neu implementierten Methoden des Objektes
  855.    TApplication erlauben einen kürzeren Quelltext und übernehmen
  856.    zudem die Fehlerbehandlung, über einen internen Aufruf von
  857.    "Validview". Die Methode "ExecuteDialog" entfernt zudem das
  858.    Dialogobjekt selbständig vom Heap und organisiert den
  859.    Datenaustausch mit dem Transferrecord. Prinzipiell leistet der
  860.    vom Wizard für die Version 1.0 erzeugte Quelltext das gleiche wie
  861.    der für Turbo Vision 2.0, ist aber etwas länger.
  862.  
  863.    Da ich davon ausgehe, daß wer Turbo Vision 2.0 besitzt auch über
  864.    einen Turbo oder Borland Pascal Compiler der Version 7.xx
  865.    verfügt, wird in den Methoden Store, Load, Init und HandleEvent,
  866.    die der Wizard für abgeleitete Dialoge implementiert, die geerbte
  867.    Methode mit dem Schlüsselwort "inherited" aufgerufen. Dies macht
  868.    es einfacher, Dialoge nicht von TDialog, sondern von einem
  869.    späteren Dialogtypen abzuleiten. Der Wizard erzeugt IMMER
  870.    Quelltext für einen von TDialog abgeleiteten Typen. Durch den
  871.    Gebrauch von "inherited" brauchen Sie den Typbezeichner des
  872.    direkten Vorfahren nur noch in der Deklaration zu ändern statt in
  873.    jeder überschriebenen Methode.
  874.  
  875.  
  876.  
  877.  
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.  
  885.  
  886.  
  887.  
  888.  
  889.  
  890.  
  891.  
  892.  
  893.  
  894.  
  895.    
  896.  
  897.  
  898.  
  899.                                     - 15 -
  900.  
  901.    Der Ressourceneditor
  902.  
  903.  
  904.    Auch wenn es vielleicht naheliegt, das Programm Turbo Wizard
  905.    selbst als Ressourceneditor aufzufassen: im weiteren wird diese
  906.    Bezeichnung ausschließlich für ein bestimmtes Programm benutzt,
  907.    dessen Quelltext der Wizard während der Arbeit an einem Projekt
  908.    erzeugt.
  909.  
  910.    In diesem Quelltext finden sich Prozeduren, die Dialoge,
  911.    Menübalken und Statuszeilen erzeugen und in einer Ressourcendatei
  912.    speichern. Im eigentlichen Zielprogramm, dem Prototypen, werden
  913.    diese Objekte dann aus dieser Ressource geladen und in die
  914.    Arbeitsfläche eingefügt.
  915.  
  916.    Wenn Ihnen das Konzept der Ressourcendateien vom Typ
  917.    TResourceFile noch fremd ist, sollten Sie sich in ihrer
  918.    Compilerdokumentation informieren. Einen gewissen Einstieg gibt
  919.    auch die Onlinehilfe des Wizard.
  920.  
  921.    Kurz und knapp gesagt besteht das Prinzip darin, Objekte nicht
  922.    zur Laufzeit des Programmes zu erzeugen sondern ihre Datenfeldern
  923.    und eine spezielle Identifikationsnummer, die die Interpretation
  924.    dieser Daten ermöglicht, in einer Datei zu speichern und die
  925.    Objekte später aus dieser Datei zu laden. Der Code, den die im
  926.    Programm benötigten Prozeduren zum Laden eines Dialoges aus einer
  927.    Datei einnehmen, ist meist bedeutend kürzer als der Code, der den
  928.    Dialog erstellt. Außerdem ist es auf diese Weise häufig möglich,
  929.    z.B. sprachspezifische Anpassungen vorzunehmen, ohne das Programm
  930.    ändern und neu kompilieren zu müssen.
  931.  
  932.    Damit dieses Konzept funktionieren kann, muß gewährleistet sein,
  933.    daß nur mit der Prozedur RegisterType() registrierte Objekttypen
  934.    in die Ressourcendatei geschrieben werden. Diese Prozedur
  935.    ermöglicht nämlich durch die Zuordnung der eindeutigen
  936.    Identifikationsnummer den Aufruf der richtigen Speicher- und
  937.    Laderoutinen. Die Registrierung aller Standardobjekte und aller
  938.    Dialogtypen, die Sie innerhalb des Wizard neu deklarieren, wird
  939.    automatisch vorgenommen. Wenn Sie allerdings innerhalb eines
  940.    Dialoges einen Objekttypen verwenden, der von "außerhalb" des
  941.    Wizard kommt, müssen Sie selbst dafür sorgen, daß dieser Typ
  942.    sowohl im Ressourceneditor als auch in dem Programm, das die
  943.    Ressource verwendet, registriert wird.
  944.  
  945.  
  946.    Mehr zu den Möglichkeiten, die Quelltexterzeugung zu beeinflussen
  947.    und zu steuern, erfahren Sie in den Kapiteln über Statuszeilen,
  948.    Menübalken und Dialoge.
  949.  
  950.  
  951.  
  952.  
  953.  
  954.  
  955.  
  956.  
  957.  
  958.  
  959.    
  960.  
  961.  
  962.  
  963.                                     - 16 -
  964.  
  965.    Das Hilfekonzept von Turbo Vision und Turbo Wizard
  966.  
  967.    Der Hilfekontext eines Objektes
  968.  
  969.    Eine der Hauptstärken von Turbo Wizard ist die umfangreiche
  970.    Unterstützung des in Turbo Vision implementierten Konzeptes der
  971.    kontextsensitiven Hilfe.
  972.  
  973.    Die Grundlage dieses Konzeptes ist einfach: Jedes Objekt, das auf
  974.    dem Bildschirm erscheint, verfügt über ein Feld "HelpCtx", das
  975.    einen Wert vom Typ Word aufnimmt. Das Programmobjekt TApplication
  976.    ermittelt über seine Methode "GetHelpCtx", welches
  977.    Bildschirmelement gerade fokussiert ist und bestimmt den Inhalt
  978.    dessen HelpCtx-Feldes. Wenn der ermittelte Wert ungleich der
  979.    Konstanten "hcNoContext=0" ist, so stellt dieser Wert den
  980.    aktuellen Kontext dar. Ist er gleich Null, so prüft TApplication
  981.    das entsprechende Feld des Gruppenobjektes, zu dem das
  982.    fokussierte Objekt gehört (zum Beispiel das des Dialoges, in dem
  983.    sich eine gerade fokussierte Eingabezeile befindet), ist auch
  984.    dieses gleich Null geht es weiter mit der Gruppe "DeskTop", zu
  985.    der der Dialog gehört usw. Wird auf diesem Wege durch den
  986.    Abhängigkeitsbaum kein Wert unterschiedlich hcNoContext gefunden
  987.    so ist der aktuelle Programmkontext gleich hcNoContext.
  988.  
  989.    Die Methode TApplication.GetHelpCtx kann explizit aufgerufen
  990.    werden, wenn das Befehlsereignis "cmHelp" eintrifft, um in
  991.    Zusammenarbeit mit einem THelpfile-Objekt eine Hilfetafel zum
  992.    gerade fokussierten Objekt anzuzeigen.
  993.  
  994.    Der Programmkontext wird außerdem in der Methode
  995.    TStatusLine.Update ermittelt, die immer dann, wenn gerade kein
  996.    Ereignis zur Bearbeitung ansteht, die Statuszeile auf ihre
  997.    Zuständigkeit für den aktuellen Kontext überprüft und wenn nötig
  998.    die Darstellung einer anderen Statuszeile mit anderen Befehlen
  999.    veranlasst.
  1000.  
  1001.  
  1002.  
  1003.    Festlegung des Hilfekontext
  1004.  
  1005.    Für die allermeisten Objekten, mit denen Sie im Wizard umgehen,
  1006.    können Sie explizit einen Hilfekontext angeben. Üblicherweise
  1007.    arbeiten Sie dabei mit Konstantenbezeichnern, deren erste zwei
  1008.    Buchstaben zu besseren Identifikation "hc" lauten. Sie brauchen
  1009.    nur irgendwelche sinnvollen Namen eizugeben, der Wizard
  1010.    deklariert die Konstanten automatisch. Den Wertebereich neuer
  1011.    Hilfekonstanten können Sie bestimmen, indem Sie im Menü
  1012.    "Optionen│Einstellungen" die untere Grenze bestimmen. Jeder
  1013.    weitere Kontext erhält dann einen um eins inkrementierten Wert
  1014.    zugewiesen. Um Überschneidungen zu vermeiden können Sie diese
  1015.    Basis während der Arbeit an einem Projekt nur erhöhen, nicht
  1016.    verringern.
  1017.  
  1018.    Bei Schalterfeldern wie TCheckBoxes und TRadioButtons bestimmt
  1019.    sich der tatsächlich von GetHelpCtx ermittelte Hilfekontext aus
  1020.    der Summe des Wertes im Feld HelpCtx und der Nummer des gerade
  1021.    fokussierten Schalters, wobei die Zählung bei Null beginnt. Das
  1022.  
  1023.    
  1024.  
  1025.  
  1026.  
  1027.                                     - 17 -
  1028.  
  1029.    macht es möglich, jedem Schalter eine eigene Hilfe zuzuweisen,
  1030.    gleichzeitig ist es aber auch notwendig, eine entsprechende
  1031.    Anzahl an Kontexten zu reservieren, um zu verhindern, daß ein
  1032.    Schalter den gleichen Kontext ermittelt wie ein Objekt, das kurz
  1033.    nach ihm eingefügt wurde. Auch diese Aufgabe übernimmt der Wizard
  1034.    automatisch.
  1035.  
  1036.  
  1037.    Die Funktion TStatusLine.Hint(AHelpCtx): String;
  1038.  
  1039.  
  1040.    Diese Funktion liefert ebenfalls Ergebnisse, die vom aktuellen
  1041.    Programmkontext abhängig sind. Wenn ihr Ergebnis ungleich einem
  1042.    Leerstring ist, wird der zurückgegebene Ausdruck in der
  1043.    Statuszeile ausgegeben, durch ein Trennzeichen von den
  1044.    Befehlseinträgen abgegrenzt. Im Original gibt sie immer einen
  1045.    leeren String zurück, der Wizard überschreibt Sie für seine
  1046.    Statuszeile vom Typ TWStatusLine so, daß das Ergebnis zu jedem
  1047.    Programmkontext einen anderen Hinweis (engl. "hint") liefern
  1048.    kann.
  1049.  
  1050.    Der Hilfecompiler TVHC.EXE
  1051.  
  1052.  
  1053.    Das Programm TVHC.EXE, das den Turbo und Borland Pascal Compilern
  1054.    ab Version 6.0 im Quelltext beiliegt, kompiliert eine speziell
  1055.    vorbereitete ASCII-Textdatei zu einer Hilfedatei, auf die über
  1056.    ein Objekt vom Typ THelpFile zugegriffen werden kann, um
  1057.    Hilfetafeln zu bestimmten Programmkontexten anzuzeigen. Die
  1058.    einzelnen Abschnitte werden dabei mit dem Schlüsselwort ".Topic"
  1059.    (der Punkt ist wichtig) eingeleitet, dem ein Wort bis zu einer
  1060.    Länge von zwanzig Buchstaben folgen kann. Diesem Bezeichner wird
  1061.    vom Hilfecompiler TVHC ein Index zugeordnet, über den auch
  1062.    Querverweise von anderen Stellen des Textes aus zu diesem Eintrag
  1063.    ermöglicht werden. Um einen Querverweis zu einem Topic im Text zu
  1064.    markieren, muß man das Schlüsselwort in geschweifte Klammern
  1065.    einfassen. Man kann diesem Schlüsselwort auch eine andere
  1066.    Textstelle zuordnen, indem man die beiden Ausdrücke mit einem
  1067.    Doppelpunkt zuordnet. So verzweigen beispielsweise die Ausdrücke
  1068.  
  1069.    {Inhalt} und {Inhaltsverzeichnis des Textes:Inhalt}
  1070.  
  1071.    beide zu einem Topic unter dem Bezeichner Inhalt.
  1072.  
  1073.    Alle Schlüsselwörter werden von TVHC, um die Buchstaben "hc"
  1074.    ergänzt, als Konstantenbezeichner in einer Unit deklariert. Dabei
  1075.    erfolgt die Wertezuweisung genau wie innerhalb des Wizard:
  1076.    Beginnend bei einem bestimmten Wert, der explizit zugewiesen
  1077.    werden muß, ansonsten gleich eins ist, wird dieser Wert mit jedem
  1078.    neuen Topic inkrementiert. Sie können, wie z.B. in der Anweisung
  1079.    ".Topic ANewLevel=1000", diese Basis innerhalb des Textes ändern.
  1080.  
  1081.    Beachten Sie bitte, daß sich das Format der Hilfedateien, die
  1082.    TVHC erzeugt, mit der Turbo Vision Version 2.0 gegenüber der
  1083.    Version 1.0 geändert hat. Ein Programm, daß die Unit HelpFile aus
  1084.    Version 2.0 einbindet kann daher Hilfedateien, die mit TVHC 1.0
  1085.    erzeugt wurden, nicht lesen.
  1086.  
  1087.    
  1088.  
  1089.  
  1090.  
  1091.                                     - 18 -
  1092.  
  1093.  
  1094.  
  1095.    Der Hilfeeditor des Turbo Wizard
  1096.  
  1097.  
  1098.    Immer, wenn Sie einem Objekt im Wizard einen neuen Hilfekontext
  1099.    zuweisen, erzeugt dieser in der Projektdatei einen
  1100.    "Hilfetextrumpf". Dieser beinhaltet eine Überschrift, die an die
  1101.    Art des Objektes angepaßt ist, dem der Hilfekontext zugeordnet
  1102.    wurde, sowie provisorische Einträge in das Inhaltsverzeichnis und
  1103.    in den Index der Hilfe. Sie können diese Einträge entweder sofort
  1104.    für jeden neuen Hilfekontext oder aber später bearbeiten (Sie
  1105.    können das Verhalten über den Menübefehl "Optionen│Einstellungen"
  1106.    einstellen). Um einen vorhandenen Hilfetext zu bearbeiten lassen
  1107.    Sie sich über "Projekt│Deklarationen..." eine Liste der gültigen
  1108.    Hilfekontexte anzeigen. Wenn Sie auf einen der Eintrage
  1109.    doppelklicken öffnet sich der Hilfeeditor (die Liste enthält
  1110.    allerdings auch einige reservierte Einträge wie "hcNoContext"
  1111.    oder "hcDragging", die Sie nicht editieren können).
  1112.  
  1113.    Im Hilfeeditor können Sie:
  1114.  
  1115.    ■ Einen Eintrag ins Inhaltsverzeichnis vornehmen. Das
  1116.    Inhaltsverzeichnis ist die Hilfetafel, die in mit Turbo Wizard
  1117.    erzeugten Programmen angezeigt wird, wenn kein spezieller
  1118.    Hilfekontext vorliegt.
  1119.  
  1120.    ■ Einen oder mehrere Einträge in den Index vornehmen. Der Index
  1121.    wird vom Wizard als alphabetisch sortierte Liste all dieser
  1122.    Einträge angelegt. Ein Eintrag in den Index stellt dabei einen
  1123.    Querverweis auf diesen Hilfekontext dar. Das Inhaltsverzeichnis
  1124.    verweist in seinem ersten Eintrag auf diesen Index. Um für einen
  1125.    Kontext mehrere Einträge in den Index vorzunehmen, müssen Sie die
  1126.    entsprechenden Worte mit einem Schrägstrich ("/") trennen.
  1127.  
  1128.    ■ Den Text der anzuzeigenden Hilfetafel eingeben. Machen Sie sich
  1129.    um die Textbreite keine Sorgen: alle Zeilen, die nicht mit einem
  1130.    Leerzeichen beginnen, werden automatisch auf die jeweils für die
  1131.    Hilfetafel richtige Breite umgebrochen.
  1132.  
  1133.    ■ Neue, zusätzliche Hilfekontexte definieren. Über einen Button
  1134.    "Querverweis erstellen" können Sie direkt eine weitere Version
  1135.    des Hilfeeditors aufrufen und einen Querverweis erstellen.
  1136.    Beachten Sie die oben beschriebenen Syntaxregeln für Querverweise
  1137.    im Hilfetext. Die Überschrift ".Topic <topicname>" müssen Sie
  1138.    übrigens in keinem Fall eingeben, das erledigt der Wizard für
  1139.    Sie.
  1140.  
  1141.    ■ Den "Hint" (s.o.) für den jeweiligen Hilfekontext angeben.
  1142.  
  1143.    Bei der Vorbereitung eines Prototypen über den Menübefehl
  1144.    "Projekt│Prototyp vorbereiten" erzeugt der Wizard aus all diesen
  1145.    Eingaben einen Hilfetext, der den Anforderungen von TVHC genügt.
  1146.    Die Hilfekontextbezeichner werden allerdings nicht über die Unit,
  1147.    die TVHC erzeugt, sondern über eine vom Wizard erstellte
  1148.    Includedatei ins Programm eingebunden, um einen Test des
  1149.    Prototypen schon zu ermöglichen, bevor der Hilfetext kompiliert
  1150.  
  1151.    
  1152.  
  1153.  
  1154.  
  1155.                                     - 19 -
  1156.  
  1157.    wird. Wenn Sie keine Änderungen an der vom Wizard erzeugten
  1158.    Textdatei vorgenommen haben, ist die Wertezuweisung sowieso
  1159.    vollständig identisch. Falls Sie durch Einfügen weiterer Topics
  1160.    in einem Editor außerhalb des Wizard neue Hilfekontexte erzeugen
  1161.    oder (was nicht empfehlenswert ist) die numerische Ordnung der
  1162.    Konstanten ändern, müssen Sie die entsprechende Includeanweisung
  1163.    löschen und dafür die von TVHC erzeugte Unit mit "uses"
  1164.    einbinden. Generell ist es immer empfehlenswert, derartig
  1165.    importierte Topics an das Ende der Datei anzuhängen. Bei sehr
  1166.    komplexen Texten mit langen Indexlisten kann es übrigens
  1167.    vorkommen, daß sich TVHC verschluckt und den Rechner aufhängt.
  1168.  
  1169.    Außerdem sollten Sie leere geschweifte Klammern "{}" unbedingt
  1170.    vermeiden. Da TVHC mit dynamischen Strings arbeitet, aber an
  1171.    einigen Stellen nicht überprüft, ob auch tatsächlich Speicher
  1172.    alloziert wurde, führt eine solche Textstelle zu Unsinn, im
  1173.    Protected Mode zu einem Ausnahmefehler und häufig auch zu einem
  1174.    saftigen Absturz mit optionaler Beschädigung der
  1175.    Dateizuordnungstabelle...
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.  
  1192.  
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.  
  1199.  
  1200.  
  1201.  
  1202.  
  1203.  
  1204.  
  1205.  
  1206.  
  1207.  
  1208.  
  1209.  
  1210.  
  1211.  
  1212.  
  1213.  
  1214.  
  1215.    
  1216.  
  1217.  
  1218.  
  1219.                                     - 20 -
  1220.  
  1221.    Die Prozedur ShowHelp
  1222.  
  1223.  
  1224.    Mit dem Wizard erhalten Sie die Units XHelp60.tpu für die
  1225.    Verwendung mit Turbo Pascal 6.0 sowie XHelp70.tpu und XHelp70.tpp
  1226.    für die Verwendung mit Turbo bzw. Borland Pascal 7.0.
  1227.  
  1228.    Diese Units stellen ein Hilfefenster zur Verfügung, das gegenüber
  1229.    derm Fenster THelpWindow aus der Unit HelpFile einige
  1230.    Verbesserungen aufweist:
  1231.  
  1232.    ■ Die Farbpalette wurde angepaßt, so daß das Hilfefenster das
  1233.    gleiche Aussehen erhält wie die Hilfefenster in der Pascal-IDE.
  1234.  
  1235.    ■ Das Fenster reagiert auf Tastatureingaben, wie Sie es aus dem
  1236.    Index des Pascal-Hilfesystems gewöhnt sind: Unter den
  1237.    Querverweisen wird nach dem gerade eingegebenen Buchstaben
  1238.    gesucht. Wird ein Begriff gefunden, der mit diesem Buchstaben
  1239.    beginnt, so springt der Cursor zu diesem Begriff, bei der
  1240.    nächsten Tastatureingabe wird auf das Vorkommen des Buchstaben
  1241.    als zweiter Buchstabe im Schlüsselwort getestet u.s.w.
  1242.  
  1243.    ■ Das Fenster verfügt über eine ringförmige Liste von dreissig
  1244.    Hilfekontexten. In dieser Liste wird die "Geschichte" eines
  1245.    Hilfefensters, also alle Hilfekontexte, die in diesem Fenster
  1246.    betrachtet wurden, gespeichert. Wenn ein Hilfefenster den Befehl
  1247.    "cmLastTopic=201" erhält, so geht es in dieser Liste jeweils
  1248.    einen Schritt zurück und zeigt die entsprechende Tafel an. Sie
  1249.    können also wieder zurück zum ursprünglichen Thema, nachdem Sie
  1250.    sich einen Querverweis angesehen haben.
  1251.  
  1252.    ■ Wenn Sie ein Hilfefenster öffnen, können Sie ihm nicht nur
  1253.    mitteilen, welche Hilfetafel es direkt anzuzeigen hat, Sie können
  1254.    ihm auch einen Hilfekontext übergeben, zu dem es wechseln soll,
  1255.    wenn es erneut den Befehl "cmHelp" erhält. In den Prototypen, die
  1256.    der Wizard erzeugt, wird dann zum Inhaltsverzeichnis gewechselt
  1257.    (es könnte aber auch direkt zum Index gehen).
  1258.  
  1259.  
  1260.    Das Einfügen dieses verbesserten Hilfefensters geschieht über die
  1261.    Prozedur ShowHelp, und hier liegt eine Einschränkung der
  1262.    Sharewareversion: Da Typ und Name des Hilfefensters nicht
  1263.    exportiert werden, haben Sie keine Möglichkeit, die Titelzeile
  1264.    des Fensters zu ändern. Die lautet nämlich immer "Turbo
  1265.    Wizard-Hilfe". Wenn Sie sich allerdings registrieren lassen
  1266.    erhalten Sie eine andere Unit, die Ihnen die Angabe einer eigenen
  1267.    Titelzeile und auch die Ableitung eigener Hilfefensterobjekte
  1268.    erlaubt.
  1269.  
  1270.    Die Syntax von ShowHelp lautet:
  1271.  
  1272.    Procedure ShowHelp(aHelpFile: PathStr; AHelpCtx, ADefaultTopic:
  1273.    Word);
  1274.  
  1275.    Dabei sind
  1276.  
  1277.    ▌AHelpFile: der Name der Hilfedatei,
  1278.  
  1279.    
  1280.  
  1281.  
  1282.  
  1283.                                     - 21 -
  1284.  
  1285.  
  1286.    ▌AHelpCtx: der Hilfekontext, zu dem die erste Tafel angezeigt
  1287.    werden soll,
  1288.  
  1289.    ▌ADefaultTopic: der Hilfekontext, zu dem gesprungen werden soll,
  1290.    wenn das Fenster den Befehl cmHelp erhält.
  1291.  
  1292.    Der Hilfekontext des Hilfefensters selbst ist
  1293.    "hcHelpWindow=4999". Sie sollten in Ihrem Programm eine
  1294.    Statuszeile vorsehen, die nur für hcHelpWindow gilt und die
  1295.    Befehle cmHelp, cmLastTopic und cmZoom enthält.
  1296.  
  1297.  
  1298.  
  1299.  
  1300.  
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.  
  1325.  
  1326.  
  1327.  
  1328.  
  1329.  
  1330.  
  1331.  
  1332.  
  1333.  
  1334.  
  1335.  
  1336.  
  1337.  
  1338.  
  1339.  
  1340.  
  1341.  
  1342.  
  1343.    
  1344.  
  1345.  
  1346.  
  1347.                                     - 22 -
  1348.  
  1349.    Statuszeilen
  1350.  
  1351.  
  1352.    Wenn Sie mit dem Befehl "Objekte│StatusLine" eine Statuszeile
  1353.    einfügen, so erscheint zunächst eine leere, neue Statuszeile im
  1354.    unteren Viertel des Bildschirms.
  1355.  
  1356.    Wenn Sie diese Zeile mit dem RMB anklicken öffnet sich ein
  1357.    Dialog, der die Eingabe des minimalen und des maximalen
  1358.    Programmkontextes erlaubt, in dem diese Zeile angezeigt werden
  1359.    soll. In der Voreinstellung sind diese Grenzen "hcNoContext=0"
  1360.    und "hcEveryContext=65535", diese Statuszeile kann also zu jedem
  1361.    Zeitpunkt des Programmes gültig sein. Sie finden in diesem Dialog
  1362.    auch Knöpfe, um Befehlseinträge in diese Zeile vorzunehmen
  1363.    ("Eintrag"), die Statuszeile auf Platte zwischenzuspeichern,
  1364.    ("Speichern"), ihren Quelltext erzeugen zu lassen ("Schreiben"),
  1365.    ein weitere Statuszeile für einen anderen Zuständigkeitsbereich
  1366.    anzulegen ("Neue Zeile"), zwischen den einzelnen Statuszeilen zu
  1367.    blättern ("Nächste") oder die Statuszeile zu löschen.
  1368.  
  1369.  
  1370.    Reihenfolge und Auswertung der Statuszeilen
  1371.  
  1372.    Das Viewobjekt TStatusLine und seine Nachfahren verwalten eine
  1373.    einfach verkettete Liste von Records des Typs TStatusDef. Ein
  1374.    TStatusDef-Record enthält die Felder Min und Max für die Grenzen
  1375.    der kontextabhängigen Zuständigkeit, einen Zeiger auf den
  1376.    nächsten TStatusDef in der Liste und einen Zeiger auf eine Liste
  1377.    von Befehlseinträgen. TStatusLine verfügt außerdem noch über das
  1378.    Feld Item, das ebenfalls einen Zeiger auf eine Liste von
  1379.    Befehlseinträgen enthält. Wenn sich der Programmkontext ändert,
  1380.    überprüft TStatusLine, welches TStatusDef zuständig ist, indem es
  1381.    sich an der Liste von TStatusDefs "entlanghangelt" bis der
  1382.    aktuelle Programmkontext zwischen den ermittelten Min- und
  1383.    Max-Werten liegt oder das Ende der Liste erreicht ist. Wird ein
  1384.    passender TStatusDef-Record gefunden, so wird dessen Befehlsliste
  1385.    in das Feld Item übertragen und genau diese Liste von Befehlen
  1386.    dargestellt.
  1387.  
  1388.    Sie brauchen diese Vorgehensweise nicht in allen Einzelheiten
  1389.    verstanden zu haben, wichtig ist allein folgendes Ergebnis:
  1390.  
  1391.    Wenn eine Statuszeile, deren Kontextbereich nur eine Teilmenge
  1392.    des Kontextbereiches einer zweiten Statuszeile ist, in der
  1393.    TStatusDef-Liste vor dieser zweiten steht, so wird sie
  1394.    dargestellt, sobald der Programmkontext in ihren
  1395.    Zuständigkeitsbereich fällt. Steht sie aber hinter dieser zweiten
  1396.    Statuszeile, so wird sie niemals dargestellt werden.
  1397.  
  1398.    Der Wizard baut nun die Liste von TStatusDef derartig auf, daß
  1399.    jede neue Statuszeile VOR allen bereits bestehenden TStatusDef
  1400.    eingefügt wird.
  1401.  
  1402.    Sie müssen daher zuallererst die allgemeinste Statuszeile
  1403.    entwerfen, z.B. indem Sie in die leere Statuszeile mit ihrem
  1404.    Kontextbereich von hcNoContext bis hcEveryContext lediglich den
  1405.    Befehl "Hilfe", cmHelp eintragen. Damit können Sie sicher sein,
  1406.  
  1407.    
  1408.  
  1409.  
  1410.  
  1411.                                     - 23 -
  1412.  
  1413.    daß zu jedem Programmzeitpunkt, für den keine eigene, speziellere
  1414.    Statuszeile gebraucht wird, die Hilfefunktion verfügbar ist.
  1415.  
  1416.    Legen Sie nun eine zweite, zunächst leere Statuszeile für einen
  1417.    eingeschränkteren Hilfekontextbereich an. Stellen Sie sich z.B.
  1418.    vor, Sie würden den Dialog "Compiler-Optionen" der Pascal-IDE neu
  1419.    entwerfen. Die meisten Programmierer wechseln hier zwischen zwei
  1420.    verschiedenen Einstellungsarten: Größtmögliche Sicherheit während
  1421.    der Programmentwicklung (inklusive Erzeugung von Informationen
  1422.    für den Debugger) und größtmögliche Geschwindigkeit bzw.
  1423.    kleinstmögliche EXE-Datei für das fertige Programm. Wenn Sie
  1424.    zwischen diesen Einstellungen wählen möchten, müssen Sie
  1425.    normalerweise eine ganze Menge Schalter umstellen. Wenn Sie
  1426.    dagegen eine Statuszeile entwerfen, die genau auf den
  1427.    Kontextbereich dieses Dialoges mit all seinen verschiedenen
  1428.    Schaltfeldern zugeschnitten ist, können Sie in diese Zeile zwei
  1429.    Schalter aufnehmen, die dem Dialog jeweils den Befehl schicken,
  1430.    eine dieser beiden Standardeinstellungen durchzuführen und sich
  1431.    dann neu darzustellen, um vielleicht noch ein "Feintuning"
  1432.    vorzunehmen (es sei nicht verschwiegen, daß Sie dafür natürlich
  1433.    auch die HandleEvent-Methode des Dialoges überschreiben müssen).
  1434.  
  1435.    Zuletzt legen Sie eine Statuszeile für den Gebrauch des
  1436.    Hilfefensters an. Setzen Sie dafür sowohl die untere wie auch die
  1437.    obere Grenze des Zuständigkeitsbereiches auf hcHelpWindow und
  1438.    fügen Sie die Befehle "cmHelp", "cmLastTopic" und "cmZoom" ein.
  1439.  
  1440.    Wenn Sie nun die Quelltexterzeugung auslösen, indem Sie im
  1441.    Eigenschaftendialog der Statuszeile den entsprechenden Knopf
  1442.    drücken, konstruiert der Wizard die gesamte Statuszeile so, daß
  1443.    zuerst die spezielleren, zum Schluß die allgemeineren
  1444.    Statuszeilen eingefügt werden.
  1445.  
  1446.    Es ist übrigens möglich, Befehle in die Statuszeile einzufügen,
  1447.    ohne dafür einen Texteintrag vorzusehen. Turbo Wizard selbst
  1448.    enthält in der Statuszeile immer den Befehl "cmNext", der durch
  1449.    die Taste F6 ausgelöst wird und (wenn möglich) das jeweils
  1450.    nächste Fenster selektiert. Der Vorteil eines solchen
  1451.    "versteckten" Befehls ist, daß in der Statuszeile mehr Platz für
  1452.    die Hinweise der Funktion Hint bleibt. andererseits sollte man so
  1453.    etwas natürlich nur mit Befehlen machen, deren Hotkeys aus
  1454.    irgendeinem "Industriestandard" gut bekannt sind und auch keinen
  1455.    Schaden anrichten. Die Taste F1 mit dem versteckten Befehl
  1456.    "Festplatte formatieren" zu verbinden wäre beispielweise keine
  1457.    gute Idee.
  1458.  
  1459.  
  1460.  
  1461.  
  1462.  
  1463.  
  1464.  
  1465.  
  1466.  
  1467.  
  1468.  
  1469.  
  1470.  
  1471.    
  1472.  
  1473.  
  1474.  
  1475.                                     - 24 -
  1476.  
  1477.    Grenzen und Probleme bei Statuszeilen
  1478.  
  1479.  
  1480.    Sie können weder einen einmal eingefügten Befehl, noch eine
  1481.    einzelne Statuszeile vom Typ TStatusDef löschen. Der Wizard
  1482.    löscht immer die gesamte Konstruktion. Da Ihnen aber der
  1483.    Quelltext zur Verfügung steht, werden Sie diesen Mangel
  1484.    hoffentlich verschmerzen können.
  1485.  
  1486.    Der Quelltext einer Statuszeile
  1487.  
  1488.  
  1489.    Der Wizard überschreibt in der Datei <ProjectName>STL.INC die
  1490.    Methode TApplication.InitStatusLine. Wenn Sie bestimmt haben, daß
  1491.    die Statuszeile aus einer Ressource geladen werden soll, wird
  1492.    hier die Methode ResFile.Get('STATUSLINE') aufgerufen, ansonsten
  1493.    finden Sie hier die Anweisungen, die die Statuszeile erstellen.
  1494.    Bei Ressourcenobjekten wird diese Konstruktion in der Datei
  1495.    MAKESTAT.INR vorgenommen, und das so zusammengestellte Objekt
  1496.    unter dem Namen "STATUSLINE" in der Ressource <ProjectName>.RES
  1497.    gespeichert. Die Prozedur, die dies tut heißt "MakeStatusLine".
  1498.  
  1499.  
  1500.  
  1501.  
  1502.  
  1503.  
  1504.  
  1505.  
  1506.  
  1507.  
  1508.  
  1509.  
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.  
  1516.  
  1517.  
  1518.  
  1519.  
  1520.  
  1521.  
  1522.  
  1523.  
  1524.  
  1525.  
  1526.  
  1527.  
  1528.  
  1529.  
  1530.  
  1531.  
  1532.  
  1533.  
  1534.  
  1535.    
  1536.  
  1537.  
  1538.  
  1539.                                     - 25 -
  1540.  
  1541.    Menübalken
  1542.  
  1543.  
  1544.    Der Befehl "Objekte│MenuBar" fügt im oberen Drittel des
  1545.    Bildschirms einen zunächst leeren Menübalken ein. Wenn Sie diesen
  1546.    mit dem RMB anklicken öffnet sich ein Dialog, der Ihnen den
  1547.    Eintrag eines Menüs erlaubt und zugleich auch Knöpfe enthält, um
  1548.    die Quellteterzeugung auszulösen, die Menükonstruktion in einer
  1549.    Datei zu speichern oder zu löschen.
  1550.  
  1551.    Wenn Sie einen Eintrag ins Menü vorgenommen haben können Sie
  1552.    diesen wiederum mit dem RMB anklicken um einen anderen Dialog zu
  1553.    öffnen, der den Eintrag von Menübefehlen und Trennlinien sowie
  1554.    das Löschen des Menüs erlaubt. Die Markierung der Taste, die den
  1555.    Menübefehl aktiviert erfolgt (wie auch bei Buttons oder Labels)
  1556.    durch das Einfassen des entsprechenden Buchstabens in
  1557.    Tildezeichen (~). Der Eintrag eines Untermenüs ist (noch) nicht,
  1558.    bzw. nur "manuell" im Quelltext möglich.
  1559.  
  1560.    Mit jedem Menübefehl können Sie den Namen einer Prozedur
  1561.    verknüpfen. Diese Prozedurnamen werden vom Wizard gesammelt und
  1562.    bei der Vorbereitung eines Prototyps in der HandleEvent-Methode
  1563.    der Application dem entsprechenden Befehl zugeordnet (mehr über
  1564.    die Implementation dieser Methode erfahren Sie weiter unten).
  1565.    Diese Zuordnung ist allerdings nicht mit einem bestimmten
  1566.    Menübalken verbunden. Wenn Sie also in irgendeiner
  1567.    Menükonstruktion Zuordnungen vorgenommen haben, den Balken dann
  1568.    aber wieder verwerfen und löschen und ein anderes Menü
  1569.    implementieren, werden in die HandleEvent-Methode ALLE
  1570.    Zuordnungen aufgenommen. Dies kann natürlich unerwartete und auch
  1571.    unerwünschte Ergebnisse mit sich bringen, es macht es aber auch
  1572.    möglich, so wie Turbo Wizard selbst mit mehreren verschiedenen
  1573.    Menübalken zu arbeiten, die abhängig vom Programmkontext aus
  1574.    einer Ressource geladen werden. Im Kapitel "Die Methode
  1575.    Application.HandleEvent" erfahren Sie mehr über die Bearbeitung
  1576.    von Befehls/Prozedurzuordnungen.
  1577.  
  1578.  
  1579.  
  1580.  
  1581.  
  1582.  
  1583.  
  1584.  
  1585.  
  1586.  
  1587.  
  1588.  
  1589.  
  1590.  
  1591.  
  1592.  
  1593.  
  1594.  
  1595.  
  1596.  
  1597.  
  1598.  
  1599.    
  1600.  
  1601.  
  1602.  
  1603.                                     - 26 -
  1604.  
  1605.    Der Quelltext eines Menübalkens
  1606.  
  1607.  
  1608.    Der Wizard überschreibt in der Datei <ProjectName>MNU.INC die
  1609.    Methode TApplication.InitMenuBar. Wenn Sie bestimmt haben, daß
  1610.    der Menübalken aus einer Ressource geladen werden soll, wird hier
  1611.    die Methode ResFile.Get('MENUBAR') aufgerufen, ansonsten finden
  1612.    Sie hier die Anweisungen, die den Menübalken zusammenstellen. Bei
  1613.    Ressourcenobjekten wird diese Konstruktion dagegen in der Datei
  1614.    MAKEMENU.INR vorgenommen und das so zusammengestellte Objekt
  1615.    unter dem Namen "MENUBAR" in der Ressource <ProjectName>.RES
  1616.    gespeichert.
  1617.  
  1618.    Die Prozedur, die dies tut heißt "MakeMenuBar".
  1619.  
  1620.    Die Prozedur TApplication.HandleEvent wird in der Includedatei
  1621.    <ProjectName>EVH.INC implementiert, allerdings erst, wenn Sie den
  1622.    Menübefehl "Projekt│Prototyp vorbereiten" wählen.
  1623.  
  1624.  
  1625.  
  1626.  
  1627.  
  1628.  
  1629.  
  1630.  
  1631.  
  1632.  
  1633.  
  1634.  
  1635.  
  1636.  
  1637.  
  1638.  
  1639.  
  1640.  
  1641.  
  1642.  
  1643.  
  1644.  
  1645.  
  1646.  
  1647.  
  1648.  
  1649.  
  1650.  
  1651.  
  1652.  
  1653.  
  1654.  
  1655.  
  1656.  
  1657.  
  1658.  
  1659.  
  1660.  
  1661.  
  1662.  
  1663.    
  1664.  
  1665.  
  1666.  
  1667.                                     - 27 -
  1668.  
  1669.    Dialoge
  1670.  
  1671.  
  1672.    Grundsätzliche Optionen
  1673.  
  1674.  
  1675.    Sie können einen Dialog in ganz unterschiedlicher Weise Quelltext
  1676.    erzeugen lassen. Die Einstellung der im folgenden besprochenen
  1677.    Optionen geschieht direkt vor der Codeproduktion in einem Dialog,
  1678.    der erscheint wenn Sie im Eigenschaftendialog den Knopf
  1679.    "Quelltext erzeugen" drücken.
  1680.  
  1681.    Die hauptsächlichen Möglichkeiten sind:
  1682.  
  1683.    ■ Prozedur zum Einfügen erzeugen. Wenn diese Option gewählt ist
  1684.    erzeugt der Wizard im Prototypen eine Prozedur, die den Dialog in
  1685.    den Desktop einfügt und nimmt diese Prozedur in die Liste der
  1686.    Prozeduren auf, die Sie einem Menübefehl oder einem Buttonbefehl
  1687.    zuordnen können. Die Art der Prozedur ist davon abhängig, ob Sie
  1688.    einen modalen oder einen nichtmodalen Dialog erzeugen möchten. Im
  1689.    ersten Fall wird der Dialog mir der Anweisung
  1690.    "Result:=DeskTop^.ExecView(Dialog)" bzw. (für Turbo Vision 2.0)
  1691.    "Result:=application^.ExecuteDialog(Dialog)", im zweiten Fall mit
  1692.    "DeskTop^.Insert(Dialog)" bzw "application^.InsertWindow(Dialog)"
  1693.    eingefügt. Die Prozedur wird in der Includedatei
  1694.    <ProjectName>PRC.INC implementiert.
  1695.  
  1696.    ■ Objekttypen deklarieren. Wenn diese Option gewählt ist (sie
  1697.    kann natürlich mit der Erzeugung einer Prozedur kombiniert
  1698.    werden), deklariert der Wizard den Dialog als einen neuen, von
  1699.    TDialog abgeleiteten Typen. Der Name dieses Typen wird zuvor im
  1700.    Eigenschaftendialog festgelegt, die mehrfache Verwendung des
  1701.    gleichen Bezeichners wird vom Wizard angemeckert, ist prinzipiell
  1702.    erlaubt und verursacht bei Compilierung des unveränderten
  1703.    Quelltextes natürlich einen Compilerfehler. Die Deklaration eines
  1704.    Dialogtypen umfaßt folgende Vorgänge:
  1705.  
  1706.    1.Deklaration des Zeigertyps. Hierzu wird dem angegebenen
  1707.    Typbezeichner ein "P" vorangestellt.
  1708.  
  1709.    2.Deklaration des Objektes. Hierzu wird dem angegebenen
  1710.    Typbezeichner ein "T" vorangestellt. Der Wizard überschreibt die
  1711.    Methoden Load, Store und HandleEvent, wenn dies gewünscht wird
  1712.    auch den Constructor Init. Diese Methoden werden in der
  1713.    Includedatei <ProjectName>PRC.INC implementiert. Alle Elemente
  1714.    des Dialoges, deren Namen Sie ein Ausrufezeichen vorangestellt
  1715.    haben, werden als Felder (Zeigertypen) in den Dialog aufgenommen
  1716.    und in den Methoden Load und Store mit GetSubViewPtr bzw
  1717.    PutSubViewPtr richtig zugewiesen.
  1718.  
  1719.    3.Die Deklaration eines TStreamRec zur Registrierung dieses
  1720.    Objekttypen und die Aufnahme des Typen in die Liste der Dialoge,
  1721.    die vom Prototypen zur Verwendung in einem Stream registriert
  1722.    werden. Diese Vorkehrung erlaubt es, ohne weitere Vorkehrungen
  1723.    und Eingriffe in den Quelltext auch solche selbstdefinierten
  1724.    Objekte in einer Ressourcendatei zu speichern, solange in ihnen
  1725.    keine abgeleiteten Dialogelemente enthalten sind. Die Typen-ID,
  1726.  
  1727.    
  1728.  
  1729.  
  1730.  
  1731.                                     - 28 -
  1732.  
  1733.    die dabei verwendet wird, können Sie unter
  1734.    "Optionen│Einstellungen" vorgeben. Sie wird für jeden neuen Typen
  1735.    automatisch um eins inkrementiert.
  1736.  
  1737.    Folgende Einstellungen beeinflussen weiterhin die Art des
  1738.    Quelltext:
  1739.  
  1740.    ■ Dialog im Constructor oder in der Prozedur zusammenstellen: Im
  1741.    allgemeinen ist es üblich, abgeleiteten Dialogobjekten einen
  1742.    Constructor mitzugeben, der sämtliche Elemente des Dialoges
  1743.    einfügt. Diese Vorgehensweise ist unter den Aspekten der Wartung
  1744.    bestehenden Codes und der Datenkapselung günstig, denn sie
  1745.    entspricht am ehesten dem Prinzip, daß die Felder eines Objekt
  1746.    vorzugsweise von eigenen Methoden modifiziert werden sollten. Die
  1747.    andere Vorgehensweise besteht darin, dem Dialog keinen eigenen
  1748.    Constructor Init zu geben sondern den geerbten Constructor
  1749.    aufzurufen und in diesen "leeren" Dialog innerhalb der Prozedur,
  1750.    die den Dialog einfügt oder in einer Ressource speichert, mit
  1751.    Elementen zu füllen (so wie es geschieht, wenn kein neuer
  1752.    Dialogtyp abgeleitet , sondern nur eine Prozedur geschrieben
  1753.    wird). Dies ist nicht die empfohlene Methode, und eigentlich nur
  1754.    selten sinnvoll. Ein Vorteil besteht meist nur darin, daß der
  1755.    Quelltext des Programms zusätzlich verkürzt wird, wenn ein
  1756.    solcher Dialog im Ressourceneditor erzeugt wird. Die Größe der
  1757.    EXE-Datei und der verfügbare Arbeitsspeicher werden durch einen
  1758.    Constructor Init, der nicht aufgerufen wird, weil der Dialog
  1759.    stattdessen aus einer Ressource geladen wird, nicht negativ
  1760.    beeinflußt, denn der Linker von Pascal entfernt diesen toten Code
  1761.    automatisch. Eine andere Anwendung dieser Technik läge darin, von
  1762.    einem so gestalteten Dialog einen Nachfahren abzuleiten, der
  1763.    einige Methoden übernehmen, aber ein anderes Erscheinungsbild
  1764.    aufweisen soll. Der geerbte Constructor würde diese Absicht
  1765.    natürlich unterlaufen. Hier ist es aber oft sinnvoller, zunächst
  1766.    einen abstrakten Vorfahren ohne definiertes Erscheinungsbild zu
  1767.    deklarieren und von diesem dann beide Dialoge abzuleiten.
  1768.  
  1769.    Ressourcendateien verwenden
  1770.  
  1771.    Wenn diese Option gewählt ist, wird im Ressourceneditor eine
  1772.    Prozedur erzeugt, die den Dialog in der Ressource speichert, im
  1773.    Programm wird dieser Dialog dann aus der Datei geladen.
  1774.  
  1775.    Stack schonen
  1776.  
  1777.    Wenn diese Option gewählt ist, werden alle Elemente des Dialoges
  1778.    in einer einzigen Zeigervariablen vom Typ PView namens "Control"
  1779.    initialisiert, ansonsten verwendet der Wizard für jedes Objekt
  1780.    einen eigenen Zeiger, der unter den lokalen Variablen der
  1781.    Prozedur bzw. des Constructors unter dem Namen des jeweiligen
  1782.    Objektes auftaucht. Von dieser Regelung ausgenommen sind
  1783.    natürlich Feldelemente des Dialoges, Objekte also, deren Namen
  1784.    Sie ein Ausrufezeichen vorangestellt haben. Wenn Sie bewirken
  1785.    möchten, daß beim Einfügen des Dialoges ein anderes Objekt als
  1786.    das zuerst in den Dialog eingefügte fokussiert wird, müssen Sie
  1787.    diese Option deaktivieren und vor dem Schreiben des Quelltextes
  1788.    das gewünschte Objekt selektieren.
  1789.  
  1790.  
  1791.    
  1792.  
  1793.  
  1794.  
  1795.                                     - 29 -
  1796.  
  1797.    Record auf dem Stack oder Heap anlegen
  1798.  
  1799.    Wenn dieser Schalter auf "Stack" steht wird der Datenrecord als
  1800.    lokale Variable auf dem Stack angelegt, ansonsten mit der
  1801.    Funktion New auf dem Heap. Die Aufrufe der Methoden GetData,
  1802.    SetData und ExecuteDialog werden dementsprechend angepaßt, ein
  1803.    Record auf dem Heap am Ende der Prozedur wieder entfernt.
  1804.  
  1805.    Recordtyp lokal oder global deklarieren
  1806.  
  1807.    Wenn dieser Schalter auf lokal steht, so wird der Typ des
  1808.    Datenrecords innerhalb der Prozedur, die den Dialog einfügt
  1809.    deklariert, ansonsten global in der Includedatei
  1810.    <ProjectName>TYP.INC. Lokal deklarierte Records machen das
  1811.    Programm etwas übersichtlicher. Um das Prototyping zu erleichtern
  1812.    legt der Wizard den Datenrecord immer als lokale Variable an. In
  1813.    der Praxis werden Sie die abzufragenden Daten vermutlich häufig
  1814.    als Variablenparameter an die Prozedur übergeben wollen. In
  1815.    diesem Fall sollten Sie den Recordtyp natürlich global
  1816.    deklarieren. Sie müssen dann außerdem noch die lokale Variable
  1817.    NewData aus der Variablenliste löschen und statt dessen in die
  1818.    Parameterliste der Prozedur aufnehmen.
  1819.  
  1820.    Zentrierung in X- oder Y-Richtung
  1821.  
  1822.    Diese Schalter im Eigenschaftendialog eines Dialogobjektes
  1823.    bestimmen, ob die Bits "ofCenterX" und "ofCenterY" im Feld
  1824.    Options gesetzt werden sollen. Ist dies der Fall werden die
  1825.    absoluten Koordinaten des Dialoges beim Einfügen entsprechend
  1826.    geändert (auf die Darstellung des Dialoges innerhalb des Wizard
  1827.    hat dies keinen Einfluß).
  1828.  
  1829.    Der Typ TWDialog
  1830.  
  1831.  
  1832.    Turbo Wizard gibt den Typ eines neuen zu editierenden Dialoges
  1833.    mit TWDialog vor. Dieser direkte Nachfahre von TDialog
  1834.    überschreibt die Methode HandleEvent derartig, daß jedes
  1835.    Befehlsereignis die Methode "EndModal(<Befehl>)" aufruft, die
  1836.    dafür sorgt, daß der Dialog geschlossen wird und die Funktionen
  1837.    ExecView bzw. ExecuteDialog den Wert des Befehlsereignisses
  1838.    zurückgeben. Dieser Dialogtyp reicht für viele Anwendungen
  1839.    modaler Dialoge aus (es handelt sich sozusagen um ein
  1840.    "ReadLn-Object"). Sie sollten einen TWDialog aber nicht als
  1841.    nichtmodalen Dialog einfügen, EndModal würde dann nämlich das
  1842.    Programm beenden.
  1843.  
  1844.    Reihenfolge der Dialogelemente
  1845.  
  1846.  
  1847.    Alle Elemente, die Sie in einen Dialog einfügen können, sind
  1848.    Standardelemente aus Turbo Vision
  1849.  
  1850.    Es gibt allerdings zwei kleine Erleichterungen: Wenn Sie ein
  1851.    THistory-Objekt einfügen, so wird zugleich auch eine Eingabezeile
  1852.    eingefügt und mit diesem Objekt verknüpft, und Sie brauchen sich
  1853.    um das Einfügen von Rollbalken für Listboxen und Memofelder nicht
  1854.  
  1855.    
  1856.  
  1857.  
  1858.  
  1859.                                     - 30 -
  1860.  
  1861.    zu kümmern, sondern müssen nur deren Anzahl und Ausrichtung
  1862.    angeben.
  1863.  
  1864.    Sie sollten alle Elemente in der gleichen Reihenfolge einfügen,
  1865.    in der der Anwender Sie später vermutlich nutzen wird, i.a. also
  1866.    von links oben nach rechts unten, denn diese Reihenfolge
  1867.    entspricht genau der Reihenfolge, in der der Zieldialog
  1868.    tatsächlich zusammengesetzt wird. Von dieser Regel ausgenommen
  1869.    sind lediglich Objekte vom Typ TLabel. Diese werden vom Wizard
  1870.    immer direkt hinter dem Objekt eingefügt, das sie referenzieren.
  1871.    Sie können allerdings ein Label nur mit einem Objekt verbinden,
  1872.    das vor ihm entstanden ist. Um zu vermeiden, daß das zuletzt in
  1873.    den Dialog eingefügte Objekt beim Erscheinen des Dialoges auf dem
  1874.    Bildschirm fokussiert wird fügt der Wizard am Ende der
  1875.    Dialogerzeugung noch den Befehl SelectNext(False) ein, der den
  1876.    Focus auf das zuerst eingefügte Element setzt.
  1877.  
  1878.    Die HandleEvent-Methode eines abgeleiteten Dialogtypen
  1879.  
  1880.    Wenn Sie in einen Dialog einen Button einfügen, können Sie in
  1881.    dessen Eigenschaftendialog bestimmen, welche Instanz den von
  1882.    diesem Button abgesetzten Befehl bearbeiten und welche Aktion
  1883.    dabei ausgelöst werden soll.
  1884.  
  1885.    Um die Aktion festzulegen geben Sie einen Prozedurnamen an.
  1886.  
  1887.    Die bearbeitende Instanz kann entweder die HandleEvent Methode
  1888.    eines abgeleiteten Objektypen oder die Prozedur sein, die einen
  1889.    modalen Dialog einfügt.
  1890.  
  1891.    Wenn die HandleEvent-Methode des Dialogs den Befehl bearbeiten
  1892.    soll, wird nun die Kombination "Befehlskonstante:
  1893.    Aktions-Prozedur" in die Case-anweisung dieser Methode
  1894.    aufgenommen.
  1895.  
  1896.    Soll die einfügende Prozedur das Ereignis bearbeiten, so wird in
  1897.    die HandleEvent-Methode die Zuordnung "Befehlskonstante:
  1898.    EndModal(Befehlskonstante)" übernommen. Diese Prozedur gibt den
  1899.    Wert des Befehlsereignisses an die Funktionen ExecView bzw
  1900.    ExecuteDialog (Turbo Vision 2.0) weiter, deren Ergebnis in der
  1901.    Variablen "Result" abgespeichert wird. Result wird nun nach dem
  1902.    Schließen des Dialoges (ebenfalls in einer Case-anweisung) mit
  1903.    der vorbestimmten Aktion verbunden. Wenn Sie den Dialog
  1904.    nichtmodal einfügen, werden allerdings alle Buttons, die diese
  1905.    Einstellung aufweisen, schlicht und einfach ignoriert. Sie müssen
  1906.    dann selbst dafür sorgen, daß die HandleEvent-Methode der
  1907.    Application, an die der Befehl dann weitergegeben wird, um einen
  1908.    entsprechenden Eintrag ergänzt wird. Auch Buttons, deren Flag
  1909.    bfBroadcast gesetzt ist, werden nicht erfaßt. Für ihre
  1910.    Bearbeitung ist im Allgemeinen ein im Dialog enthaltenes,
  1911.    überschriebenes View-Objekt zuständig.
  1912.  
  1913.    Die Bearbeitung des Ereignisses durch die einfügende Prozedur
  1914.    statt durch die Dialog.HandleEvent-Methode ist eigentlich immer
  1915.    dann sinnvoll, wenn der Dialog nach dem Eintreffen des Befehls
  1916.    nicht mehr benötigt wird.
  1917.  
  1918.  
  1919.    
  1920.  
  1921.  
  1922.  
  1923.                                     - 31 -
  1924.  
  1925.  
  1926.    Im Eigenschaftendialog eines Dialogobjektes finden Sie eine
  1927.    Schaltfläche, über die Sie unabhängig von irgendwelchen Knöpfen
  1928.    Befehls/Prozedurzuordnungen in die HandleEvent-Methode des
  1929.    Dialoges bzw. in die Auswertung des Ergebnisses von ExecView
  1930.    aufnehmen oder auch löschen können. Dieses Verfahren bietet sich
  1931.    an, wenn Sie den Dialog auf Befehlsereignisse reagieren lassen
  1932.    wollen, die von der Statuszeile oder (bei nichtmodalen Dialogen)
  1933.    von Menübefehlen generiert wurden.
  1934.  
  1935.    Verschiedene Möglichkeiten der Befehlauswertung
  1936.  
  1937.    Unabhängig davon, ob Sie einen Befehl durch die
  1938.    HandleEvent-Methode des Dialoges oder durch die einfügende
  1939.    Prozedur bearbeiten lassen möchten, können Sie bei abgeleiteten
  1940.    Dialogen bestimmen, zu welchem Zeitpunkt innerhalb der
  1941.    HandleEvent-Methode die Zuordnung vorgenommen werden soll.
  1942.  
  1943.    Vorgabegemäß wird der Befehl bearbeitet, nachdem die geerbte
  1944.    HandleEvent-Methode aufgerufen wurde. Wenn Sie allerdings die
  1945.    Reaktion auf einen Befehl modifizieren möchten, der von der
  1946.    geerbten HandleEvent-Methode abgefangen würde (z.B. cmOk oder
  1947.    cmClose), können Sie bestimmen, ob dieser Befehl ausschließlich
  1948.    vor oder sowohl vor als auch durch die geerbte
  1949.    HandleEvent-Methode bearbeitet werden soll. Im ersten Fall wird
  1950.    nach Aufruf der mit dem Befehl verknüpften Prozedur die Prozedur
  1951.    ClearEvent(Event) aufgerufen, die den Eventrecord als bereits
  1952.    bearbeitet markiert und so eine weitere Bearbeitung unterbindet.
  1953.  
  1954.  
  1955.  
  1956.  
  1957.  
  1958.  
  1959.  
  1960.  
  1961.  
  1962.  
  1963.  
  1964.  
  1965.  
  1966.  
  1967.  
  1968.  
  1969.  
  1970.  
  1971.  
  1972.  
  1973.  
  1974.  
  1975.  
  1976.  
  1977.  
  1978.  
  1979.  
  1980.  
  1981.  
  1982.  
  1983.    
  1984.  
  1985.  
  1986.  
  1987.                                     - 32 -
  1988.  
  1989.    Der Datenrecord
  1990.  
  1991.  
  1992.    Der Datenaustausch mit den Elementen eines Dialoges sollte
  1993.    niemals direkt, sondern immer unter Benutzung der Methoden
  1994.    GetData bzw. SetData über einen Record erfolgen, dessen Einträge
  1995.    allerdings in Reihenfolge und Größe genau auf die Elemente des
  1996.    Dialoges abgestimmt sein müssen. Turbo Wizard erstellt diesen
  1997.    Datenrecord selbständig, in Abhängigkeit von der Eigenschaft
  1998.    "RecordEntry" eines jeden Dialogelementes. Bei dieser Eigenschaft
  1999.    handelt es sich schlicht um den Ausdruck, der im Quellcode für
  2000.    ein Dialogelement in diesem Record vorgesehen ist. Dieser wird
  2001.    z.B. für ein RadioButton-Feld "Word" lauten, er ist aber bei
  2002.    TInputLine-Objekten je nach erlaubter Eingabelänge variabel.
  2003.    (Hier lautet er nämlich "String[<erlaubte Länge>]") Bei
  2004.    abgeleiteten Objekten, deren Get/SetData-Methoden von denen ihrer
  2005.    Vorfahren abweichen, können Sie im Eigenschaftendialog neben dem
  2006.    Typ auch das Feld "RecordEntry" ändern.
  2007.  
  2008.    Wenn Sie das Feld RecordEntry im Eigenschaftendialog löschen, so
  2009.    unterbleibt ein Eintrag. Stellen Sie aber bitte sicher, daß die
  2010.    Get/SetData- und die DataSize-Methoden zu den modifizierten
  2011.    Einträgen passen.
  2012.  
  2013.    Bedeutung der Dialogelementnamen
  2014.  
  2015.    Die Einträge im Datenrecord werden unter den gleichen Namen
  2016.    vorgenommen, die die Dialogelemente selbst tragen. Es ist daher
  2017.    wichtig, für die einzelnen Dialogelemente möglichst "sprechende"
  2018.    Namen zu finden, um die Lesbarkeit des Quelltextes zu verbessern.
  2019.    Ein Eintrag wie "InputLine13: String[30]" ist insbesondere dann
  2020.    vollständig unleserlich, wenn Sie den Dialog aus einer Ressource
  2021.    laden oder mit dem Schalter "Stack schonen" bestimmt haben, daß
  2022.    alle Dialogelemente in der Variablen "Control" initialisiert
  2023.    werden sollen.
  2024.  
  2025.    Globale oder lokale Deklaration
  2026.  
  2027.    Turbo Wizard gibt Ihnen die Möglichkeit, den Recordtyp wahlweise
  2028.    lokal oder global zu deklarieren. Bei lokaler Deklaration findet
  2029.    sich eine "TYPE <Name der Prozedur>Rec=Record ... End;" Anweisung
  2030.    direkt in der Prozedur, die den Dialog aufruft. Bei globaler
  2031.    Deklaration wird der Recordtyp in der Datei
  2032.    "<ProjectName>REC.INC" deklariert. Die Instanz, die in der
  2033.    Prozedur benutzt wird, heißt NewData. Die lokale Deklaration, die
  2034.    natürlich nur dann sinnvoll ist, wenn die Daten, die man durch
  2035.    den Dialog abfragt, keinen zwingenden inneren Zusammenhang haben
  2036.    und daher besser als globale Recordvariable im Programm bekannt
  2037.    sein sollten, macht die Initialisierung des Records etwas
  2038.    einfacher, da man im Quelltext der Prozedur sofort Informationen
  2039.    über die Feldnamen erhält.
  2040.  
  2041.    Records auf dem Heap einrichten
  2042.  
  2043.    Es besteht außerdem die Möglichkeit, NewData nicht als lokale
  2044.    Variable auf dem Stack, sondern dynamisch in einer lokalen
  2045.    Zeigervariablen auf dem Heap einzurichten. Wenn Sie umfangreiche
  2046.  
  2047.    
  2048.  
  2049.  
  2050.  
  2051.                                     - 33 -
  2052.  
  2053.    Dialoge oder gar Memofelder nutzen sollten Sie von dieser
  2054.    Möglichkeit Gebrauch machen, um die Gefahr eines Stacküberlaufes
  2055.    zu vermindern.
  2056.  
  2057.    Initialisierung des Records
  2058.  
  2059.    Der Wizard fügt, bevor er mit Dialog^.SetData(NewData) bzw.
  2060.    ExecuteDialog(Dialog, @NewData) (Turbo Vision 2.0) die Daten aus
  2061.    dem Record in den Dialog überträgt, die Zeile "Fillchar(NewData,
  2062.    SizeOf(NewData), #0)" ein. Diese Anweisung stellt sicher, daß
  2063.    kein Datenmüll angezeigt wird. An dieser Stelle können Sie den
  2064.    Datenrecord mit den Werten vorbelegen, die beim Einfügen des
  2065.    Dialoges angezeigt werden sollen.
  2066.  
  2067.    ▌Warnung
  2068.  
  2069.    Wenn keine Initialisierung erfolgt und Sie dennoch diese
  2070.    "FillChar(...)"-anweisung löschen, kann es passieren, daß sich
  2071.    Ihr Programm aufhängt. Die SetData-Methode von TMemo z.B. verläßt
  2072.    sich (zumindest in ihrer Implementierung in Turbo Vision 2.0)
  2073.    darauf, daß der Record eine korrekte Längenangabe enthält und
  2074.    kopiert ohne Überprüfung genau diese Anzahl von Byte aus dem
  2075.    Record in den eigenen Datenbereich. Dies ist ein echter Bug und
  2076.    steht im Widerspruch sowohl zur Dokumentation als auch zum
  2077.    eigentlichen Konzept des Transfers! Sie können entsprechende
  2078.    Fehler natürlich aufspüren und korrigieren, bei sauberer
  2079.    Programmierung sollte dieser Fehler allerdings niemals auftreten,
  2080.    denn es ist natürlich sinnlos, zufällige Daten anzuzeigen. Mit
  2081.    sehr großer Wahrscheinlichkeit führt auch der Aufruf der
  2082.    TListBox.SetData-Methode mit einem nichtinitialisierten Record zu
  2083.    blankem Unsinn oder eher noch einem saftigen Systemabsturz. Diese
  2084.    Methode überprüft einen übergebenen Zeiger auf eine vermeintliche
  2085.    ListBox nur, ob er von Nil ($0000:$0000) verschieden ist, bevor
  2086.    er ihn als gültig akzeptiert.
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092.  
  2093.  
  2094.  
  2095.  
  2096.  
  2097.  
  2098.  
  2099.  
  2100.  
  2101.  
  2102.  
  2103.  
  2104.  
  2105.  
  2106.  
  2107.  
  2108.  
  2109.  
  2110.  
  2111.    
  2112.  
  2113.  
  2114.  
  2115.                                     - 34 -
  2116.  
  2117.    Prozedurbezeichner
  2118.  
  2119.    Sie können Button- und Menübefehlen einen Prozedurnamen zuweisen,
  2120.    ohne sich darum kümmern zu müssen, ob diese Prozeduren schon
  2121.    irgendwo implementiert und dem Prototypen bekannt sind. Wenn Sie
  2122.    den Befehl "Projekt│Prototyp erzeugen" wählen, überprüft der
  2123.    Wizard, welche dieser Prozeduren bereits implementiert wurden um
  2124.    einen Dialog einzufügen. Für alle anderen erzeugt er einen
  2125.    "Dummy", eine Prozedur, die einfach nur ihren Namen in einer
  2126.    Messagebox ausgibt. Der Rückgabewert der Funktion MessageBox wird
  2127.    dabei allerdings nicht "verbraucht", so daß diese Prozeduren nur
  2128.    mit dem Compilerschalter $X+ (Extended Syntax) compiliert werden
  2129.    können.
  2130.  
  2131.    Die Deklarationen (für das Interface der Unit
  2132.    <ProjectName>RUN.PAS) der bereits implementierten Prozeduren
  2133.    befinden sich in der Includedatei <ProjectName>PDC.INC, die der
  2134.    Dummys in der Includedatei <ProjectName>DDC.INC. Die
  2135.    Implementierungen der Dummyfunktion finden Sie in
  2136.    <ProjectName>DMY.INC. Dies werden i.a. die tatsächlich
  2137.    "funktionellen" Elemente Ihres Programmes sein, in denen die
  2138.    Auswertung der eingegebenen Daten erfolgt.
  2139.  
  2140.  
  2141.  
  2142.  
  2143.  
  2144.  
  2145.  
  2146.  
  2147.  
  2148.  
  2149.  
  2150.  
  2151.  
  2152.  
  2153.  
  2154.  
  2155.  
  2156.  
  2157.  
  2158.  
  2159.  
  2160.  
  2161.  
  2162.  
  2163.  
  2164.  
  2165.  
  2166.  
  2167.  
  2168.  
  2169.  
  2170.  
  2171.  
  2172.  
  2173.  
  2174.  
  2175.    
  2176.  
  2177.  
  2178.  
  2179.                                     - 35 -
  2180.  
  2181.    Die TWApplication.HandleEvent-Methode
  2182.  
  2183.  
  2184.    Im Kapitel über die Konstruktion eines Menübalkens konnten Sie
  2185.    nachlesen, daß die dort vorgenommenen
  2186.    Kommando/Prozedurverknüpfungen zu einem Eintrag in die
  2187.    kommandoauswertende Case-Anweisung der HandleEvent-Methode des
  2188.    Application-Objektes führen. Durch den Menübefehl
  2189.    "Objekte│Application" haben Sie die Möglichkeit, weitere Einträge
  2190.    vorzunehmen oder Eintragungen zu löschen, wenn Sie einen
  2191.    Menübalken verworfen haben sollten. Dies ist z.B. nötig, wenn Sie
  2192.    Befehle in die Statuszeile aufgenommen haben, die Sie durch das
  2193.    Applikations-Objekt bearbeiten lassen möchten.
  2194.  
  2195.    Analog zu den Möglichkeiten, die Sie bei Dialogobjekten haben, um
  2196.    die Bearbeitung eines Kommandos zu steuern, können Sie auch hier
  2197.    bestimmen, ob ein Befehl NACH der geerbten, ausschließlich vor
  2198.    oder vor UND durch die geerbte HandleEvent-Methode bearbeitet
  2199.    werden soll. In der Standardeinstellung wird zunächst die geerbte
  2200.    Methode aufgerufen.
  2201.  
  2202.    Die Notwendigkeit für eine Änderung dieses voreingestellten
  2203.    Verhaltens ist am Beispiel des Befehls "cmQuit" ersichtlich.
  2204.    Dieser führt in der geerbten HandleEvent-Methode dazu, daß das
  2205.    Programm ohne weitere Rückfrage verlassen wird. Wenn Sie nun
  2206.    irgendwelche Aufräumarbeiten vornehmen müssen oder Grund dazu
  2207.    haben, an der ernsthaften Absicht des Anwenders zu zweifeln,
  2208.    haben Sie mehrere Möglichkeiten, dieses Verhalten zu ändern (in
  2209.    der Reihenfolge absteigender Eleganz):
  2210.  
  2211.    ■ Wenn die vorzunehmenden Arbeiten mit Viewobjekten wie Fenstern
  2212.    oder nichtmodalen Dialogen zusammenhängen, überschreiben Sie
  2213.    deren Methode Valid. Ein Beispiel dafür sind die Editorfenster in
  2214.    Turbo Vision, die vor Progammende nachfragen, ob man geänderte
  2215.    Dateien gesichert haben möchte. Dieses Vorgehen ist sehr
  2216.    empfehlenswert, da solche Objekte dieses Verhalten schließlich in
  2217.    jeder Application aufweisen und somit gut wiederzuverwenden sind.
  2218.  
  2219.    ■ Sie überschreiben die Valid-Methode der Application so, daß
  2220.    diese nur dann TRUE zurückgibt, wenn die geforderten Bedingungen
  2221.    vorliegen.
  2222.  
  2223.    Beispiel:
  2224.  
  2225.    Function TestApp.Valid(Command: Word): Boolean;
  2226.    Var ok: Boolean;
  2227.    Begin
  2228.      ok:=TApplication.Valid(Command);
  2229.      if ok and (Command=cmQuit) Then
  2230.        Valid:=ok and (MessageBox('Wirklich beenden?', nil,
  2231.                       mfYesNoCancel+mfConfirmation)=cmYes)
  2232.      Else Valid:=ok;
  2233.    End;
  2234.  
  2235.    Diese Vorgehensweise ist empfehlenswert, wenn Sie (aus welchem
  2236.    Grunde auch immer) eine Möglichkeit vorsehen müssen, das
  2237.    Programmende zu verhindern.
  2238.  
  2239.    
  2240.  
  2241.  
  2242.  
  2243.                                     - 36 -
  2244.  
  2245.  
  2246.    ■ Sie fangen das Kommando cmQuit ab, bevor es von der geerbten
  2247.    HandleEvent-Methode bearbeitet wird, tun, was Sie nicht lassen
  2248.    können und geben das Kommando dann an die geerbte Methode weiter.
  2249.    Diese Vorgehensweise ist z.B. dann sinnvoll, wenn Sie alle zu
  2250.    erledigenden Arbeiten automatisch durchführen können und dem
  2251.    Anwender keine Möglichkeit zur Einflußnahme zu geben brauchen.
  2252.  
  2253.    ■ Sie überschreiben den Destructor Done des
  2254.    Applikations-Objektes. Diese Vorgehensweise ist der eben
  2255.    genannten sehr ähnlich, erfordert allerdings ein wenig mehr
  2256.    Schreibarbeit. Kommen Sie aber nicht auf die Idee, dieses
  2257.    Verfahren einzusetzen, wenn Sie das Programmende möglicherweise
  2258.    doch noch verhindern müssen - wenn Sie erst einmal bis zum
  2259.    Destructor gekommen sind, führt kein Weg mehr zurück.
  2260.  
  2261.    Welches dieser Verfahren Sie wählen hängt von den Erfordernissen
  2262.    und vom persönlichen Stilempfinden ab.
  2263.  
  2264.  
  2265.  
  2266.  
  2267.  
  2268.  
  2269.  
  2270.  
  2271.  
  2272.  
  2273.  
  2274.  
  2275.  
  2276.  
  2277.  
  2278.  
  2279.  
  2280.  
  2281.  
  2282.  
  2283.  
  2284.  
  2285.  
  2286.  
  2287.  
  2288.  
  2289.  
  2290.  
  2291.  
  2292.  
  2293.  
  2294.  
  2295.  
  2296.  
  2297.  
  2298.  
  2299.  
  2300.  
  2301.  
  2302.  
  2303.    
  2304.  
  2305.  
  2306.  
  2307.                                     - 37 -
  2308.  
  2309.    Die Schnittstelle zu eigenen Prozeduren und Funktionen
  2310.  
  2311.  
  2312.    Die Verbindung des vom Wizard erzeugten Quellcodes zu "eigenen"
  2313.    Prozeduren (die ja schließlich die Datenauswertung vornehmen
  2314.    sollen) ist primitiv, aber dafür einfach zu verstehen: Überall
  2315.    dort, wo Sie einer Befehlskonstanten den Namen einer Prozedur
  2316.    zugeordnet haben, ohne diesen Namen irgendwo für eine Prozedur
  2317.    benutzt zu haben, die einen Dialog in die Arbeitsfläche einfügt,
  2318.    erzeugt der Wizard eine parameterlose "Dummyprozedur", die im
  2319.    Prototypen in einer Messagebox ihren Namen ausgibt.
  2320.  
  2321.    Diese Dummyprozedur müssen Sie selbst "überschreiben", dann die
  2322.    Deklaration des Dummys in der Datei <ProjectName>DDC.INC und die
  2323.    Implementation in der Datei <ProjectName>DMY.INC löschen, und
  2324.    wenn nötig den Aufruf der Prozedur im Quelltext um etwaige
  2325.    Parameter ergänzen.
  2326.  
  2327.    Selbst wenn Ihre Prozedur die gleichen Parameter (nämlich keine)
  2328.    benutzt wie der Dummy sollten Sie Deklaration und Implementation
  2329.    an einer anderen Stelle vornehmen als in den genannten Dateien,
  2330.    da diese sonst später wieder überschrieben werden könnten.
  2331.  
  2332.    Am sichersten, bequemsten und häufig auch am effektivsten ist es,
  2333.    die Prozeduren entweder als Methode eines abgeleiteten
  2334.    Dialogobjektes oder als lokale Prozeduren innerhalb der einen
  2335.    modalen Dialog einfügenden Prozedur zu implementieren.
  2336.  
  2337.    Eine Vereinfachung ergibt sich für den Fall, daß Sie die
  2338.    einzubindenden Prozeduren aus einer eigenen Unit übernehmen. Die
  2339.    Vorgehensweise wird im nächsten Abschnitt beschrieben.
  2340.  
  2341.  
  2342.  
  2343.  
  2344.  
  2345.  
  2346.  
  2347.  
  2348.  
  2349.  
  2350.  
  2351.  
  2352.  
  2353.  
  2354.  
  2355.  
  2356.  
  2357.  
  2358.  
  2359.  
  2360.  
  2361.  
  2362.  
  2363.  
  2364.  
  2365.  
  2366.  
  2367.    
  2368.  
  2369.  
  2370.  
  2371.                                     - 38 -
  2372.  
  2373.    Einbinden eigener Units und externer Prozeduren
  2374.  
  2375.  
  2376.    Um Prozeduren, die der Wizard als Dummy deklarieren würde, aus
  2377.    externen Units einzubinden (und so den Code des Prototypen mit
  2378.    Leben zu erfüllen) oder um Objekttypen verwenden zu können, die
  2379.    Sie in eigenen Turbo Vision Bibliotheken deklariert haben, können
  2380.    Sie folgendermaßen vorgehen:
  2381.  
  2382.    Der Menübefehl "Projekt│Units..." öffnet einen Dialog, der Ihnen
  2383.    die Eingabe der zusätzlich einzubindenden Units, getrennt nach
  2384.    der Unit <ProjectName>RUN und dem Programm <ProjectName>,
  2385.    erlaubt.
  2386.  
  2387.    In der Zeile für die Unit <ProjectName>RUN würden Sie z.B. Units
  2388.    aufführen, die die Deklarationen für abgeleitete Objekte
  2389.    beinhalten, die Sie in Dialogen verwenden möchten. Hierhin
  2390.    gehören auch Units, die Prozeduren enthalten, die nicht durch die
  2391.    Application.HandleEvent-Methode, sondern im Zusammenhang mit
  2392.    Dialogen aufgerufen werden sollen.
  2393.  
  2394.    In der Zeile für das Programm führen Sie Units auf, die
  2395.    Prozeduren enthalten, die in der Application.HandleEvent-Methode
  2396.    aufgerufen werden.
  2397.  
  2398.  
  2399.    Wenn Sie nun über den Menübefehl "Projekt│Deklarationen..." die
  2400.    Liste der bisher deklarierten Prozedurbezeichner anzeigen lassen,
  2401.    können Sie in dieser Liste einzelne Prozeduren, die Sie aus einer
  2402.    eigenen Unit importieren möchten, als extern deklarieren, indem
  2403.    Sie den Bezeichner anwählen und dann die Tastenkombination
  2404.    ALT-Leertaste betätigen.
  2405.  
  2406.    Für derartig als extern deklarierte Prozeduren unterbleibt in
  2407.    Zukunft eine Dummydeklaration, sie werden in der Prozedurliste
  2408.    mit der Silbe "EXT" gekennzeichnet.
  2409.  
  2410.    Eine bereits als extern deklarierte Prozedur können Sie durch die
  2411.    gleiche Tastenkombination wieder in die Liste der Dummys
  2412.    aufnehmen.
  2413.  
  2414.    Die Änderung wird natürlich erst mit einem erneuten Aufruf des
  2415.    Menübefehls "Projekt│Prototyp vorbereiten" wirksam.
  2416.  
  2417.  
  2418.  
  2419.  
  2420.  
  2421.  
  2422.  
  2423.  
  2424.  
  2425.  
  2426.  
  2427.  
  2428.  
  2429.  
  2430.  
  2431.    
  2432.  
  2433.  
  2434.  
  2435.                                     - 39 -
  2436.  
  2437.    Anhang A, Dateischlüssel
  2438.  
  2439.    Die Quelltextdateien, die der Wizard während der Arbeit an einem
  2440.    Projekt erzeugt, werden nach dem folgendem Schema benannt.
  2441.  
  2442.    Für Dialoge, deren Quelltext mit der Option "Eigene Dateien
  2443.    anlegen" erzeugt wurde, ist die Dateiendung von Bedeutung:
  2444.  
  2445.    ▌".INP" signalisiert eine Datei, die die Implementation einer
  2446.    Prozedur enthält, die im Prototypen einen Dialog in den Desktop
  2447.    einfügt. Der Name der Datei bildet sich aus den ersten acht
  2448.    Buchstaben des Prozedurnamens.
  2449.  
  2450.    ▌".INR" signalisiert eine Datei, die die Implementation einer
  2451.    Prozedur enthält, welche im Ressourceneditor einen Dialog
  2452.    zusammenstellt und in der Ressourcendatei speichert. Der Name der
  2453.    Datei bildet sich aus den ersten acht Buchstabens des Namens der
  2454.    Prozedur, die diese Ressource verwendet.
  2455.  
  2456.    ▌".INT" signalisiert eine Datei, die die Deklaration eines neuen
  2457.    Dialogtypen enthält, also den Programmteil, der im Interface der
  2458.    Unit auftauchen wird. Der Name der Datei bildet sich aus den
  2459.    ersten acht Buchstaben des Typenbezeichners.
  2460.  
  2461.    ▌".INO" signalisiert eine Datei, die die Imlementation von
  2462.    Objektmethoden (Store, Load, Init, HandleEvent) enthält. der Name
  2463.    der Datei bildet sich aus den ersten acht Buchstaben des
  2464.    Typbezeichners.
  2465.  
  2466.  
  2467.    Folgende Dateien werden vom Wizard für alle Prozeduren/Objekte,
  2468.    bei denen auf die Erzeugung eines eigenen Satzes von Dateien
  2469.    verzichtet wurde, und bei der Vorbereitung eines Prototypen
  2470.    angelegt. Der Ausdruck <Name> bezeichnet im weiteren die ersten
  2471.    fünf Buchstaben des Namens der Projektdatei.
  2472.  
  2473.  
  2474.    ▌<ProjectName>.PAS: Die eigentliche Programmdatei. Sie enthält
  2475.    die Typendeklaration für den TApplication-Nachfahren
  2476.    "TWApplication", dessen Methoden InitMenubar, InitStatusline und
  2477.    HandleEvent überschrieben werden.
  2478.  
  2479.  
  2480.    ▌<Name>RUN.PAS: Diese Unit enthält die Deklaration und
  2481.    Implementation des Dialogtyps TWDialog (s.o.), der Statuszeile
  2482.    "TWStatusLine", deren Methode Hint durch den Wizard überschrieben
  2483.    wird, die TStreamRec-Records dieser Objekte sowie
  2484.    Includeanweisungen für die Deklarationen aller von Ihnen
  2485.    gestalteten Dialoge und Prozeduren.
  2486.  
  2487.  
  2488.    ▌<Name>RES.PAS: Dies ist die Programmdatei des Ressourceneditors,
  2489.    der die Objekte, die aus einer Ressourcendatei ins Programm
  2490.    geladen werden sollen, erzeugt.
  2491.  
  2492.  
  2493.    ▌<ProjektName>.INT: Diese Datei enthält die Typendeklarationen
  2494.  
  2495.    
  2496.  
  2497.  
  2498.  
  2499.                                     - 40 -
  2500.  
  2501.    von Objekten, deren Zeigertypen und TStreamRecs.
  2502.  
  2503.  
  2504.    ▌<Name>PDC.INC: Diese Datei enthält die Vorausdeklarationen von
  2505.    Prozeduren, die einen mit dem Wizard gestalteten Dialog einfügen.
  2506.  
  2507.  
  2508.    ▌<Name>DDC.INC: Diese Datei enthält die Deklarationen von
  2509.    Prozeduren die durch Menü- oder Buttonbefehle aufgerufen werden,
  2510.    aber noch nicht implementiert wurden.
  2511.  
  2512.  
  2513.    ▌<ProjektName>.INP: Diese Datei enthält den Code der Prozeduren,
  2514.    die Dialoge einfügen.
  2515.  
  2516.    ▌<ProjektName>.INO: Diese Datei enthält die die Constructor-,
  2517.    HandleEvent-, Load- und Store-Methoden von Dialogobjekten.
  2518.  
  2519.  
  2520.    ▌<Name>DMY.INC: Diese Datei enthält vorläufige Implementationen
  2521.    von Prozeduren, die einem Befehlerereignis zugeordnet, aber nicht
  2522.    als Dialog implementiert wurden ("Dummys"). Diese Prozeduren
  2523.    geben in einer MessageBox ihren eigenen Namen aus.
  2524.  
  2525.  
  2526.    ▌<Name>CMX.INC: Diese Datei enthält die Deklarationen der
  2527.    Kommandokonstanten.
  2528.  
  2529.  
  2530.    ▌<Name>HCX.INC: Diese Datei enthält die Deklarationen der
  2531.    Hilfekontextkonstanten. Wenn Sie die Onlinehilfe vollständig mit
  2532.    dem Wizard erstellt haben, so ist diese Datei konsistent mit der
  2533.    Unit, die der Hilfecompiler TVHC erzeugt. Wenn Sie den Hilfetext
  2534.    außerhalb des Wizard um neue Topics erweitert haben, müssen Sie
  2535.    die Include-anweisungen für diese Datei löschen und statt dessen
  2536.    die von TVHC erzeugte Unit <Name>HLP.PAS mit "uses" einbinden.
  2537.    Sie sollten neue Topics allerdings IMMER am Ende der Hilfedatei
  2538.    anfügen, um eine größtmögliche Übereinstimmung zu erhalten.
  2539.  
  2540.  
  2541.    ▌<Name>HNT.INC: Die Funktion TWStatusLine.Hint.
  2542.  
  2543.  
  2544.    ▌<Name>EVH.INC: Die Methode TWApplication.HandleEvent.
  2545.  
  2546.  
  2547.    ▌<Name>MNU.INC: Die Methode TWApplication.InitMenuBar.
  2548.  
  2549.  
  2550.    ▌<Name>STL.INC: Die Methode TWApplication.InitStatusLine.
  2551.  
  2552.  
  2553.    ▌<ProjektName>.INR: Die Prozeduren zur Erzeugung von Objekten in
  2554.    Ressourcen.
  2555.  
  2556.  
  2557.    ▌<Name>RRN.INC: Der Aufruf dieser Prozeduren in der Prozedur Run.
  2558.  
  2559.    
  2560.  
  2561.  
  2562.  
  2563.                                     - 41 -
  2564.  
  2565.  
  2566.  
  2567.    ▌<Name>REG.INC: Diese Datei enthält die Implementation der
  2568.    Prozedur, die über den Aufruf der Prozedur RegisterType() jeden
  2569.    während eines Projektes deklarierten Dialogobjekt-Typen
  2570.    registriert. Diese Methode wird sowohl im Prototypen als auch im
  2571.    Ressourceneditor benutzt.
  2572.  
  2573.  
  2574.    ▌<Name>HLP.TXT: Die Textdatei, in der die Hilfetexte
  2575.    niedergeschrieben werden. Sie muß mit dem Turbo Vision
  2576.    Hilfecompiler TVHC zu einer verwendbaren Hilfedatei compiliert
  2577.    werden, um im Programm benutzt werden zu können.
  2578.  
  2579.    ▌<Name>REC.INC: Diese Datei enthält die Deklarationen global
  2580.    deklarierter Datenrecords.
  2581.  
  2582.  
  2583.  
  2584.  
  2585.  
  2586.  
  2587.  
  2588.  
  2589.  
  2590.  
  2591.  
  2592.  
  2593.  
  2594.  
  2595.  
  2596.  
  2597.  
  2598.  
  2599.  
  2600.  
  2601.  
  2602.  
  2603.  
  2604.  
  2605.  
  2606.  
  2607.  
  2608.  
  2609.  
  2610.  
  2611.  
  2612.  
  2613.  
  2614.  
  2615.  
  2616.  
  2617.  
  2618.  
  2619.  
  2620.  
  2621.  
  2622.  
  2623.    
  2624.  
  2625.  
  2626.  
  2627.                                     - 42 -
  2628.  
  2629.    Anhang B: Coming Attractions...
  2630.  
  2631.  
  2632.    Folgende Erweiterungen und Verbesserungen sind mehr oder weniger
  2633.    kurzfristig geplant - die letztendliche Entscheidung hängt
  2634.    natürlich von der Anwenderresonanz ab:
  2635.  
  2636.    ■ Optionales Einfügen von Kommentaren in den Quelltext.
  2637.  
  2638.    ■ Verbesserung der Integration abgeleiteter Dialogelement-Objekte
  2639.    durch die Möglichkeit, diesen Objekten einen eigenen Constructor
  2640.    mitzugeben.
  2641.  
  2642.    ■ Einführung von Standardelementen wie OK/Cancel-Buttons,
  2643.    kompletten Standardmenüs und Statuszeilen.
  2644.  
  2645.    ■ Die Einbindung von benutzerdefinierten Dialogelementen in das
  2646.    Objektmenü. Solche Objekte sollten ähnlich einfach zu benutzen
  2647.    sein wie ihre Vorfahren.
  2648.  
  2649.    ■ Die Möglichkeit zur Deklaration globaler oder lokaler
  2650.    Variablen, die auch die Übergabe von Parametern an Prozeduren
  2651.    erlauben würden.
  2652.  
  2653.  
  2654.  
  2655.  
  2656.  
  2657.  
  2658.  
  2659.  
  2660.  
  2661.  
  2662.  
  2663.  
  2664.  
  2665.  
  2666.  
  2667.  
  2668.  
  2669.  
  2670.  
  2671.  
  2672.  
  2673.  
  2674.  
  2675.  
  2676.  
  2677.  
  2678.  
  2679.  
  2680.  
  2681.  
  2682.  
  2683.  
  2684.  
  2685.  
  2686.  
  2687.    
  2688.  
  2689.