Entwicklerhandbuch Inprise GmbH, Robert-Bosch-Straße 11, D-63225 Langen Borland ® Delphi ™ 5 für Windows 95, Windows 98 & Windows NT Copyright © 1998, 1999 Inprise, Inc. Alle Rechte vorbehalten. Alle Produktnamen von Inprise sind eingetragene Warenzeichen der Inprise, Inc. Deutsche Ausgabe © 1999 Inprise GmbH, Robert-Bosch-Straße 11, D-63225 Langen, Telefon 06103/979-0, Fax 06103/979-290 Update/Übertragung ins Deutsche: Krieger, Zander & Partner GmbH, München Satz: Krieger, Zander & Partner GmbH, München Hauptsitz: 100 Enterprise Way, P.O. Box 660001, Scotts Valley, CA 95067-0001, +1-(408)431-1000 Niederlassungen in: Australien, Deutschland, Frankreich, Großbritannien, Hong Kong, Japan, Kanada, Lateinamerika, Mexiko, den Niederlanden und Taiwan HDA1350GE21001 i Kapitel 1 Einführung 1-1 Inhalt dieses Handbuchs . . . . . . . . . . . . . 1-1 Typographische Konventionen . . . . . . . . . . 1-3 Inprise Developer Support Services . . . . . . . 1-3 Gedruckte Dokumentation . . . . . . . . . . . . 1-3 Teil I Programmieren mit Delphi Kapitel 2 Object Pascal mit der VCL verwenden 2-1 Object Pascal und die VCL . . . . . . . . . . . . 2-1 Das Objektmodell . . . . . . . . . . . . . . . . . 2-2 Was ist ein Objekt? . . . . . . . . . . . . . . . 2-2 Ein Delphi-Objekt untersuchen . . . . . . 2-3 Daten und Quelltext von einem Objekt erben 2-5 Objekte, Komponenten und Steuer- elemente . . . . . . . . . . . . . . . . . . 2-6 Gültigkeitsbereich und Qualifizierer. . . . . 2-6 private-, protected-, public- und published-Deklarationen. . . . . . . . . 2-7 Objektvariablen verwenden. . . . . . . . . . 2-8 Objekte erstellen, instantiieren und freigeben. . . . . . . . . . . . . . . . . . . . 2-9 Komponenten und Eigentümer . . . . . .2-10 Komponenten verwenden . . . . . . . . . . . .2-10 Die Delphi-Standardkomponenten. . . . . .2-10 Eigenschaften aller visuellen Komponenten . . . . . . . . . . . . . . .2-11 Textkomponenten. . . . . . . . . . . . . .2-13 Spezialisierte Eingabekomponenten . . . 2-15 Schaltflächen und ähnliche Steuerelemente . . . . . . . . . . . . . .2-17 Mit Listen arbeiten . . . . . . . . . . . . .2-19 Komponenten gruppieren . . . . . . . . .2-21 Visuelle Rückmeldungen . . . . . . . . .2-23 Gitterkomponenten. . . . . . . . . . . . .2-24 Grafikkomponenten . . . . . . . . . . . .2-25 Windows-Standarddialogfelder. . . . . .2-26 Eigenschaften von Komponenten festlegen .2-26 Den Objektinspektor verwenden . . . . .2-27 Eigenschaften zur Laufzeit festlegen . . .2-27 Methoden aufrufen. . . . . . . . . . . . . . .2-28 Mit Ereignissen und Ereignisbehandlungsroutinen arbeiten . . 2-28 Eine neue Ereignisbehandlungsroutine erstellen . . . . . . . . . . . . . . . . . . 2-28 Eine Behandlungsroutine für das Standardereignis einer Komponente erstellen . . . . . . . . . . . . . . . . . . 2-29 Ereignisbehandlungsroutinen suchen . . 2-29 Ereignissen eine vorhandene Behandlungsroutine zuordnen . . . . . 2-29 Menüereignissen eine Behandlungsroutine zuordnen . . . . . . . . . . . . . . . . . 2-30 Ereignisbehandlungsroutinen löschen . 2-31 Hilfsobjekte verwenden . . . . . . . . . . . . . 2-31 Mit Listen arbeiten . . . . . . . . . . . . . . 2-32 Mit Stringlisten arbeiten . . . . . . . . . . . 2-32 Stringlisten laden und speichern. . . . . 2-33 Eine neue Stringliste erstellen . . . . . . 2-33 Mit den Strings in einer Liste arbeiten. . 2-35 Einer Stringliste Objekte zuordnen . . . 2-37 Mit Registrierung und INI-Dateien arbeiten 2-38 Streams verwenden . . . . . . . . . . . . . . 2-38 Datenmodule und Remote-Datenmodule verwenden . . . . . . . . . . . . . . . . . . . . 2-38 Datenmodule erstellen und bearbeiten . . . 2-39 Business Rules in einem Datenmodul erstellen . . . . . . . . . . . . . . . . . . 2-39 In einem Formular auf ein Datenmodul zugreifen . . . . . . . . . . . . . . . . . . . 2-40 Ein Remote-Datenmodul einem Anwendungsserver hinzufügen . . . . . . 2-40 Die Objektablage verwenden . . . . . . . . . . 2-40 Elemente in einem Projekt gemeinsam verwenden . . . . . . . . . . . . . . . . . . 2-41 Elemente in die Objektablage aufnehmen . 2-41 Objekte in einer Team-Umgebung gemeinsam verwenden . . . . . . . . . . . . . . . . . . 2-41 Ein Element der Objektablage in einem Projekt verwenden . . . . . . . . . . . . . 2-42 Ein Objekt kopieren . . . . . . . . . . . . 2-42 Ein Objekt vererben . . . . . . . . . . . . 2-42 Ein Objekt verwenden. . . . . . . . . . . 2-42 Projektvorlagen verwenden . . . . . . . . . 2-42 Freigegebene Objekte ändern . . . . . . . . 2-43 Ein Standardelement für neue Projekte, Formulare und Hauptformulare angeben 2-43 Inhalt ii Benutzerdefinierte Komponenten der IDE hinzufügen . . . . . . . . . . . . . . . . . . . . 2-44 Kapitel 3 Typische Programmieraufgaben 3-1 Exception-Behandlung . . . . . . . . . . . . . . 3-1 Quelltextblöcke schützen . . . . . . . . . . . 3-2 Auf Exceptions reagieren . . . . . . . . . 3-2 Exceptions und die Ablaufsteuerung. . . 3-3 Exception-Reaktionen verschachteln . . . 3-3 Ressourcenzuweisungen schützen . . . . . . 3-4 Zu schützende Ressourcen. . . . . . . . . 3-4 Ressourcen-Schutzblöcke erstellen . . . . 3-5 RTL-Exceptions behandeln . . . . . . . . . . 3-6 RTL-Exceptions . . . . . . . . . . . . . . . 3-6 Exception-Behandlungsroutine erstellen. 3-7 Exception-Behandlungsanweisungen . . 3-8 Exception-Instanz verwenden. . . . . . . 3-9 Gültigkeitsbereich von Exception- Behandlungsroutinen. . . . . . . . . . .3-10 Standard-Exception-Behandlungsroutinen bereitstellen . . . . . . . . . . . . . . . .3-10 Exception-Klassen verarbeiten . . . . . . 3-11 Exception erneut auslösen . . . . . . . . . 3-11 Komponenten-Exceptions behandeln . . . .3-12 TApplication.HandleException verwenden .3-13 Stille Exceptions . . . . . . . . . . . . . . . .3-13 Exceptions definieren . . . . . . . . . . . . .3-14 Exception-Objekttyp deklarieren . . . . .3-14 Exception auslösen . . . . . . . . . . . . .3-15 Schnittstellen verwenden . . . . . . . . . . . . .3-15 Schnittstellen als Sprachmerkmal . . . . . .3-16 Schnittstellen in mehreren Klassen nutzen . . . . . . . . . . . . . . . . . . .3-16 Schnittstellen mit Prozeduren verwenden . . . . . . . . . . . . . . . . .3-18 IUnknown implementieren . . . . . . . . . .3-18 TInterfacedObject . . . . . . . . . . . . . . .3-19 Operator as verwenden . . . . . . . . . . . .3-19 Wiederverwendung von Quelltext und Delegation . . . . . . . . . . . . . . . . . . .3-20 implements für die Delegation verwenden . . . . . . . . . . . . . . . . .3-20 Aggregation . . . . . . . . . . . . . . . . .3-22 Speicherverwaltung für Schnittstellen- objekte . . . . . . . . . . . . . . . . . . . . .3-22 Referenzzählung einsetzen . . . . . . . .3-23 Keine Referenzzählung einsetzen. . . . .3-24 Schnittstellen in verteilten Anwendungen einsetzen . . . . . . . . . . . . . . . . . . . 3-24 Mit Strings arbeiten. . . . . . . . . . . . . . . . 3-25 Zeichentypen . . . . . . . . . . . . . . . . . 3-25 String-Typen . . . . . . . . . . . . . . . . . . 3-26 Kurze Strings . . . . . . . . . . . . . . . . 3-26 Lange Strings. . . . . . . . . . . . . . . . 3-27 WideString . . . . . . . . . . . . . . . . . 3-28 PChar-Typen . . . . . . . . . . . . . . . . 3-28 OpenString . . . . . . . . . . . . . . . . . 3-28 Routinen der Laufzeitbibliothek zur String- Verarbeitung . . . . . . . . . . . . . . . . . 3-29 Wide-Zeichenroutinen. . . . . . . . . . . 3-29 Gebräuchliche Routinen für lange Strings . . . . . . . . . . . . . . . . . . . 3-30 Strings deklarieren und initialisieren . . . . 3-32 String-Typen mischen und konvertieren . . 3-33 Konvertierungen von String in PChar . . . 3-33 String-Abhängigkeiten . . . . . . . . . . 3-34 Lokale PChar-Variable zurückgeben. . . 3-34 Lokale Variable als PChar übergeben . . 3-34 Compiler-Direktiven für Strings. . . . . . . 3-35 Strings und Zeichen: Verwandte Themen . 3-36 Mit Dateien arbeiten . . . . . . . . . . . . . . . 3-36 Dateien bearbeiten . . . . . . . . . . . . . . 3-37 Datei löschen . . . . . . . . . . . . . . . . 3-37 Datei suchen . . . . . . . . . . . . . . . . 3-37 Dateiattribute ändern . . . . . . . . . . . 3-39 Datei umbenennen. . . . . . . . . . . . . 3-39 Datums-/Zeit-Routinen. . . . . . . . . . 3-40 Datei kopieren . . . . . . . . . . . . . . . 3-40 Dateitypen mit Datei-E/A . . . . . . . . . . 3-40 Datei-Streams verwenden . . . . . . . . . . 3-41 Dateien erstellen und öffnen . . . . . . . 3-42 Datei-Handle verwenden . . . . . . . . . 3-42 Dateien lesen und schreiben . . . . . . . 3-43 Strings lesen und schreiben. . . . . . . . 3-43 Datei durchsuchen. . . . . . . . . . . . . 3-44 Dateiposition und -größe . . . . . . . . . 3-44 Kopieren . . . . . . . . . . . . . . . . . . 3-45 Neue Datentypen definieren. . . . . . . . . . . 3-45 Kapitel 4 Anwendungen, Komponenten und Bibliotheken erstellen 4-1 Anwendungen erstellen . . . . . . . . . . . . . . 4-1 Windows-Anwendungen. . . . . . . . . . . . 4-1 Benutzeroberflächen. . . . . . . . . . . . . 4-2 iii IDE-, Projekt- und Compiler-Optionen festlegen . . . . . . . . . . . . . . . . . . 4-3 Quelltextvorlagen . . . . . . . . . . . . . . . 4-3 Konsolenanwendungen . . . . . . . . . . . . 4-3 Service-Anwendungen . . . . . . . . . . . . 4-4 Service-Threads . . . . . . . . . . . . . . . 4-6 Service-Namenseigenschaften. . . . . . . 4-8 Services testen. . . . . . . . . . . . . . . . 4-8 Packages und DLLs erstellen . . . . . . . . . . . 4-9 Unterschiede zwischen Packages und DLLs 4-9 Datenbankanwendungen erstellen. . . . . . . . 4-9 Verteilte Anwendungen erstellen . . . . . . . .4-10 Verteilte TCP/IP-Anwendungen erstellen. .4-10 Sockets in Anwendungen verwenden . . 4-11 Web-Server-Anwendungen erstellen . . . 4-11 Verteilte Anwendungen mit COM und DCOM erstellen. . . . . . . . . . . . . . . .4-12 COM und DCOM. . . . . . . . . . . . . .4-12 MTS . . . . . . . . . . . . . . . . . . . . .4-12 Verteilte CORBA-Anwendungen erstellen .4-12 Verteilte Datenbankanwendungen erstellen.4-13 Kapitel 5 Die Benutzeroberfläche erstellen 5-1 Die Klassen TApplication, TScreen und TForm 5-1 Das Hauptformular . . . . . . . . . . . . . . 5-1 Weitere Formulare hinzufügen . . . . . . . . 5-2 Formulare verknüpfen . . . . . . . . . . . 5-2 Auf Anwendungsebene arbeiten . . . . . . . 5-3 Mit dem Bildschirm arbeiten . . . . . . . . . 5-3 Das Layout festlegen. . . . . . . . . . . . . . 5-3 Mit Botschaften arbeiten . . . . . . . . . . . . . 5-5 Weitere Informationen zu Formularen . . . . . 5-5 Die Formularerstellung im Speicher steuern 5-5 Automatisch erstellte Formulare anzeigen5-6 Formulare dynamisch erstellen . . . . . . 5-6 Nichtmodale Formulare erstellen. . . . . 5-7 Formularinstanzen mit lokalen Variablen erstellen . . . . . . . . . . . . . . . . . . 5-7 Zusätzliche Argumente an Formulare übergeben . . . . . . . . . . . . . . . . . . . 5-8 Daten aus Formularen abrufen . . . . . . . . 5-9 Daten aus nichtmodalen Formularen abrufen . . . . . . . . . . . . . . . . . . . 5-9 Daten aus modalen Formularen abrufen.5-10 Komponenten und Komponentengruppen wieder verwenden . . . . . . . . . . . . . . . . . . . .5-12 Komponentenvorlagen . . . . . . . . . . . . . .5-12 Frames. . . . . . . . . . . . . . . . . . . . . . . .5-13 Frames erstellen . . . . . . . . . . . . . . . . 5-14 Frames in die Komponentenpalette einfügen. . . . . . . . . . . . . . . . . . 5-14 Frames verwenden und ändern . . . . . . . 5-14 Frames freigeben . . . . . . . . . . . . . . . 5-16 Menüs erstellen und verwalten . . . . . . . . . 5-16 Den Menü-Designer öffnen . . . . . . . . . 5-17 Menüs entwerfen . . . . . . . . . . . . . . . 5-18 Menüs benennen. . . . . . . . . . . . . . 5-19 Menüeinträge benennen . . . . . . . . . 5-19 Menüeinträge hinzufügen, einfügen und entfernen . . . . . . . . . . . . . . . . . 5-20 Untermenüs erstellen . . . . . . . . . . . 5-21 Das Menü anzeigen . . . . . . . . . . . . 5-23 Menüeinträge im Objektinspektor bearbeiten . . . . . . . . . . . . . . . . . . 5-24 Das lokale Menü des Menü-Designers verwenden . . . . . . . . . . . . . . . . . . 5-24 Die Befehle des lokalen Menüs. . . . . . 5-25 Zur Entwurfszeit zwischen Menüs wechseln . . . . . . . . . . . . . . . . . 5-25 Menüvorlagen verwenden . . . . . . . . . . 5-26 Ein Menü als Vorlage speichern . . . . . . . 5-27 Namenskonventionen für Menüeinträge und Ereignisbehandlungsroutinen in Vorlagen. . . . . . . . . . . . . . . . . . 5-28 Menüeinträge zur Laufzeit bearbeiten . . . 5-29 Menüs kombinieren. . . . . . . . . . . . . . 5-29 Das aktive Menü festlegen: die Eigenschaft Menu . . . . . . . . . . . . . . . . . . . 5-29 Die Reihenfolge der kombinierten Menüeinträge festlegen: die Eigenschaft GroupIndex. . . . . . . . . . . . . . . . 5-29 Ressourcen-Dateien importieren. . . . . . . 5-30 ToolBar- und CoolBar-Komponenten erstellen 5-31 Eine Panel-Komponente als Symbolleiste hinzufügen . . . . . . . . . . . . . . . . . . 5-32 Einer Symbolleiste (TPanel) eine SpeedButton-Komponente hinzufügen 5-32 Einer SpeedButton-Komponente eine Grafik zuweisen . . . . . . . . . . . . . . . . . 5-33 Die Anfangseinstellungen einer SpeedButton-Komponente festlegen. . 5-33 Eine Gruppe von SpeedButton- Komponenten erstellen . . . . . . . . . 5-33 Eine SpeedButton-Komponente als Ein-/ Ausschalter verwenden . . . . . . . . . 5-34 Eine ToolBar-Komponente als Symbolleiste hinzufügen . . . . . . . . . . . . . . . . . . 5-34 iv Einer Symbolleiste (TToolBar) eine ToolButton-Komponente hinzufügen. .5-35 Einer ToolButton-Komponente eine Grafik zuweisen . . . . . . . . . . . . . . . . . .5-35 Die Anfangseinstellungen einer ToolButton- Komponente festlegen . . . . . . . . . .5-35 Eine Gruppe von ToolButton-Komponenten erstellen . . . . . . . . . . . . . . . . . .5-36 Eine ToolButton-Komponente als Ein-/ Ausschalter verwenden . . . . . . . . .5-36 Eine CoolBar-Komponente hinzufügen . . .5-36 Die Anfangseinstellungen einer CoolBar- Komponente festlegen . . . . . . . . . .5-37 Auf Mausklicks reagieren . . . . . . . . . . .5-37 Einer ToolButton-Komponente ein Menü zuweisen . . . . . . . . . . . . . . . . . .5-38 Verborgene Symbolleisten hinzufügen. . . .5-38 Symbolleisten ein- und ausblenden . . . . .5-38 Aktionslisten verwenden . . . . . . . . . . . . .5-39 Aktionsobjekte . . . . . . . . . . . . . . . . .5-39 Aktionen verwenden. . . . . . . . . . . . . .5-40 Quelltext zentral verwalten . . . . . . . .5-41 Eigenschaften verknüpfen . . . . . . . . .5-41 Aktionen ausführen . . . . . . . . . . . .5-41 Aktionen aktualisieren . . . . . . . . . . . 5-43 Vordefinierte Aktionsklassen . . . . . . . . .5-43 Standard-Bearbeitungsaktionen. . . . . .5-44 Windows-Standardaktionen. . . . . . . .5-44 Datenmengenaktionen . . . . . . . . . . .5-44 Aktionskomponenten erstellen . . . . . . . .5-45 Wie Aktionen ihre Zielobjekte lokalisieren. . . . . . . . . . . . . . . . .5-45 Aktionen registrieren. . . . . . . . . . . .5-47 Einen Aktionslisten-Editor erstellen . . .5-47 Beispielprogramme . . . . . . . . . . . . . .5-47 Kapitel 6 Mit Steuerelementen arbeiten 6-1 Drag&Drop-Operationen in Steuerelementen implementieren. . . . . . . . . . . . . . . . . . 6-1 Eine Drag-Operation beginnen . . . . . . . . 6-1 Gezogene Elemente akzeptieren . . . . . . . 6-2 Elemente ablegen. . . . . . . . . . . . . . . . 6-3 Eine Drag-Operation beenden . . . . . . . . 6-3 Drag&Drop-Operationen durch ein Drag- Objekt anpassen . . . . . . . . . . . . . . . 6-3 Den Drag-Mauszeiger ändern . . . . . . . . 6-4 Drag&Dock in Steuerelementen implementieren6-4 Ein fensterorientiertes Steuerelement als Ziel einer Andock-Operation definieren . . . . . 6-5 Ein Steuerelement als andockbares Steuerelement definieren . . . . . . . . . . . 6-5 Andock-Operationen von Steuerelementen steuern . . . . . . . . . . . . . . . . . . . . . 6-6 Steuerelemente vom Ziel einer Andock- Operation trennen . . . . . . . . . . . . . . . 6-6 Die Behandlung von Drag&Dock-Operationen durch Steuerelemente festlegen . . . . . . . 6-7 Text in Steuerelementen bearbeiten . . . . . . . . 6-7 Die Textausrichtung festlegen . . . . . . . . . 6-8 Bildlaufleisten zur Laufzeit hinzufügen . . . 6-8 Das Clipboard-Objekt hinzufügen . . . . . . 6-9 Text markieren . . . . . . . . . . . . . . . . . . 6-9 Den gesamten Text markieren . . . . . . . . 6-10 Text ausschneiden, kopieren und einfügen. 6-10 Markierten Text löschen . . . . . . . . . . . 6-11 Menüeinträge deaktivieren. . . . . . . . . . 6-11 Ein Popup-Menü bereitstellen . . . . . . . . 6-12 Das Ereignis OnPopup . . . . . . . . . . . . 6-12 Grafiken zu Steuerelementen hinzufügen . . . 6-13 Den Owner-Draw-Stil festlegen . . . . . . . 6-13 Grafikobjekte zu einer Stringliste hinzufügen . . . . . . . . . . . . . . . . . . 6-14 Grafiken zu einer Anwendung hinzufügen . . . . . . . . . . . . . . . . 6-14 Grafiken zu einer Stringliste hinzufügen 6-14 Owner-Draw-Elemente anzeigen . . . . 6-15 Größe von Owner-Draw-Elementen festlegen . . . . . . . . . . . . . . . . . . . 6-15 Alle Owner-Draw-Elemente anzeigen . . . 6-16 Kapitel 7 Mit Grafiken und Multimedia arbeiten 7-1 Grafikprogrammierung im Überblick . . . . . . 7-1 Den Bildschirm aktualisieren . . . . . . . . . 7-2 Grafikobjekt-Typen . . . . . . . . . . . . . . . 7-3 Häufig verwendete Eigenschaften und Methoden des Objekts Canvas . . . . . . . . 7-4 Eigenschaften des Objekts Canvas verwenden . . . . . . . . . . . . . . . . . . . 7-5 Stifte verwenden . . . . . . . . . . . . . . . 7-5 Pinsel verwenden . . . . . . . . . . . . . . 7-8 Pixel lesen und setzen . . . . . . . . . . . 7-10 Grafikobjekte zeichnen . . . . . . . . . . . . 7-10 Linien und Linienzüge zeichnen . . . . . 7-10 Formen zeichnen. . . . . . . . . . . . . . 7-11 v Behandlung mehrerer Zeichenobjekte in einer Anwendung. . . . . . . . . . . . . . . . . .7-13 Benötigte Zeichenwerkzeuge ermitteln . 7-13 Werkzeuge mit Hilfe von Mauspalettenschaltern wechseln . . . .7-14 Zeichenwerkzeuge verwenden . . . . . .7-15 In einer Grafik zeichnen . . . . . . . . . . . .7-18 Bildlauffähige Grafiken . . . . . . . . . .7-18 Bild-Steuerelemente hinzufügen . . . . .7-18 Grafikdateien laden und speichern. . . . . .7-20 Bilder aus Dateien laden . . . . . . . . . .7-21 Bilder in Dateien speichern . . . . . . . .7-21 Bilder ersetzen . . . . . . . . . . . . . . .7-22 Die Zwischenablage und Grafiken . . . . . .7-23 Grafiken in die Zwischenablage kopieren . . . . . . . . . . . . . . . . . .7-23 Grafiken in die Zwischenablage ausschneiden . . . . . . . . . . . . . . .7-23 Grafiken aus der Zwischenablage einfügen . . . . . . . . . . . . . . . . . .7-24 Der Gummiband-Effekt: Beispiel . . . . . . .7-24 Auf Mausaktionen reagieren . . . . . . .7-25 Felder einem Formularobjekt hinzufügen. . . . . . . . . . . . . . . . .7-28 Verbesserte Liniendarstellung . . . . . . . 7-29 Mit Multimedia arbeiten . . . . . . . . . . . . .7-31 Einer Anwendung Videoclips ohne Ton hinzufügen . . . . . . . . . . . . . . . . . .7-31 Beispiel für das Hinzufügen von Videoclips ohne Ton . . . . . . . . . . . . . . . . . .7-32 Einer Anwendung Audio- und/oder Videoclips hinzufügen . . . . . . . . . . . . . . . . . .7-33 Beispiel für das Hinzufügen von Audio- und/oder Videoclips . . . . . . . . . . .7-35 Kapitel 8 Multithread-Anwendungen entwickeln 8-1 Thread-Objekte definieren . . . . . . . . . . . . 8-2 Den Thread initialisieren . . . . . . . . . . . 8-3 Eine Standard-Priorität zuweisen. . . . . 8-3 Den Freigabezeitpunkt von Threads festlegen . . . . . . . . . . . . . . . . . . 8-3 Die Thread-Funktion schreiben. . . . . . . . 8-4 Der VCL-Haupt-Thread . . . . . . . . . . 8-4 Lokale Thread-Variablen verwenden . . . 8-5 Die Beendigung mit anderen Threads prüfen . . . . . . . . . . . . . . . . . . . 8-6 Clean-up-Quelltext schreiben . . . . . . . . . 8-6 Threads koordinieren. . . . . . . . . . . . . . . . 8-7 Gleichzeitigen Zugriff vermeiden . . . . . . . 8-7 Objekte sperren . . . . . . . . . . . . . . . 8-7 Kritische Abschnitte . . . . . . . . . . . . . 8-7 TMultiReadExclusiveWriteSynchronizer- Objekte . . . . . . . . . . . . . . . . . . . 8-8 Weitere Techniken für die gemeinsame Nutzung von Speicher. . . . . . . . . . . 8-9 Die Ausführung anderer Threads abwarten . 8-9 Warten, bis ein Thread vollständig ausgeführt ist . . . . . . . . . . . . . . . . 8-9 Warten, bis eine Aufgabe ausgeführt ist. 8-10 Thread-Objekte ausführen . . . . . . . . . . . . 8-11 Die Standard-Priorität überschreiben . . . . 8-11 Threads starten und stoppen. . . . . . . . . 8-12 Threads in verteilten Anwendungen . . . . . . 8-12 Threads und botschaftsbasierte Server . . . 8-13 Threads und verteilte Objekte . . . . . . . . 8-13 Anwendungen (EXE-Dateien) schreiben 8-13 Bibliotheken schreiben . . . . . . . . . . 8-14 Fehlersuche in Multithread-Anwendungen . . 8-15 Kapitel 9 Packages und Komponenten 9-1 Packages sinnvoll einsetzen . . . . . . . . . . . . 9-2 Packages und Standard-DLLs . . . . . . . . . 9-2 Laufzeit-Packages. . . . . . . . . . . . . . . . . . 9-3 Laufzeit-Packages in Anwendungen . . . . . 9-3 Packages dynamisch laden. . . . . . . . . . . 9-4 Benötigte Laufzeit-Packages auswählen . . . 9-4 Benutzerdefinierte Packages . . . . . . . . . . 9-5 Entwurfszeit-Packages . . . . . . . . . . . . . . . 9-6 Komponenten-Packages installieren . . . . . 9-6 Packages erstellen und bearbeiten . . . . . . . . 9-8 Ein Package erstellen . . . . . . . . . . . . . . 9-8 Ein bestehendes Package bearbeiten . . . . . 9-9 Quelldateien von Packages manuell bearbeiten . . . . . . . . . . . . . . . . . . . 9-9 Die Struktur eines Package. . . . . . . . . . 9-10 Packages benennen . . . . . . . . . . . . 9-10 Die requires-Klausel . . . . . . . . . . . . 9-10 Die contains-Klausel. . . . . . . . . . . . 9-11 Packages compilieren . . . . . . . . . . . . . 9-11 Spezielle Compiler-Direktiven für Packages . . . . . . . . . . . . . . . . . 9-12 Der Befehlszeilen-Compiler und -Linker 9-14 Package-Dateien nach erfolgreicher Compilierung. . . . . . . . . . . . . . . 9-14 Packages weitergeben . . . . . . . . . . . . . . 9-15 vi Anwendungen mit Packages weitergeben .9-15 Packages anderen Entwicklern zur Verfügung stellen . . . . . . . . . . . . . . . . . . . . .9-15 Package-Sammlungen . . . . . . . . . . . . .9-15 Kapitel 10 Anwendungen für den internationalen Markt 10-1 Internationalisierung und Lokalisierung . . . .10-1 Internationalisierung. . . . . . . . . . . . . .10-1 Lokalisierung . . . . . . . . . . . . . . . . . .10-2 Internationalisieren von Anwendungen . . . .10-2 Quelltext anpassen . . . . . . . . . . . . . . .10-2 Zeichensätze. . . . . . . . . . . . . . . . .10-2 OEM- und ANSI- Zeichensatz. . . . . . .10-2 Doppelbyte-Zeichensätze . . . . . . . . .10-2 16-Bit-Zeichen . . . . . . . . . . . . . . . .10-3 Bidirektionale Sprachen . . . . . . . . . . 10-4 Die Eigenschaft BiDiMode. . . . . . . . .10-6 Funktionen für bestimmte Gebietsschemas . . . . . . . . . . . . . .10-8 Die Benutzeroberfläche gestalten. . . . . . .10-9 Text . . . . . . . . . . . . . . . . . . . . . .10-9 Grafiken . . . . . . . . . . . . . . . . . . . 10-9 Formate und Sortierreihenfolge. . . . . 10-10 Tastenzuordnungen . . . . . . . . . . . 10-10 Ressourcen auslagern . . . . . . . . . . . . 10-10 Ressourcen-DLLs erstellen . . . . . . . . . 10-10 Ressourcen-DLLs verwenden. . . . . . . . 10-12 Ressourcen-DLLs dynamisch wechseln . . 10-13 Anwendungen lokalisieren . . . . . . . . . . . 10-13 Ressourcen lokalisieren . . . . . . . . . . . 10-13 Kapitel 11 Anwendungen weitergeben 11-1 Allgemeine Anwendungen weitergeben . . . . 11-1 Installationsprogramme verwenden . . . . . 11-2 Anwendungsdateien identifizieren. . . . 11-2 Anwendungsdateien nach Namens- erweiterung . . . . . . . . . . . . . . . . 11-3 Package-Dateien . . . . . . . . . . . . . . 11-3 ActiveX-Steuerelemente . . . . . . . . . . 11-3 Hilfsanwendungen . . . . . . . . . . . . . 11-4 Position von DLL-Dateien . . . . . . . . . 11-4 Datenbankanwendungen weitergeben . . . . . 11-4 Die Datenbank-Engine bereitstellen . . . . . 11-5 Borland Database Engine . . . . . . . . . 11-5 Datenbank-Engines von Fremd- herstellern . . . . . . . . . . . . . . . . . 11-6 SQL Links. . . . . . . . . . . . . . . . . . 11-6 MIDAS (Multi-tiered Distributed Application Services) . . . . . . . . . . . . . . . . . . . 11-7 Web-Anwendungen weitergeben . . . . . . . . 11-8 Unterschiedliche Host-Umgebungen berücksichtigen . . . . . . . . . . . . . . . . . 11-8 Bildschirmauflösung und Farbtiefe . . . . . 11-9 Anwendungen ohne dynamische Größenanpassung . . . . . . . . . . . . 11-9 Anwendungen mit dynamischer Größenanpassung der Formulare und Steuerelemente . . . . . . . . . . . . . . 11-9 Unterschiedliche Farbtiefen . . . . . . .11-11 Schriften . . . . . . . . . . . . . . . . . . . .11-11 Windows-Version . . . . . . . . . . . . . . .11-12 Software-Lizenzvereinbarungen . . . . . . . .11-12 DEPLOY.TXT . . . . . . . . . . . . . . . . .11-13 README.TXT . . . . . . . . . . . . . . . . .11-13 Lizenzvereinbarungen . . . . . . . . . . . .11-13 Dokumentation zu Produkten von Fremdherstellern . . . . . . . . . . . . . .11-13 Teil II Datenbankanwendungen entwickeln Kapitel 12 Datenbankanwendungen entwerfen 12-1 Datenbanken . . . . . . . . . . . . . . . . . . . 12-1 Datenbanktypen. . . . . . . . . . . . . . . . 12-2 Lokale Datenbanken. . . . . . . . . . . . 12-2 Remote-Datenbankserver . . . . . . . . . 12-3 Datenbanksicherheit . . . . . . . . . . . . . 12-3 Transaktionen . . . . . . . . . . . . . . . . . 12-4 Das Daten-Dictionary. . . . . . . . . . . . . 12-5 Referentielle Integrität, Stored Procedures und Trigger . . . . . . . . . . . . . . . . . . . . 12-6 Datenbankarchitektur . . . . . . . . . . . . . . 12-6 Skalierbarkeit planen . . . . . . . . . . . . . 12-7 Einschichtige Datenbankanwendungen . . 12-9 Zweischichtige Datenbankanwendungen . 12-9 Mehrschichtige Datenbankanwendungen 12-10 Benutzeroberflächen entwickeln . . . . . . . 12-12 Einzelne Datensätze anzeigen . . . . . . . 12-12 Mehrere Datensätze anzeigen . . . . . . . 12-13 Daten analysieren . . . . . . . . . . . . . . 12-14 Anzeige der Daten festlegen . . . . . . . . 12-14 Berichte erstellen . . . . . . . . . . . . . . 12-17 vii Kapitel 13 Ein- und zweischichtige Anwendunen erstellen 13-1 BDE-Anwendungen . . . . . . . . . . . . . . . .13-2 BDE-Architektur . . . . . . . . . . . . . . . .13-2 Grundlagen von Datenbanken und Datenmengen . . . . . . . . . . . . . . .13-3 Sitzungen verwenden . . . . . . . . . . .13-4 Verbindung mit Datenbanken. . . . . . . . .13-5 Transaktionen. . . . . . . . . . . . . . . . . . 13-5 Transaktionen explizit steuern . . . . . .13-6 Datenbank-Komponenten für Transaktionen verwenden . . . . . . . . . . . . . . . . .13-6 Die Eigenschaft TransIsolation . . . . . .13-7 Passthrough-SQL . . . . . . . . . . . . . .13-9 Lokale Transaktionen. . . . . . . . . . . .13-9 Aktualisierungen zwischenspeichern . . . 13-10 Datenbanktabellen erstellen und umstrukturieren . . . . . . . . . . . . . . 13-11 ADO-basierte Anwendungen . . . . . . . . . 13-11 ADO-basierte Architektur. . . . . . . . . . 13-12 Grundlagen zu ADO-Datenbanken und - Datenmengen . . . . . . . . . . . . . . 13-12 Verbindung zu ADO-Datenbanken herstellen . . . . . . . . . . . . . . . . . . 13-13 Daten abrufen. . . . . . . . . . . . . . . . . 13-13 ADO-Datenbanktabellen erstellen und umstrukturieren . . . . . . . . . . . . . . 13-14 Datenbankanwendungen mit unstrukturierten Daten . . . . . . . . . . . . . . . . . . . . . . 13-15 Datenmengen erstellen . . . . . . . . . . . 13-15 Neue Datenmengen mit persistenten Feldern erstellen. . . . . . . . . . . . . 13-16 Datenmengen mit Feld- und Indexdefinitionen erstellen . . . . . . 13-16 Datenmengen auf Grundlage bestehender Tabellen erstellen . . . . . . . . . . . . 13-17 Daten laden und speichern . . . . . . . . . 13-18 Das Aktenkoffer-Modell. . . . . . . . . . . 13-19 Skalierung auf eine dreischichtige Anwendung . . . . . . . . . . . . . . . . . . 13-20 Kapitel 14 Mehrschichtige Anwendungen erstellen 14-1 Vorteile des mehrschichtigen Datenbank- modells . . . . . . . . . . . . . . . . . . . . . .14-2 Grundlagen der MIDAS-Technologie . . . . . .14-3 Struktur einer mehrschichtigen MIDAS- Anwendung . . . . . . . . . . . . . . . . . 14-3 Die Struktur der Client-Anwendung . . . . 14-4 Die Struktur des Anwendungsservers . . . 14-5 MTS verwenden . . . . . . . . . . . . . . 14-6 Remote-Datenmodule verwalten . . . . 14-8 Schnittstelle IAppServer verwenden . . 14-8 Verbindungsprotokoll wählen . . . . . . . . 14-9 DCOM-Verbindungen einsetzen . . . . . 14-9 Socket-Verbindungen einsetzen . . . . 14-10 Web-Verbindungen einsetzen. . . . . . .14-11 OLEnterprise verwenden . . . . . . . . .14-11 CORBA-Verbindungen einsetzen . . . 14-12 Mehrschichtige Anwendungen erstellen. . . 14-12 Anwendungsserver erstellen . . . . . . . . . 14-13 Remote-Datenmodul einrichten . . . . . . 14-15 TRemoteDataModule konfigurieren. . 14-15 TMTSDataModule konfigurieren . . . 14-16 TCorbaDataModule konfigurieren . . 14-17 Daten-Provider für Anwendungsserver erstellen. . . . . . . . . . . . . . . . . . . 14-18 Schnittstelle des Anwendungsservers erweitern . . . . . . . . . . . . . . . . . . 14-19 Callbacks der Schnittstelle des Anwendungsservers hinzufügen . . 14-20 Schnittstelle des Anwendungsservers unter MTS erweitern. . . . . . . . . . 14-20 Client-Anwendung erstellen. . . . . . . . . . 14-20 Verbindung zum Anwendungsserver einrichten . . . . . . . . . . . . . . . . . . 14-21 Verbindung über DCOM angeben . . . 14-22 Verbindung über Sockets angeben . . . 14-23 Verbindung über HTTP angeben. . . . 14-24 Verbindung über OLEnterprise angeben . . . . . . . . . . . . . . . . . 14-24 Verbindung über CORBA angeben . . 14-25 Broker-Verbindungen . . . . . . . . . . 14-25 Server-Verbindungen verwalten. . . . . . 14-26 Verbindung zum Server einrichten . . 14-26 Server-Verbindung schließen oder ändern. . . . . . . . . . . . . . . . . . 14-27 Serverschnittstellen aufrufen. . . . . . . . 14-27 Transaktionen in mehrschichtigen Anwendungen verwalten. . . . . . . . . . . . . . . . . . . . 14-28 Haupt/Detail-Beziehungen unterstützen . . 14-29 Statusinformationen in Remote-Datenmodulen unterstützen . . . . . . . . . . . . . . . . . . 14-30 Web-basierte MIDAS-Anwendungen erstellen14-32 viii Client-Anwendung als ActiveX-Steuerelement weitergeben . . . . . . . . . . . . . . . . . 14-33 ActiveX-Formular für die Client- Anwendung erstellen. . . . . . . . . . 14-33 Web-Anwendungen mit InternetExpress erstellen . . . . . . . . . . . . . . . . . . . 14-34 InternetExpress-Anwendung erstellen . 14-35 Javascript-Bibliotheken verwenden. . . 14-36 Zugriffs- und Startberechtigung für den Anwendungsserver gewähren. . . . . 14-37 XML-Broker verwenden. . . . . . . . . . . 14-37 XML-Datenpakete abrufen . . . . . . . 14-38 Aktualisierung aus XML- Datenpaketen eintragen . . . 14-39 Web-Seiten mit einem MIDAS-Seitengenerator erstellen . . . . . . . . . . . . . . . . . . . 14-40 Web-Seiteneditor verwenden . . . . . . 14-41 Eigenschaften von Web-Elementen festlegen . . . . . . . . . . . . . . . . . 14-42 Vorlage des MIDAS-Seitengenerators anpassen . . . . . . . . . . . . . . . . . 14-43 Kapitel 15 Provider-Komponenten 15-1 Die Datenquelle festlegen. . . . . . . . . . . . .15-1 Aktualisierungen eintragen. . . . . . . . . . . .15-2 Datenpakete zusammenstellen . . . . . . . . . .15-2 Felder für Datenpakete festlegen . . . . . . .15-3 Optionen für Datenpakete einstellen. . . . . 15-3 Datenpaketen benutzerdefinierte Daten hinzufügen . . . . . . . . . . . . . . . . . .15-4 Auf Datenanforderungen des Client reagieren .15-5 Auf Aktualisierungsanforderungen des Client reagieren . . . . . . . . . . . . . . . . . . . . .15-6 Delta-Pakete vor dem Aktualisieren der Datenbank bearbeiten . . . . . . . . . . . .15-7 Die Art der Aktualisierung steuern . . . . .15-8 Bestimmte Aktualisierungen überwachen. .15-9 Aktualisierungsfehler beheben . . . . . . . 15-10 Aktualisierungen in Datenmengen mit mehreren Tabellen . . . . . . . . . . . . . 15-10 Auf Client-Ereignisse reagieren . . . . . . . . 15-11 Server-Beschränkungen . . . . . . . . . . . . . 15-11 Kapitel 16 Datenbanksitzungen 16-1 Mit einer Sitzungskomponente arbeiten . . . .16-2 Die Standardsitzung . . . . . . . . . . . . . .16-2 Zusätzliche Sitzungen erzeugen . . . . . . .16-3 Sitzungsnamen zuweisen. . . . . . . . . . . 16-4 Eine Sitzung aktivieren . . . . . . . . . . . . 16-5 Den Start der Sitzung anpassen . . . . . . . 16-6 Das Standardverhalten von Datenbankverbindungen festlegen . . . . 16-6 Datenbankverbindungen erzeugen, öffnen und schließen . . . . . . . . . . . . . . . . . . . 16-7 Eine einzelne Datenbankverbindung schließen . . . . . . . . . . . . . . . . . 16-7 Alle Datenbankverbindungen schließen 16-8 Temporäre Datenbankverbindungen trennen . . . . . . . . . . . . . . . . . . . . 16-8 Nach einer Datenbankverbindung suchen . 16-9 Informationen über eine Sitzung abrufen . 16-9 BDE-Aliase . . . . . . . . . . . . . . . . . . 16-10 Die Sichtbarkeit von Aliasen festlegen .16-11 Sitzungs-Aliase für andere Sitzungen und Anwendungen sichtbar machen . . . .16-11 Bekannte Aliase, Treiber und Parameter festlegen. . . . . . . . . . . . . . . . . .16-11 Aliase erzeugen, ändern und löschen . 16-12 Durch die Datenbank-Komponenten einer Sitzung iterieren . . . . . . . . . . . . . . 16-13 Paradox-Verzeichnisse angeben . . . . . . 16-14 Das Verzeichnis der Steuerdatei festlegen. . . . . . . . . . . . . . . . . 16-14 Ein Verzeichnis für temporäre Dateien festlegen. . . . . . . . . . . . . . . . . 16-14 Kennwortgeschützte Paradox- und dBase- Tabellen . . . . . . . . . . . . . . . . . . . 16-15 Die Methode AddPassword verwenden16-15 Die Methoden RemovePassword und RemoveAllPasswords verwenden . . 16-16 Die Methode GetPassword und das Ereignis OnPassword verwenden . . 16-16 Mehrere Sitzungen verwalten . . . . . . . . . 16-17 Sitzungskomponenten in Datenmodulen verwenden . . . . . . . . . . . . . . . . . . . 16-19 Kapitel 17 Datenbankverbindungen 17-1 Persistente und temporäre Datenbank- Komponenten . . . . . . . . . . . . . . . . . . 17-1 Temporäre Datenbank-Komponenten. . . . 17-2 Datenbank-Komponenten zur Entwurfszeit erstellen. . . . . . . . . . . . . . . . . . . . 17-2 Datenbank-Komponenten zur Laufzeit erstellen. . . . . . . . . . . . . . . . . . . . 17-3 Verbindungen steuern . . . . . . . . . . . . . . 17-4 [...]... 50 - 25 Gültige Typen 50 - 25 Sichere Arrays 50 -2 7 Object-Pascal- oder IDL-Syntax verwenden 50 -2 7 Attribute-Spezifikationen 50 -2 7 Schnittstellen-Syntax 50 -2 9 Syntax von Dispatch-Schnittstellen 50 -2 9 CoClass-Syntax 50 -3 0 Enum-Syntax 50 -3 1 Alias-Syntax 50 -3 1 Record-Syntax 50 -3 1... 3 8-3 3 8-1 8 3 8-1 8 3 8-1 8 3 8-1 9 3 8-2 0 3 8-2 0 3 8-2 1 3 9-1 Die Komponente erstellen und registrieren 3 9-1 Die Komponentenklasse ändern 3 9-2 Den Konstruktor überschreiben 3 9-2 Den neuen Standardwert für die Eigenschaft festlegen 3 9-3 3 8-1 3 8-7 3 8-7 3 8-7 3 8-8 3 8-9 3 8-9 3 8-1 0 3 8-1 1 3 8-1 2 3 8-1 3 3 8-1 3 3 8-1 4 3 8-1 4 3 8- 15 3 8- 15 3 8-1 6 3 8-1 6 3 8-1 7 Kapitel 39 Kapitel... 2 1-1 9 Einschränkungen bei der Bearbeitung von aktualisierbaren Ergebnismengen 2 1-1 9 Nur-Lesen-Ergebnismengen aktualisieren 2 1-1 9 2 0-1 8 2 0-1 8 2 0-1 8 2 0-1 9 2 0-2 1 2 0-2 2 2 0-2 2 2 0-2 3 2 0-2 4 2 0-2 4 2 0-2 4 2 0-2 4 2 0-2 4 2 0- 25 2 0-2 6 2 0-2 6 2 0-2 7 2 0-2 8 2 0-2 8 2 0-2 9 2 0-3 0 Kapitel 21 Abfragen Kapitel 22 2 1-1 Stored Procedures Abfragen effektiv einsetzen 2 1-1 Abfragen für Desktop-Entwickler 2 1-2 ... 51 -2 Anforderungen an eine MTS-Komponente 51 -4 Verwalten von Ressourcen durch Just-in-timeAktivierung und Ressourcen-Pooling 51 -5 Just-in-time-Aktivierung 51 -5 Ressourcen-Pooling 51 -6 Ressourcen freigeben 51 -6 Objekt-Pooling 51 -7 Auf den Objektkontext zugreifen 51 -7 Unterstützung von Transaktionen in MTS 51 -8 Transaktionsattribute... Dialogfelder als Komponenten 4 1-1 4 1-1 4 1-2 4 1-3 4 1-4 41 -5 41 -5 4 1-6 COM-Anwendungen entwickeln Kapitel 44 4 1-8 4 1-1 0 4 1-1 0 4 1-1 1 4 1-1 1 4 1-1 2 4 1-1 3 COM-Technologien im Überblick 4 4-1 COM als Spezifikation und Implementierung 4 4-2 COM-Erweiterungen 4 4-2 Elemente einer COM-Anwendung 4 4-3 COM-Schnittstellen 4 4-3 Die grundlegende COM-Schnittstelle IUnknown... 2 9-3 HTTP-Server-Aktivitäten 2 9-3 Client-Anforderungen zusammenstellen 2 9-4 Client-Anforderungen bedienen 2 9-4 Auf Client-Anforderungen antworten 29 -5 Web-Server-Anwendungen 29 -5 Arten von Web-Server-Anwendungen 2 9-6 ISAPI und NSAPI 2 9-6 CGI-Programme 2 9-6 Win-CGI-Programme 2 9-6 Web-Server-Anwendungen erstellen 2 9-7 ... erstellen 4 9-1 Ein ASP-Objekt erstellen ASP-Objekte für In-Process- oder Out-ofProcess-Server erstellen Eine Anwendung als ASP-Objekt registrieren Einen In-Process-Server registrieren Einen Out-of-Process-Server registrieren Die ASP-Anwendung testen 4 9-2 4 9-3 4 9-4 4 9-4 4 9-4 49 -5 Kapitel 50 Mit Typbibliotheken arbeiten 50 -1 Der Typbibliothekseditor 50 -3 Die... 50 -2 1 Record-Elemente 50 -2 2 Union-Typinformationen 50 -2 2 Die Registerkarte Attribute für UnionObjekte 50 -2 2 Union-Elemente 50 -2 3 Modul-Typinformationen 50 -2 3 Die Registerkarte Attribute für Modul 50 -2 3 Modul-Elemente 50 -2 4 Modulmethoden 50 -2 4 Modulkonstanten 50 -2 4 Typbibliotheken... Standardwert angeben Array-Eigenschaften erstellen Eigenschaften speichern und laden Der Speicher- und Lademechanismus Standardwerte festlegen Was soll gespeichert werden? Initialisieren nach dem Laden 3 3-1 3 3-1 3 3-2 3 3-3 3 3-4 3 3-4 33 -5 33 -5 3 3-6 3 3-7 3 3-7 3 3-8 3 3-8 3 3-9 3 3-1 0 3 3-1 0 3 3-1 1 3 3-1 2 3 3-1 2 Kapitel 34 Ereignisse... 4 5- 2 Ein COM-Objekt mit dem COM-Objekt-Experten entwerfen 4 5- 2 Instantiierungstypen für COM-Objekte 4 5- 3 Ein Threading-Modell auswählen 4 5- 3 Ein Objekt schreiben, das das freie ThreadingModell unterstützt 4 5- 5 Ein Objekt schreiben, das das ApartmentThreading-Modell unterstützt 4 5- 6 Ein COM-Objekt registrieren 4 5- 6 Ein COM-Objekt . hinzufügen 6-1 4 Owner-Draw-Elemente anzeigen . . . . 6- 15 Größe von Owner-Draw-Elementen festlegen . . . . . . . . . . . . . . . . . . . 6- 15 Alle Owner-Draw-Elemente anzeigen . . . 6-1 6 Kapitel. .2 9-4 Client-Anforderungen bedienen . . . . . . .2 9-4 Auf Client-Anforderungen antworten . . . .29 -5 Web-Server-Anwendungen . . . . . . . . . . . .29 -5 Arten von Web-Server-Anwendungen. . . . 2 9-6 ISAPI. . 5- 35 Eine Gruppe von ToolButton-Komponenten erstellen . . . . . . . . . . . . . . . . . . 5- 36 Eine ToolButton-Komponente als Ein-/ Ausschalter verwenden . . . . . . . . . 5- 36 Eine CoolBar-Komponente