combit List & Label - Programmierer-Referenz - combit GmbH

combit List & Label - Programmierer-Referenz - combit GmbH combit List & Label - Programmierer-Referenz - combit GmbH

12.07.2015 Aufrufe

ReportingfürHeldenProgrammierer-ReferenzList

ReportingfürHelden<strong>Programmierer</strong>-<strong>Referenz</strong><strong>List</strong> &®


<strong>Programmierer</strong>-<strong>Referenz</strong>


<strong>List</strong> & <strong>Label</strong>Die in diesem Handbuch enthaltenen Angaben sind ohne Gewähr und können ohne weitere Mitteilung geändertwerden. Die <strong>combit</strong> <strong>GmbH</strong> geht hiermit keinerlei Verpflichtungen ein. Die Verfügbarkeit mancher in dieser Anleitungbeschriebener Funktionen (bzw. die Vorgehensweise, um darauf zuzugreifen), ist von Version, Releasestand,eingespielten Servicepacks u.ä. Ihres Systems (z.B. Betriebssystem, Textverarbeitung, eMailprogramm, etc.)sowie seiner Konfiguration abhängig.Die in diesem Handbuch beschriebene Software wird auf Basis eines Lizenzvertrages geliefert. Der Lizenzvertragbefindet sich bei der Verpackung der CD, bzw. für die ESD-Version im Internet unter www.<strong>combit</strong>.net und wirdauch durch das Installationsprogramm angezeigt.Dieses Handbuch oder Ausschnitte aus diesem Handbuch dürfen ohne schriftliche Genehmigung der <strong>combit</strong><strong>GmbH</strong> nicht kopiert oder in irgendeiner anderen (z.B. digitaler) Form vervielfältigt werden.Die JPEG-Codierung und -Decodierung wird mit Hilfe der JPEG Library der IJG (Independent JPEG Group) durchgeführt.PDF creation utilizes wPDF2 (c) wpCubed <strong>GmbH</strong> - www.pdfcontrol.comDataMatrix and QRCode generation is done using RDataMatrix and QRCode (c) J4L ComponentsAztec Barcode creation utilizes free code from Hand Held Inc.Nicht alle beschriebenen Features sind in allen Editionen verfügbar. Beachten Sie in diesem Zusammenhang dieHinweise zu LL_ERR_LICENSEVIOLATION.Copyright © <strong>combit</strong> <strong>GmbH</strong> 1992-2008; Rev. 13.003http://www.<strong>combit</strong>.netAlle Rechte vorbehalten.


InhaltsverzeichnisInhaltsverzeichnis1. Einleitung 101.1. Nach der Installation 101.1.1. Startmenü 101.1.2. Einstieg in den Designer 101.1.3. Einstieg in die Programmierung 101.1.4. Dokumentation 111.2. Ideen & Konzepte, die Sie kennen sollten 121.2.1. Datenbankunabhängiges Konzept 121.2.2. Prinzipieller Aufbau 121.2.3. Anpassungsfähiges, intelligentes Dialog-Design 141.2.4. Verfügbare Sprachen 141.2.5. Applikationsabhängige Einstellungen 141.2.6. Debugging-Unterstützung 151.3. Zum Ablauf des Programms benötigte Module 151.3.1. Systemvoraussetzung 151.4. Wichtige Anmerkungen 152. Einführung in die Programmierung 162.1. Welche Einbindungsart wähle ich? 162.1.1. Databinding 162.1.2. Print/Design-Methoden 162.1.3. Eigene Druckschleife 172.2. Die verschiedenen Projekttypen 172.2.1. Etiketten und Karteikarten 172.2.2. <strong>List</strong>en 172.3. Die <strong>List</strong> & <strong>Label</strong> Dateien 182.4. Programmiergrundlagen 192.4.1. Der <strong>List</strong> & <strong>Label</strong> Job 192.4.2. Variablen und Felder in <strong>List</strong> & <strong>Label</strong> 192.4.3. Übergabe von NULL-Werten 202.4.4. Variablen- und Feldtypen 202.5. Die Methoden Print und Design 252.6. Die eigene Druckschleife 272.6.1. Die Datenversorgung 272.6.2. Echtdatenvorschau oder Druck? 272.6.3. Exportmodule 282.6.4. Grundlegender Ablauf 282.6.5. Etiketten und Karteikartendruck 282.6.6. <strong>List</strong>endruck 293. Weiterführende Programmierung 313.1. Aufruf des Designers 313.1.1. Grundschema 313.1.2. Erläuterung 323


Inhaltsverzeichnis43.2. Druckvorgang 333.2.1. Grundschema 333.2.2. Nachrichtenschleife 363.2.3. Erläuterung 373.2.4. Mehrere Tabellen 423.2.5. Verkettete Objekte 433.2.6. Preview 453.3. Ansteuerung von Chart- und Kreuztabellen-Objekten 473.3.1. Der Standardmodus (Voreinstellung) 473.3.2. Der erweiterte Modus 474. Ansteuerung des Berichtscontainer-Objekts 494.1. Benötigte API-Funktionen 494.2. Aufruf des Designers 504.3. Ansteuerung der Druckengine 524.3.1. Mehrere unabhängige Tabellen 524.3.2. Einfache 1:n-Relationen 544.3.3. Die rekursive Druckschleife 554.3.4. Übergabe der Master-Daten als Variablen 564.4. Umgang mit 1:1-Relationen 574.4.1. 1:1 Relation ohne Schlüsselfeldangabe 584.4.2. 1:1 Relation mit Schlüsselfeldangabe 584.4.3. Performance-Tipps 595. Verwendung der DOM-API 605.1. Grundlagen 605.1.1. DOM-Funktionen 625.1.2. Einheiten 655.2. Beispiele 655.2.1. Textobjekt anlegen 655.2.2. Tabelle anlegen 665.2.3. Projektparameter setzen 686. Arbeiten mit den Komponenten 706.1. Arbeiten mit der .NET Komponente 706.1.1. Prinzipielle Unterschiede 706.1.2. Einbindung der Komponente 706.1.3. Datenbindung 716.1.4. Einfache Print- und Design-Methoden 746.1.5. Übergabe von ungebundenen Variablen und Feldern 766.1.6. Auswahl der Sprache 816.1.7. Arbeiten mit Ereignissen 826.1.8. Individuelle Evaluierung von Ausdrücken 826.1.9. Zusammenarbeit mit den .NET Druck-Klassen 836.1.10. Arbeiten mit Vorschau-Dateien 846.1.11. Verwendung von <strong>List</strong> & <strong>Label</strong> zum Webreporting 866.1.12. Erweiterung des Designers 88


Inhaltsverzeichnis6.1.13. Weitere Unterschiede 946.2. Arbeiten mit der VCL Komponente 956.2.1. Einbindung der Komponente 956.2.2. Datenbindung 956.2.3. Einfache Print- und Design-Methoden 986.2.4. Übergabe von ungebundenen Variablen und Feldern 996.2.5. Auswahl der Sprache 1006.2.6. Arbeiten mit Ereignissen 1006.2.7. Anzeigen einer Vorschaudatei 1016.2.8. Arbeiten mit Vorschau-Dateien 1016.2.9. Erweiterung des Designers 1026.3. Arbeiten mit der OCX Komponente 1076.3.1. Einbindung der Komponente 1076.3.2. Einfache Print- und Design-Methoden 1086.3.3. Übergabe von ungebundenen Variablen und Feldern 1096.3.4. Auswahl der Sprache 1106.3.5. Arbeiten mit Ereignissen 1106.3.6. Anzeigen einer Vorschaudatei 1106.3.7. Arbeiten mit Vorschau-Dateien 1116.3.8. Erweiterung des Designers 1127. Programmierschnittstelle 1187.1. Dynamic Link Libraries 1187.1.1. Funktionsprinzip 1187.1.2. Installation einer DLL 1187.1.3. Einbindung der DLL-Routinen 1197.1.4. Einbindung in C/C++ über Import-Libraries 1197.1.5. Einbindung in Delphi 1207.1.6. Einbindung in C++Builder 1207.1.7. Einbindung in Visual Basic 1207.1.8. Einbindung in die .NET-Umgebung 1207.1.9. Einbindung in andere Programmiersprachen 1207.1.10. Wichtiges zu den Funktions-Parametern 1217.1.11. Datentypen bei C/C++, Delphi und VB 1217.1.12. Hexadezimal-Zahlen 1237.2. Hinweise zu den Parametern 1237.3. Allgemeines zum Rückgabewert 1237.4. Variablen/Felder und deren Werte 1237.4.1. Im Variablennamen verwendbare Zeichen 1247.4.2. Im Inhalt verwendbare Zeichen 1247.5. Rundung 1248. Funktionen und Operatoren im Designer 1249. Verwendung in internationaler Umgebung 1259.1. Westliche Codepages (SBCS) 1259.2. Fernöstliche Codepages (MBCS/DBCS) 1265


Inhaltsverzeichnis69.3. Unicode 1279.4. Implementierung in <strong>List</strong> & <strong>Label</strong> 1279.5. Projektaustausch bei unterschiedlichen Zeichensystemen 1289.6. Wortumbruch 1299.7. Lokalisierung von Datumswerten, Währungen und Zahlen 12910. Callbacks und Notifications 13110.1. Aufgabe 13110.1.1. Implementierung über OCX- oder VCL-Control 13110.1.2. Implementierung mit der DLL 13110.2. User-Objekte 13210.3. Definition einer Callbackroutine 13310.4. Datenübergabe an die Callbackroutine 13310.5. Datenübergabe per Nachricht 13410.6. Zwei Device Contexte? 13510.7. Übersicht 13511. Projekt-Parameter 16111.1. Grundlagen 16111.1.1. Parametertypen 16111.1.2. Druck des Projekts 16211.1.3. Vordefinierte Projektparameter 16211.1.4. Automatische Formularspeicherung 16412. Beschreibung der API-Funktionen 16613. Verwaltung der Previewdateien 30513.1. Die Zugriffsfunktionen 30514. Die Export-Module 33014.1. Das Funktionsprinzip 33014.2. Die Programmierschnittstelle der Export-Module 33014.2.1. Export-Module global (de)aktivieren 33014.2.2. Einzelne Export-Module ein- und ausschalten 33014.2.3. Ausgabemedium festlegen/abfragen 33114.2.4. Export-spezifische Optionen setzen 33214.2.5. Export ohne Benutzerinteraktion durchführen 33314.2.6. Export-Ergebnis abfragen 33314.3. HTML Export-Modul 33314.3.1. Vorgehensweise des Export-Moduls 33414.3.2. Einschränkungen 33414.3.3. Die Programmierschnittstelle 33614.3.4. Hyperlinks 34314.3.5. HTML-Formular Generierung 34314.4. MHTML Export-Modul 34514.4.1. Die Programmierschnittstelle 34514.5. XML Export-Modul 345


Inhaltsverzeichnis14.5.1. Die Programmierschnittstelle 34514.6. RTF Export-Modul 35114.6.1. Die Programmierschnittstelle 35214.7. PDF Export-Modul 35614.7.1. Die Programmierschnittstelle 35614.8. Excel Export-Modul 36014.8.1. Die Programmierschnittstelle 36114.9. XPS Export-Modul 36714.9.1. Die Programmierschnittstelle 36714.10. Text Export-Modul 36814.10.1. Die Programmierschnittstelle 36814.11. TTY Export-Modul 37214.11.1. Die Programmierschnittstelle 37214.12. Grafik Export-Modul 37314.12.1. Die Programmierschnittstelle 37314.13. Fax Export-Modul 37514.14. Exportdateien digital signieren 37614.14.1. Signaturvorgang starten 37714.14.2. Programmierschnittstelle 37714.15. Exportdateien per eMail verschicken 37814.15.1. eMail Parameter per Programm setzen 37814.16. Exportdateien in ZIP-Archiv komprimieren 38215. Das Viewer-OCX-Control 38315.1. Übersicht 38315.2. Registrierung 38315.3. Eigenschaften 38315.4. Methoden 38515.5. Ereignisse 38615.6. Visual C++ Hinweis 38715.7. Benötigte Dateien 38715.8. Verpacken in CAB-Files 38815.9. Einbau in Ihre Internet-Seite 38816. Die eigenständige Viewer-Application 38916.1. Aufgabe 38916.2. Kommandozeilenoptionen 38916.3. Registrierung 38916.4. Benötigte Dateien 38917. Fehlercodes 39017.1. Allgemeine Fehlermeldungen 39017.2. Zusätzliche Fehlermeldungen der Storage-API 39318. DEBWIN2.EXE 39518.1. Aufgabe 3957


Inhaltsverzeichnis19. Anhang: Barcode-Formate 39620. Anhang: Konfigurationsdateien 39621. Anhang: Dateiformate 39722. Anhang: Neuerungen der Version 5 39822.1. Kurzzusammenfassung 39822.1.1. Allgemein 39822.1.2. Designer 39822.2. Neue Funktionen 39822.2.1. DLL-API 39822.3. Der Expression-Modus 39923. Anhang: Neuerungen der Version 6 40023.1. Kurzzusammenfassung 40023.1.1. Allgemein 40023.1.2. Oberfläche 40123.2. Neue Funktionen/Optionen 40223.2.1. DLL-API 40223.2.2. STGAPI 40323.3. Konzeptänderungen 40324. Anhang: Neuerungen der Version 7 40524.1. Kurzzusammenfassung 40524.1.1. Allgemein 40524.1.2. Oberfläche 40624.2. Neue Funktionen/Optionen 40624.2.1. DLL-API 40624.2.2. STGAPI 40825. Anhang: Neuerungen der Version 8 40925.1. Kurzzusammenfassung 40925.1.1. Allgemein 40925.1.2. Oberfläche 41025.2. Neue Funktionen/Optionen 41025.2.1. DLL-API 41026. Anhang: Neuerungen der Version 9 41226.1. Kurzzusammenfassung 41226.1.1. Allgemein 41226.1.2. Oberfläche 41226.2. Neue Funktionen/Optionen 41326.2.1. DLL-API 41327. Anhang: Neuerungen der Version 10 41427.1. Kurzzusammenfassung 41427.1.1. Allgemein 4148


Inhaltsverzeichnis27.1.2. Oberfläche 41427.2. Neue Funktionen/Optionen 41427.2.1. DLL-API 41427.3. Geänderte Funktionen/Optionen 41527.3.1. DLL-API 41528. Anhang: Neuerungen der Version 11 41628.1. Kurzzusammenfassung 41628.1.1. Allgemein 41628.1.2. Oberfläche 41628.2. Neue Funktionen/Optionen 41628.2.1. DLL-API 41628.3. Geänderte Funktionen/Optionen 41728.3.1. .NET-Komponente 41729. Anhang: Neuerungen der Version 12 41829.1. Kurzzusammenfassung 41829.1.1. Allgemein 41829.1.2. Oberfläche 41829.2. Neue Funktionen/Optionen 41829.2.1. DLL-API 41829.3. Geänderte Funktionen/Optionen 41929.3.1. .NET-Komponente 41930. Anhang: Neuerungen der Version 13 42030.1. Kurzzusammenfassung 42030.1.1. Allgemein 42030.1.2. Oberfläche 42030.2. Neue Funktionen/Optionen 42130.2.1. DLL-API 42130.3. Geänderte Funktionen/Optionen 42130.4. Umstellung auf <strong>List</strong> & <strong>Label</strong> 13 42130.4.1. Allgemein 42130.4.2. Umstellung von VB-Projekten 42230.4.3. Umstellung von Delphi-Projekten 42230.4.4. Umstellung von .NET-Projekten 42231. Tipps und Tricks 42331.1. Benutzerauswahl für das Druckmedium 42331.2. Geschwindigkeitstipps 42331.3. Automatisierter Betrieb in einem NT-Service 42331.4. Webreporting 42431.5. Weitere Tipps und Tricks 42432. Supportkonzept für <strong>combit</strong> Entwicklungstools 42533. Index 4269


Einleitung1. EinleitungHerzlichen Glückwunsch zum Kauf von <strong>List</strong> & <strong>Label</strong>. Mit <strong>List</strong> & <strong>Label</strong> haben Sie ein leistungsstarkesModul für Report, <strong>List</strong>en-, Etiketten,- Formular-, Chart- und Barcode-Druckerworben.Sie werden es mit diesem flexiblen Tool einfach haben, Ihrem Programm Druckfähigkeitenzu geben, die über ein attraktives Design verfügen und professionellen Ansprüchengenügen.1.1. Nach der Installation1.1.1. StartmenüNach der Installation von <strong>List</strong> & <strong>Label</strong> finden Sie im Windows Startmenü die Programmgruppe<strong>combit</strong> > <strong>combit</strong> <strong>List</strong> & <strong>Label</strong> 13. Mit Hilfe dieser Programmgruppe gelangen Siezu allen wichtigen Informationen bezüglich Einbindung, Dokumentationen und Beispielensowie weiterer nützlicher Tipps und Tricks.Diese Gruppe wird Ausgangspunkt für die folgenden Kapitel sein.1.1.2. Einstieg in den DesignerEine schnelle Möglichkeit sich mit dem Designer und seinen Möglichkeiten vertraut zumachen, bietet die <strong>List</strong> & <strong>Label</strong> Beispielanwendung. Diese finden Sie in der Startmenügruppewie im Kapitel 1.1.1. beschrieben. Mit Hilfe der Anwendung können Sie sofortden <strong>List</strong> & <strong>Label</strong> Designer starten und sich durch eine Vielzahl vorgefertigter Layoutbeispieleeinen Überblick über die Funktionalität und Flexibilität verschaffen. Der Designerwird über den Menüpunkt Design und Anwählen eines Eintrages - z.B. Rechnungsdruck -gestartet. Vor dem eigentlichen Start müssen Sie nur noch eine vorhandene Druckvorlagein dem Dateiauswahldialog auswählen – oder aber einen neuen Dateinamen eingeben.Nun steht Ihnen die volle Funktionalität des <strong>List</strong> & <strong>Label</strong> Designers zur Verfügung.Zusätzlich erlaubt es die <strong>List</strong> & <strong>Label</strong> Beispielanwendung, die vorhandenen oder auchneu erstellten Druckvorlagen zu drucken oder aber eines der Exportformate für die Ausgabezu verwenden. Wählen Sie im Menü Druck einen der Einträge. Im darauf folgendenDruckoptionsdialog können Sie das Ausgabeziel bzw. Exportformat wählen.1.1.3. Einstieg in die ProgrammierungUm eine schnelle Einarbeitung in das Konzept von <strong>List</strong> & <strong>Label</strong> zu gewährleisten, wirdmit der Installation eine Vielzahl von Programmierbeispielen mitgeliefert. Diese findenSie in der Startmenügruppe unterhalb des Eintrages Beispiele.10


Nach der InstallationJe nach installierter Entwicklungsumgebung finden Sie in den Verzeichnissen viele verschiedeneProgrammierbeispiele.Weitere Informationen zu den einzelnen Beispielen sowie Erläuterungen zu den verwendetenMethoden und Komponenten finden Sie im <strong>List</strong> & <strong>Label</strong> Startcenter, das direktnach der Installation gestartet wird.1.1.4. DokumentationUnterhalb der Menügruppe Dokumentationen finden Sie alle verfügbaren Dokumentationen.11


EinleitungDiese beinhalten die Programmier-<strong>Referenz</strong> sowie das Designerhandbuch als PDF Dokument.Zusätzlich finden Sie dort auch verschiedene Onlinehilfen, z.B. zum Designeroder den <strong>List</strong> & <strong>Label</strong> Komponenten (.NET, VCL, OCX) sowie weitere Informationen zuRedistribution, Webreporting, Debug usw..1.2. Ideen & Konzepte, die Sie kennen sollten1.2.1. Datenbankunabhängiges Konzept<strong>List</strong> & <strong>Label</strong> arbeitet datenbankunabhängig, d.h. <strong>List</strong> & <strong>Label</strong> selbst greift nicht direkt aufdie Datenbank zu und besitzt auch keine eigenen Datenbanktreiber. Dieses Konzeptbietet eine ganze Reihe enormer Vorteile, natürlich - nichts wird einem geschenkt - aucheinen kleinen Nachteil.Vorteile:• Kein unnötiger Ballast durch doppelt mitgeführte Datenbanktreiber, dadurch kann einGeschwindigkeitsvorteil sowie ein geringerer Platzbedarf der Module erreicht werden.• Flexibler Einsatz, da genaue Kontrolle der Daten.• Arbeiten auch ohne Vorhandensein einer Datenbank möglich.• Arbeiten mit seltenen Datenbanksystemen möglich.• Einfaches Mischen unterschiedlicher Datenquellen, z.B. Datenbankdaten und programminterneVariablen.• Datenbankdaten können vor dem Ausdruck noch einfach manipuliert werden.Nachteil:• Es muss tatsächlich etwas programmiert werden, d.h. <strong>List</strong> & <strong>Label</strong> müssen die Datenübergeben werden. Dies funktioniert aber nach einem sehr einfachen Prinzip und istsomit für die meisten Standardfälle mit relativ wenig Code-Schreibarbeit verbunden.AusnahmeKeine Regel ohne Ausnahme. Das datenbankunabhängige Konzept gilt nicht für dasVCL-Control, die .NET-Komponente und das VB-Control. Diese haben einen Modus, indem sie datengebunden eingesetzt werden können, um Ihnen eine möglichst einfacheVerwendung zu ermöglichen.1.2.2. Prinzipieller Aufbau<strong>List</strong> & <strong>Label</strong> besteht aus mehreren Modulen. Eine detaillierte Auflistung der einzelnenModule bzw. Dateien finden Sie in der Datei REDIST.TXT in Ihrem <strong>List</strong> & <strong>Label</strong> Installationsverzeichnis.Zur einfacheren Verwendung von <strong>List</strong> & <strong>Label</strong> werden mitgeliefert:• Ein Standard-OCX-Control für Entwicklungsumgebungen, die OCX-Controls einbindenkönnen• Ein VB-Control für die datengebundene Verwendung12


Ideen & Konzepte, die Sie kennen sollten• Ein VCL-Control für die Verwendung in Delphi• Eine .NET Assembly zur Verwendung unter Microsoft .NET SprachenUnd für die Vorschaudateien• Einer Applikation zur Anzeige der Preview-DateienDer wichtigste Teil, die Engine, ist funktional in 3 Teile gegliedert:• Der interaktive WYSIWYG-Layout-Designer, der ohne zusätzliche Runtime-Gebührenmit Ihren Applikationen an Endkunden weitergegeben werden kann.• Die Druck-Engine, um bestehende Projekte mit Daten zu füllen und zu Papier zubringen.• Die Preview-Engine, um bestehende Projekte mit Daten zu füllen und in einer Vorschauauf dem Bildschirm darzustellen bzw. anschließend auszudrucken.Der DesignerDer Designer ist der Programmteil, mit dem Sie interaktiv die Layouts für die drei Grundtypenvon Projekten definieren können: Reports / <strong>List</strong>en, Etiketten und Karteikarten.Diesen Designer können Sie bei Bedarf auch dem Endkunden anbieten, so dass dieserseine eigenen Projekte definieren oder die von Ihnen mitgegebenen Projekte seinenBedürfnissen anpassen kann.Zur Unterstützung dafür kann man einzelne Objekte eines Projekts sperren, so dass derBenutzer auf diese nicht zugreifen kann (beispielsweise, damit der Benutzer Ihr Logonicht löschen kann). Man kann die Benutzung des Layout-Dialogs einschränken, indemman Menüpunkte sperrt, so dass der Benutzer nicht in der Lage ist, diese Funktionen zubenutzen, oder indem man Objekte 'unantastbar' macht.Da <strong>List</strong> & <strong>Label</strong> datenbankunabhängig arbeitet, kann der Designer ohne dahinterstehendeAnwendung nicht "wissen", welche Felder und Variablen Sie Ihren Benutzern zurVerfügung stellen wollen. Dies ist aber - etwa für den Formelassistenten - unumgänglich.Daher muss Ihre Anwendung vor dem Aufruf des Designers die Variablen und Felderbei <strong>List</strong> & <strong>Label</strong> anmelden.Das AusdruckmodulDieser Programmteil hat die Aufgabe, die von Ihnen übergebenen Daten in der vomBenutzer oder von Ihnen definierten Form auf dem Drucker oder in einem Preview-Fenster darzustellen.Zur Verwaltung wird optional ein Dialog angeboten, in dem der Benutzer die von ihmgewünschten Ausdruckparameter einstellen kann, z.B. Drucker, Seitenzahl etc.Alle wichtigen Features, wie beispielsweise ein Datei-Ladedialog oder ein Abbruchfenstermit Fortschrittsanzeige sowie Teilausdrucke werden ebenso unterstützt.13


EinleitungDas Viewer-ControlDieses Control kann dazu verwendet werden, <strong>List</strong> & <strong>Label</strong>-Preview-Dateien anzusehenund zu drucken. Eingefügt werden kann es z.B. in eigene Projekte oder in eine Internet-Seite.1.2.3. Anpassungsfähiges, intelligentes Dialog-Design<strong>List</strong> & <strong>Label</strong> ermöglicht es, das Aussehen der Dialoge Ihren Wünschen anpassen zukönnen. So können Sie z.B. Bitmap-Buttons ein- und ausschalten und die Dialogdarstellungvon Windows-Standard auf mehrere verschiedene dreidimensionale Designs umschalten.Dies ermöglicht, dass <strong>List</strong> & <strong>Label</strong> möglichst nahtlos in Ihre Applikation eingepasstwerden kann.Sämtliche Dialoge und Fenster merken sich automatisch den Ort, an dem sie das letzteMal dargestellt wurden und öffnen sich bei einem erneuten Aufruf wieder an derselbenStelle.1.2.4. Verfügbare SprachenDer <strong>List</strong> & <strong>Label</strong> Designer ist optional zu deutsch in weiteren Sprachen erhältlich. Ebensoist eine Erweiterung auf zusätzliche Sprachen dank des modularen Aufbaus möglich.Bitte erkundigen Sie sich diesbezüglich bei unserem Vertrieb. Neben dem Designerwerden durch die Sprachkits auch die Druck-, Vorschau- und Exportdialoge lokalisiert,sofern es sich nicht um Common Dialogs handelt. Für diese ist die jeweilige Systemspracheentscheidend.Um ein Sprachkit nach Erwerb einzubinden, verwenden Sie bei LlJobOpen() die entsprechendeSprachkonstante bzw. setzen Sie bei Verwendung einer Komponente die Eigenschaft"Language" auf den gewünschten Wert. An Ihren Kunden liefern Sie die Sprachdateien(cmll13??.lng, cmls13??.lng) ebenfalls aus. Die Dateien werden dabei von <strong>List</strong> &<strong>Label</strong> im gleichen Verzeichnis wie die Haupt-DLL cmll13.dll erwartet.1.2.5. Applikationsabhängige EinstellungenFolgende Daten werden abhängig von der Server-Applikation, d.h. Ihrem Hauptprogramm(genauer: dem Programmnamen der Task) verwaltet:• Sprache• Dialogdesign• Dialogpositionen• Designer-Voreinstellungen (Farben, Schriftart)Dies bewirkt, dass die Einstellungen, die Ihr Programm bezüglich Sprache und Dialogdesignvornimmt, oder die Dialogpositionen und die Designer-Voreinstellungen, die vomBenutzer vorgenommen werden, nur für Ihre Applikation gültig sind. Somit braucht sichIhre Anwendung nicht darum zu kümmern, welche Einstellungen andere Applikationenvornehmen. Wenn eine Fremdapplikation z.B. englische 3D-Dialoge wünscht, könnenSie trotzdem deutsche 2D-Dialoge wählen, ohne darauf Rücksicht nehmen zu müssen.14


Zum Ablauf des Programms benötigte Module1.2.6. Debugging-UnterstützungDie Fehlerbeseitigung ist ein wichtiger Teil im Entwicklungsprozess einer Applikation.<strong>List</strong> & <strong>Label</strong> bietet die Möglichkeit, alle Funktionsaufrufe zu protokollieren, um Ihnen dieFehlerbeseitigung in Ihren Programmen zu erleichtern. Dabei werden alle Funktionsaufrufemit deren Parametern, dem Rückgabewert und eventuellen Fehlermeldungen aufdem Debugging-Output ausgegeben. Diesen können Sie mit dem mitgelieferten ToolDEBWIN2 (lesen Sie hierzu das Kapitel DEBWIN2.EXE) anzeigen lassen.Auch eigene Ausgaben können Sie über dieses Tool machen lassen.1.3. Zum Ablauf des Programms benötigte ModuleDie zur Weitergabe benötigten Dateien entnehmen Sie bitte der Datei REDIST.TXT inIhrem <strong>List</strong> & <strong>Label</strong> Installationsverzeichnis.1.3.1. Systemvoraussetzung<strong>List</strong> & <strong>Label</strong> ist lauffähig unter Windows NT4/98SE/2000/XP/2003/Vista.Einige Funktionalitäten stehen nur in aktuellen Betriebssystemen zur Verfügung. DieEinschränkungen finden Sie ggfs. an der entsprechenden Stelle.Hinweis: Die Verfügbarkeit mancher beschriebener Funktionen (bzw. die Vorgehensweise,um darauf zuzugreifen), ist von Version, Releasestand, eingespielten Servicepacksu.ä. Ihres Systems (z.B. Betriebssystem) sowie seiner Konfiguration abhängig.1.4. Wichtige Anmerkungen• Die Beispiele bei den Funktionsreferenzen sind in C-Syntax gehalten. Eine Portierungist jedoch sehr leicht möglich. Dafür ist das eigene Beispiel-Kapitel in Visual Basic-Syntax gehalten.• Texte in '' sind in die jeweilige Sprache und Anwendung einzupassen.• Bei Pfadangaben ist bei C oder C++ zu beachten, dass ein '\' als '\\' dargestellt werdenmuss!• Zu den Komponenten (OCX, VCL und .NET) sowie für den Designer stehen Online-Hilfen zur Verfügung.• Im Zweifel hilft bei Problemen oft die Debug-Ausgabe! Sehen Sie unter LlSetDebug()und LlDebugOutput() rsp. LsSetDebug() nach.15


Einführung in die Programmierung2. Einführung in die ProgrammierungDieses Kapitel soll Ihnen helfen, schnell in die Entwicklung mit <strong>List</strong> & <strong>Label</strong> einzusteigen.Sie finden bewusst einfach gehaltene Beispiele, die Ihnen einen schnellen Erfolg ermöglichensollten. Im folgenden Kapitel werden die demonstrierten Konzepte dann genauererläutert und auch fundierter erklärt.Ein guter Start ist auch die Arbeit mit einem unserer Beispiele, die wir für viele Programmiersprachenmitliefern. Sie finden diese in der Startmenügruppe Ihrer <strong>List</strong> & <strong>Label</strong>-Installation in der Untergruppe "Programmierbare Beispiele". Für viele weitere Sprachenwerden Deklarationsdateien mitgeliefert, die eine möglichst einfache Einbindung ermöglichen– hier ist es dann häufig möglich, sich an den Beispielen für andere Programmiersprachenzu orientieren.2.1. Welche Einbindungsart wähle ich?<strong>List</strong> & <strong>Label</strong> kann in einer Vielzahl von Programmiersprachen eingesetzt werden. Innerhalbder Programmiersprachen gibt es wiederum eine Vielzahl an Möglichkeiten – mankann datenbankgebunden, eventbasiert oder auch mit einer eigenen Druckschleife arbeiten.Dieser Abschnitt soll Sie bei der Wahl des richtigen Ansatzes unterstützen.2.1.1. DatabindingDiese Option steht Ihnen bei Verwendung der VCL-Komponente (Delphi, C++ Buider,Borland Developer Studio) und der .NET-Komponente (Visual Studio .NET, Delphi.NET,C#-Builder, Borland Developer Studio etc.) zur Verfügung. Mit Databinding lassen sichdie meisten Reportinganforderungen abdecken, dies ist die empfohlene Einbindungsartfür die o.g. Programmiersprachen. Insbesondere die Verwendung des Berichtscontainer-Objektes (s. Kapitel "4. Ansteuerung des Berichtscontainer-Objekts") wird in diesemModus automatisch richtig gemacht, so dass sich die Programmierung in aller Regel aufwenige Codezeilen beschränkt.Beispiele für diese Einbindungsart finden Sie im Unterverzeichnis "ProgrammierbareBeispiele" der Installation.2.1.2. Print/Design-MethodenDiese Methoden stehen Ihnen für das OCX, die VCL-Komponente und die .NET-Komponente zur Verfügung. Die Programmierung ist im Kapitel "2.5. Die Methoden Printund Design" ausführlich beschrieben. Die Datenübergabe erfolgt in diesem Falle eventbasiert.Dieser Ansatz bietet sich an, wenn ungebundene Daten (also Daten, die auskeiner Datenbank stammen und auch in keinem Datenzugriffsobjekt zur Verfügung stehen)reported werden sollen, z.B. Klassenarrays o.ä. und das Berichtscontainer-Objektnicht benötigt wird.16


Die verschiedenen Projekttypen2.1.3. Eigene DruckschleifeDiese Möglichkeit haben Sie in allen unterstützten Programmiersprachen. Die eigeneDruckschleife ist die mächtigste aber auch aufwändigste Art der Einbindung von <strong>List</strong> &<strong>Label</strong>. Sie haben in diesem Falle die volle Kontrolle über den Druckablauf. Dieser Ansatzsollte verwendet werden, wenn Ihnen die anderen beiden Optionen nicht zur Verfügungstehen, weil Sie keine Komponente verwenden, oder wenn Sie mit den anderen Optionennicht zum gewünschten Ziel kommen (z.B. bei sehr komplexen Anforderungen,speziellen Ausgabewünschen etc.).Die Ansteuerung der Druckengine ist im Kapitel "2.6. Die eigene Druckschleife" beschrieben.Sollten Sie auch das Berichtscontainer-Objekt ansprechen wollen (um z.B.mit mehreren Tabellen, Kreuztabellen und Charts arbeiten zu können), beachten Sie dieHinweise im Kapitel "4. Ansteuerung des Berichtscontainer-Objekts".Beispiele für diese Einbindungsart finden Sie im Unterverzeichnis "ProgrammierbareBeispiele" der Installation.2.2. Die verschiedenen Projekttypen<strong>List</strong> & <strong>Label</strong> beherrscht verschiedene Projektarten: Etiketten- und Karteikartenprojekteauf der einen Seite und <strong>List</strong>enprojekte auf der anderen.2.2.1. Etiketten und KarteikartenEtiketten- und Karteikartenprojekte unterscheiden sich prinzipiell nur in Ihrer initiellenGröße und in der Dateiendung - die Unterscheidung wurde eingeführt, damit die Dateienverschieden gespeichert werden, so dass der Ladedialog nur eine von beiden Artenanzeigt.Etikettenprojekte bestehen aus einer Anordnung von Objekten, die ein- oder mehrfach(zeilen- und spaltenweise) pro Seite ausgedruckt werden. Die Objekte beinhalten Variablen,die beim Ausdruck pro Etikett oder Karteikarte andere Werte annehmen können, jenach Datensatz.2.2.2. <strong>List</strong>en<strong>List</strong>en bestehen hingegen einerseits aus Objekten mit Variablen, die einmal pro Seiteausgegeben werden, und aus einem oder mehreren <strong>List</strong>enobjekten, in denen Felder mitentsprechend den Datensätzen variierenden Inhalten ausgegeben werden. Das DesignerobjektTabelle bzw. Berichtscontainer steht nur für diesen Projekttypen zur Verfügung.17


Einführung in die Programmierung2.3. Die <strong>List</strong> & <strong>Label</strong> Dateien<strong>List</strong> & <strong>Label</strong> speichert die Definition von Druckformularen in jeweils einzelnen Dateienab. Zusätzlich zu dieser grundlegenden Definition werden spezielle Einstellungen wieZieldruckername und -konfiguration, die im Designer bzw. Druckoptionsdialog angegebenwerden können, in einer gesonderten Datei gespeichert (die sog. "P-Datei"). Ebensoliegt die kleine Skizze des Formulars, welche im Dateiauswahl-Dialog angezeigt wird, ineiner eigenen Datei (die sog. "V-Datei").Dateiextension: Formular Drucker-DefinitionSkizze für DialogEtikettenprojekt .lbl .lbp .lbvKarteikartenprojekt .crd .crp .crv<strong>List</strong>enprojekt .lst .lsp .lsvDiese Datei-Erweiterungen sind nicht verbindlich und können über LlSetFileExtensions()oder LlSetOptionString() geändert werden.Die "entscheidende" Datei ist also lediglich die Formulardatei, welche die eigentlicheFormulardefinition enthält; die V-Datei kann jederzeit per LlCreateSketch() generiert werden.Ist die P-Datei nicht vorhanden, so nimmt <strong>List</strong> & <strong>Label</strong> automatisch den aktuelleingestellten Windows-Standard-Drucker und erstellt für diesen auch die P-Datei. DerPfad, an welchem die P-Datei gesucht bzw. erstellt wird, lässt sich per LlSetPrinterDefaultsDir()spezifizieren und könnte vor allem in einer Netzwerk-Anwendung relevant sein.Beim Druck auf Preview generiert <strong>List</strong> & <strong>Label</strong> eine Datei, welche alle gedruckten Vorschau-Seitenals Grafik enthält. Diese Datei hat die feste Endung .LL und kann auchjederzeit mit dem eigenständigen LLVIEW-Programm angesehen werden. Der Pfad, indem die LL-Datei erzeugt wird, lässt sich mittels LlPreviewSetTempPath() angeben.Bei Druck auf eines der Exportmodule werden Dateien in einem vom Programm oderdem Benutzer anzugebenden Pfad angelegt. Bitte informieren Sie sich in der Dokumentationdes Exportmodules über dessen Eigenschaften. Abfragen kann man eine <strong>List</strong>e dererstellten Dateien mit LL_OPTIONSTR_EXPORTFILELIST.Wenn eine Projektdatei gespeichert wird, wird eine Sicherungskopie angelegt. Der Nameder Sicherungskopie wird erstellt, indem eine Tilde ("~") vor die Projekt-Endung gesetztwird, beispielsweise wird aus der Endung ".LST" die Endung ".~LST".Wenn das Laufwerk, auf der die Projektdatei liegt, keine langen Dateinamen unterstützt,wird eine solchermaßen berechnete Endung auf 3 Zeichen gekürzt, hier also ".~LS".18


Programmiergrundlagen2.4. ProgrammiergrundlagenDieses Kapitel soll den schnellen und einfachen Einstieg in die Programmierung vonDruckausgaben mit <strong>List</strong> & <strong>Label</strong> ermöglichen. Aus diesem Grund werden hier lediglichdie Grundlagen erläutert, für eine fortgeschrittenere Programmierung lesen Sie bitte dieweiterführenden Kapitel.2.4.1. Der <strong>List</strong> & <strong>Label</strong> JobDamit <strong>List</strong> & <strong>Label</strong> die einzelnen Anwendungen, die mit <strong>List</strong> & <strong>Label</strong> drucken möchten,unterscheiden kann, ist ein sog. Jobmanagement erforderlich: Jede Anwendung, dieeine Funktionalität von <strong>List</strong> & <strong>Label</strong> nutzen möchte (Druck, Designer, etc.) muss dazuvorher einen Job öffnen (LlJobOpen(), LlJobOpenLCID()) und das zurückerhaltene Jobhandledann bei allen anderen <strong>List</strong> & <strong>Label</strong> Funktionsaufrufen mit übergeben.Entwickeln Sie mit einer der mitgelieferten Komponenten, so wird dieses Jobmanagementautomatisch durch das Control erledigt. Dementsprechend entfällt bei allen OCX-,VCL- und .NET-Funktionen das Jobhandle als Parameter.2.4.2. Variablen und Felder in <strong>List</strong> & <strong>Label</strong>In <strong>List</strong> & <strong>Label</strong> werden zwei Arten von Datenfeldern grundlegend unterschieden: Es gibtDatenfelder, die pro gedruckter Seite (bzw. pro Etikett oder Karteikarte) nur einmal mitDaten gefüllt werden (sprich: von Ihrer Anwendung mit Echtdateninhalt angemeldetwerden), dies sind in der <strong>List</strong> & <strong>Label</strong> Terminologie "Variablen". Dem gegenüber stehendie Datenfelder, welche mehrfach auf einer Seite mit unterschiedlichen Daten gefülltwerden, zum Beispiel die einzelnen Datenfelder einer Postenliste einer Rechnung. DieseDatenfelder werden in der <strong>List</strong> & <strong>Label</strong> Terminologie "Felder" genannt. Diese Felder stehenin Tabellenobjekten, die in <strong>List</strong> & <strong>Label</strong> für solche "<strong>List</strong>en- oder Wiederholbereiche"zuständig sind, zur Verfügung.Demzufolge gibt es in Etiketten- und Karteikartenprojekten lediglich Variablen, währendin <strong>List</strong>enprojekten sowohl Variablen als auch Felder vorkommen können. Für den Druckeiner Rechnung würde eine Anwendung typischerweise die Rechnungskopfdaten wieEmpfänger-Name und -Adresse und die Belegnummer als Variablen anmelden, hingegendie Postendaten wie Stückzahl, Artikelnummer, Stückpreis etc. als Felder.Das Anmelden und Definieren von Variablen samt Inhalt geschieht mit der <strong>List</strong> & <strong>Label</strong>Funktion LlDefineVariable[Ext]() und das Anmelden und Definieren von Feldern samtInhalt erfolgt über die Funktion LlDefineField[Ext]().Sie können im Designer auch Hierarchien aufbauen, indem Sie den Punkt "." als Hierarchietrennerverwenden. So können Sie z.B. "Person.Adresse.Strasse" und "Person.Adresse.Ort"als Variablen- oder Feldnamen verwenden. Im Designer wird darauseine hierarchische Ordnerstruktur, d.h. unterhalb von "Person" findet sich ein Ordner"Adresse" mit den Feldern "Ort" und "Strasse".19


Einführung in die Programmierung2.4.3. Übergabe von NULL-WertenSie können Werte auch als sog. NULL-Werte an <strong>List</strong> & <strong>Label</strong> übergeben. Dies sind Daten,für die keine Inhalte existieren, etwa ein Lieferdatum für eine Lieferung, die nochnicht erfolgt ist. Die meisten Datenbanktreiber erlauben die Abfrage des Feldinhaltes aufNULL. Übergeben Sie in diesem Falle als Inhalt des Feldes bzw. der Variablen die Zeichenkette"(NULL)" an <strong>List</strong> & <strong>Label</strong>. Diese Möglichkeit steht Ihnen für alle Typen desfolgenden Kapitels zur Verfügung.2.4.4. Variablen- und Feldtypen<strong>List</strong> & <strong>Label</strong> erlaubt die Spezifikation folgender Variablen- bzw. Feldtypen. Da die API-Funktionen zur Übergabe der Werte einen String als Wert erwartet, müssen die tatsächlichenWerte vor der Übergabe ggf. in eine Zeichenkette umgewandelt werden.TextKonstante:20LL_TEXTBeispielinhalt:"abcdefg"Bemerkung:Dieser kann spezielle, auf Wortumbrüche spezialisierte Zeichen beinhalten. Diesesind:WertLL_CHAR_NEWLINE, 0x0d,0x0aLL_CHAR_-PHANTOMSPACELL_CHAR_LOCKBedeutungTextobjekt: wird zu einem Leerzeichen, wenn imDesigner "kein Umbruch" ("Abschneiden") eingestelltwird.Tabellenfeld: Umbruch wird erzwungen. "Dashier"+chr$(LL_CHAR_NEWLINE)+"wird getrennt"das Zeichen wird ignoriert, wenn kein Umbruchgewünscht wird. Damit kann man auch andereZeichen als Umbruchzeichen deklarieren: bei "Diesist ein Doppel-"+chr$(LL_CHAR_-PHANTOMSPACE)+"Wort" kann bei Bedarf hinterdem Trennstrich getrennt werden.Wird vor Leerzeichen oder Tabs gestellt, und bedeutet,dass bei diesen kein Umbruch stattfindenkann: "Hier"+chr$(LL_CHAR_LOCK)+" bitte nicht"Die Codes dieser Zeichen können im Bedarfsfall per Option verändert werden(LL_OPTION_xxxREPRESENTATIONCODE).


ProgrammiergrundlagenNumerischKonstante:LL_NUMERICBeispielinhalt:Bemerkung:"3.1415", "2.5e3"Exponentialschreibweise ist erlaubt (2.5e3 entspricht 2.5*10^3). Nicht erlaubtsind Tausendertrennzeichen bei der Übergabe, z.B. "1.420.000,00". Beachten Sie,dass das Dezimaltrennzeichen bei Verwendung dieser Konstante bei der Übergabeimmer "." sein sollte.Bei folgendem Untertyp für numerische Werte können sie die Zahl direkt übergeben,wie Ihre Anwendung sie lokalisiert erstellt:Konstante:LL_NUMERIC_LOCALIZEDBeispielinhalt:"1.255,00"Bemerkung:Hier wird die Zahl als "lokalisierte" Zahl interpretiert, also z.B. "123.456,00" in einerdeutschen Betriebssystem-Umgebung. Intern geschieht die Umwandlung überdie OLE-API VarR8FromStr().DatumKonstante:LL_DATEBeispielinhalt:"2451158.5" (entspricht dem 11.12.1998 12:00 mittags), "1.5.2000" mit LL_DATE_-DMY Format oder "20000501" für LL_DATE_YYYYMMDD FormatBemerkung:Datumswerte werden im Julianischen Format erwartet. Das Julianische Datumspezifiziert ein Datum, indem als numerischer Wert die Anzahl vergangener Tagseit dem 01. Januar -4713 angegeben werden.Der Nachkommaanteil ist der Bruchteil eines Tags, über den Stunden, Minutenund Sekunden berechnet werden.21


Einführung in die ProgrammierungViele Programmiersprachen besitzen ebenfalls einen speziellen Datentyp für Datumswerte.Die Repräsentation erfolgt meist analog zum Julianischen Datum,häufig jedoch mit einem anderen Startdatum. Dies bedeutet in diesem Fall, dassnoch ein Offset hinzuaddiert werden muss. Um dies zumindest für die ProgrammiersprachenVisual Basic, Visual FoxPro und Delphi zu umgehen, gibt es in <strong>List</strong>& <strong>Label</strong> zusätzlich folgende spezielle Datumsvarianten:Konstante:LL_DATE_OLE, LL_DATE_MS, LL_DATE_DELPHI_1, LL_DATE_DELPHI, LL_DATE_-VFOXPROBemerkung:Dadurch kann direkt der Zahlenwert einer Datumsvariablen als String an <strong>List</strong> &<strong>Label</strong> übergeben werden, ohne dass in Ihrem Programm eine Umrechnung in dasJulianische Datum erfolgen muss - <strong>List</strong> & <strong>Label</strong> erledigt das für Sie.Um eine Übergabe des Datums zu erleichtern, gibt es zusätzlich noch folgendeDatentypen, die die Formatierung eines Datums in nicht-julianischer Form ermöglichen:Konstante:LL_DATE_DMY, LL_DATE_MDY, LL_DATE_YMD, LL_DATE_YYYYMMDD.Bemerkung:Bei den ersten drei Formaten müssen die Zahlen für Tag, Monat und Jahr jeweilsdurch Punkt (‚.‘), Schräg- (‚/‘) oder Bindestrich (‚- ‘) getrennt sein.Ebenfalls in nicht-julianischer Form wird das Datum bei dem folgenden Typ erwartet:Konstante:LL_DATE_LOCALIZEDBemerkung:Hier wird das Datum als "lokalisiertes" Datum interpretiert, also z.B. "1.5.2001" ineiner deutschen Betriebssystem-Umgebung. Intern geschieht die Umwandlungüber die OLE-API VarDateFromStr().LogischKonstante:LL_BOOLEANBeispielinhalt:"T"22


ProgrammiergrundlagenBemerkung:"T","Y","J","t","y","j","1" entsprechen "wahr", alle übrigen Werte entsprechen "falsch".RTF-formatierter TextKonstante:LL_RTFBeispielinhalt:Bemerkung:"{\rtf1\ansi[...]Hallo {\b Welt}!\par}"Der Variableninhalt muss mit "{\rtf" anfangen und anschließend RTF-formatiertenText enthalten.HTML-formatierter TextKonstante:LL_HTMLBeispielinhalt:"Hallo Welt"Bemerkung:Aus lizenzrechtlichen Gründen können keine GIF-Bilder ausgegeben werden.ZeichnungKonstante:LL_DRAWINGBeispielinhalt:Bemerkung:"c:\temp\sunny.wmf"Variableninhalt ist der Name einer Grafikdatei. (C/C++: doppelten '\\' bei Pfadangabenbenutzen!)Konstante:LL_DRAWING_HMETA, LL_DRAWING_HEMETA, LL_DRAWING_HBITMAP, LL_-DRAWING_HICON23


Einführung in die ProgrammierungBemerkung:Variableninhalt ist ein Handle auf eine entsprechende Grafik im Speicher (kannnur über LlDefineVariableExtHandle() oder LlDefineFieldExtHandle() definiert werden).BarcodeKonstante:LL_BARCODEBeispielinhalt:Bemerkung:"Barcodetext"Variableninhalt ist der Text, der in einem Barcode erscheinen kann. Die erlaubtenFormatierungen des Textes und die erlaubten Zeichen sind in der Online-Hilfe beschreiben.Konstante:LL_BARCODE_EAN13, LL_BARCODE_EAN8, LL_BARCODE_UPCA,LL_BARCODE_UPCE, LL_BARCODE_3OF9, LL_BARCODE_25INDUSTRIAL, LL_-BARCODE_25INTERLEAVED, LL_BARCODE_25DATALOGIC,LL_BARCODE_25MATRIX, LL_BARCODE_POSTNET, LL_BARCODE_FIM, LL_-BARCODE_CODABAR, LL_BARCODE_EAN128,LL_BARCODE_CODE128, LL_BARCODE_DP_LEITCODE,LL_BARCODE_DP_IDENTCODE, LL_BARCODE_GERMAN_PARCEL,LL_BARCODE_CODE93, LL_BARCODE_MSI, LL_BARCODE_CODE11,LL_BARCODE_MSI_10_CD, LL_BARCODE_MSI_10_10,LL_BARCODE_MSI_11_10, LL_BARCODE_MSI_PLAIN,LL_BARCODE_PDF417, LL_BARCODE_MAXICODE,LL_BARCODE_DATAMATRIX,LL_BARCODE_AZTEC,LL_BARCODE_MAXICODE_UPS, LL_BARCODE_JAPAN_POSTAL,LL_BARCODE_EAN14, LL_BARCODE_UCC14, LL_BARCODE_SSCCBenutzergezeichnetes ObjektKonstante:LL_DRAWING_USEROBJ, LL_DRAWING_USEROBJ_DLGBemerkung:Dieses Objekt wird per Callback/Event vom <strong>Programmierer</strong> selbst gezeichnet. BeiLL_DRAWING_USEROBJ_DLG kann der <strong>Programmierer</strong> im Designer auch eineneigenen Eigenschaftsdialog für das Objekt bereitstellen.24


Die Methoden Print und DesignDie Benutzung dieses Variablentyps gehört zur sehr fortgeschrittenen Programmierungund wird an anderer Stelle in diesem Handbuch behandelt.2.5. Die Methoden Print und DesignDiese beiden Methoden stellen – nach der Verwendung von Databinding - die einfachsteMöglichkeit dar, <strong>List</strong> & <strong>Label</strong> zu programmieren. Die Datenübergabe erfolgt in diesemFalle eventbasiert. Dieser Ansatz bietet sich an, wenn ungebundene Daten (also Daten,die aus keiner Datenbank stammen und auch in keinem Datenzugriffsobjekt zur Verfügungstehen) reported werden sollen, z.B. Klassenarrays o.ä. und das Berichtscontainer-Objekt nicht benötigt wird.Die Methoden sind nur im OCX-Control, der .NET-Komponente und in der VCL-Komponente enthalten. Eine genaue Beschreibung der Parameter können Sie aus denentsprechenden Online-Hilfen entnehmen.Eine detaillierte Beschreibung der Programmierung mit der .NET-Komponente und derenBesonderheiten finden Sie im Kapitel "6.1. Arbeiten mit der .NET Komponente".Verwenden Sie diese Methoden, um z.B. den einfachen Etiketten- bzw. <strong>List</strong>endruck zuprogrammieren.Die Komponenten stellen einen Event CmndSetPrintOptions (OCX) bzw.OnSetPrintOptions (VCL) bereit, über den Sie Optionen für den Druck setzen können(LlPrintSetOption() bzw. LlPrintSetOptionString()). Mithilfe dieser Optionen können Siez.B. auch bei Verwendung der Print/Design-Methoden einen stummen Export realisieren.Details zu den dafür benötigten Optionen finden Sie im Kapitel "14.2.5. Exportohne Benutzerinteraktion durchführen". Eine Beschreibung des Events finden Sie auchin der Komponenten-Onlinehilfe.Die .NET-Komponente bietet eine Eigenschaft "ExportOptions", über die die Optionengesetzt werden können. Ein Beispiel hierfür ist ebenfalls im Lieferumfang enthalten.Wenn Sie diese Methoden verwenden, müssen Sie die Events CmndDefineVariables,CmndDefineFields (OCX) bzw. den entsprechenden Event der VCL -Komponente unterstützen.Die eigentliche Übergabe der Daten an <strong>List</strong> & <strong>Label</strong> erfolgt in diesen Events.Dabei werden wie auch im Falle der selbst implementierten Druckschleife die FunktionenLlDefineField, LlDefineVariable usw. verwendet.Das folgende VB Beispiel demonstriert die Einfachheit dieser Methoden:'=======================================================================Private Sub ButtonPrint_Click()'======================================================================='Springt zum ersten DatensatzForm1.Data1.Recordset.MoveFirst'Druckt das Projekt "simple.lbl" ausret% = <strong>List</strong><strong>Label</strong>1.Print(0, LL_PROJECT_LABEL, _"simple.lbl",1 ,LL_PRINT_USERSELECT, LL_BOXTYPE_NORMALWAIT, hWnd,25


Einführung in die Programmierung"Print labels ", True, Environ$("temp"))End Sub'=======================================================================Private Sub ButtonDesign_Click()'=======================================================================' Springt zum ersten DatensatzForm1.Data1.Recordset.MoveFirst' Startet den Designer<strong>List</strong><strong>Label</strong>1.Design(0, hWnd, "Design <strong>Label</strong>s", LL_PROJECT_LABEL,"simple.lbl", 1)End Sub'=======================================================================Private Sub <strong>List</strong><strong>Label</strong>1_CmndDefineVariables( _ByVal nUserData As Long, ByValbDummy As Long, _pnProgressInPerc As Long, pbLastRecord As Long)'=======================================================================' Dieser Event wird von den <strong>List</strong> & <strong>Label</strong> Befehlen Print und' Design ausgelöst und wird für jeden Datensatz aufgerufen um' die Variablen und deren Inhalt an <strong>List</strong> & <strong>Label</strong> zu übergeben.Dim i As Integer26' Wiederholung für alle Felder eines DatensatzesFor i = 0 To Form1.Data1.Recordset.Fields.Count - 1' Umsetzung der Datenbank-Feldtypen in _' <strong>List</strong> & <strong>Label</strong> Typen, s. Funktion VarType() in der VB-HilfeSelect Case VarType(Form1.Data1.Recordset.Fields(i))'--- Numerische VariableCase 2, 3, 4, 5para = LL_NUMERICcontent$ = Form1.Data1.Recordset.Fields(i)'--- Falls der Datentyp "Datum" ist, Umwandlung in _'--- einen numerischen DatumswertCase 7para = LL_DATE_MSa! = CDate(Form1.Data1.Recordset.Fields(i))content$ = a!'--- Entscheidungsvariable (Ja/Nein), BooleanCase 11para = LL_BOOLEANcontent$ = Form1.Data1.Recordset.Fields(i)'--- Zeichenformat = TextCase Elsepara = LL_TEXTcontent$ = Form1.Data1.Recordset.Fields(i)End SelectnRet = Form1.<strong>List</strong><strong>Label</strong>1.LlDefineVariableExt(Form1.Data1.Recordset._Fields(i).Name, content$, para)Next i' Werden Echt-Daten benötigt? (nicht bei Designer-Aufruf)If bDummy = 0 Then' ja: bewege Satzzeiger, ...pnProgressInPerc = Form1.Data1.Recordset.PercentPosition' Gehe zum nächsten DatensatzForm1.Data1.Recordset.MoveNext' Wenn kein weiterer Datensatz mehr folgt, dann ' wird der' Druck beendet


Die eigene DruckschleifeIf Form1.Data1.Recordset.EOF = True ThenpbLastRecord = 1End IfEnd IfEnd Sub2.6. Die eigene Druckschleife2.6.1. Die Datenversorgung<strong>List</strong> & <strong>Label</strong> arbeitet in diesem Modus ebenfalls datenbankunabhängig. Das bedeutet,dass die Anwendungen bzw. Sie als <strong>Programmierer</strong> für die Datenversorgung zuständigsind. Sie teilen also <strong>List</strong> & <strong>Label</strong> per Funktionsaufruf mit, welche Daten(felder) von IhrerAnwendung überhaupt als druckbare Daten zur Verfügung gestellt werden (bspw. "EinFeld namens , ein Feld namens " etc.) und welchen Inhalt diesesFeld hat. Woher Sie letztlich zur Druckzeit die Inhalte der Datenfelder bekommen, spieltfür <strong>List</strong> & <strong>Label</strong> überhaupt keine Rolle. In den meisten Fällen dürfte vermutlich durch Sieein Lesezugriff auf ein entsprechendes Datensatz-Feld einer Datenbank erfolgen.Um den Designer zur Gestaltung der Druckformulare in Ihre Anwendung einzubauen,melden Sie per Funktionsaufruf jedes Ihrer vorhandenen bzw. gewünschten Datenfeldereinmal bei <strong>List</strong> & <strong>Label</strong> an. Dabei können Sie neben dem Datenfeld-Namen auch nochoptional einen Datentyp (z.B. Text, Numerisch, Logisch, Datum, etc.) übergeben, derbspw. für die Behandlung der Datenfelder in Formeln u.ä. im Designer relevant wird. Daim Designer aufgrund der Datenbankunabhängigkeit kein Echtdatenpreview dargestelltwird, können Sie außerdem einen Beispiel-Feldinhalt übergeben, der zur Designzeit fürdie Darstellung des (Design-)Previews genommen werden wird.Zur Druckzeit erfolgt die Datenübergabe im Prinzip analog, außer, dass anstatt des Beispiel-Feldinhaltesvon Ihnen der Echtdaten-Feldinhalt übergeben werden muss. Diesgeschieht für alle Felder, während Sie insgesamt über alle Ihre zu druckenden Datensätzeiterieren.2.6.2. Echtdatenvorschau oder Druck?Prinzipiell läuft Ihre Druckschleife immer gleich ab, unabhängig davon, ob auf Drucker(LL_PRINT_NORMAL), Vorschau (LL_PRINT_PREVIEW) oder Datei (LL_PRINT_FILE) gedrucktwird. Die Unterscheidung wird lediglich in einem Parameter beim Start desDruckvorganges programmierseitig festgelegt (siehe LlPrint[WithBox]Start()). Sie könnenallerdings diese Entscheidung auch dem (End-)Anwender überlassen (LL_PRINT_-USERSELECT), indem Sie ihm im Drucker-Dialog von LlPrintOptionsDialog() eine Auswahlmöglichkeitdes Druckziels anbieten. Sie selbst bräuchten dann lediglich nach demDruckvorgang den Fall, dass sich der Anwender für Preview-Druck entschieden hat,abzufragen und in diesem Falle den Preview (mittels LlPreviewDisplay()) anzuzeigen.27


Einführung in die Programmierung2.6.3. ExportmoduleUm zusätzlich zu Druck und Preview-Druck die Exportmodule benutzen zu können, könnennicht die o.g. LL_PRINT_xxx Flags benutzt werden, in diesem Falle sollten die Ausgabemedienüber die Funktionen LlPrintGetOptionStr() und LlPrintSetOptionStr() mit denFlags LL_OPTIONSTR_EXPORTS_ALLOWED, LL_PRNOPTSTR_EXPORT eingestellt werden.Weitere Informationen finden Sie im Kapitel "Die Export-Module".2.6.4. Grundlegender AblaufZunächst wird ein <strong>List</strong> & <strong>Label</strong> Job geöffnet (LlJobOpen[LCID]()) und ggf. anschließendglobale <strong>List</strong> & <strong>Label</strong> Optionen (LlSetOption()) eingestellt. Nun muss <strong>List</strong> & <strong>Label</strong> der Beginndes Druckvorgangs mitgeteilt werden (LlPrint[With]BoxStart()). Dabei wird außerdemspezifiziert, welche Etiketten- bzw. Formular-Definitionsdatei genommen werden soll. Zudiesem Zeitpunkt wird <strong>List</strong> & <strong>Label</strong> die angegebene Definitionsdatei öffnen und parsen.Dabei erfolgt auch eine syntaktische Überprüfung aller verwendeten Variablen, Felderund Formel-Ausdrücke. Dies bedeutet allerdings, dass <strong>List</strong> & <strong>Label</strong> bereits zu diesemZeitpunkt alle von Ihnen zur Verfügung gestellten Variablen und Felder kennen muss. Siemüssen also vor dem Aufruf von LlPrint[With]BoxStart() alle Variablen und Felder mit denFunktionen LlDefineVariable[Ext]() und LlDefineField[Ext]() definiert haben. Da es zu diesemZeitpunkt nur um die Namen und Typen und nicht um aktuelle Inhalte geht, könnenSie direkt dieselbe Routine verwenden, mit der Sie alle Felder und Variablen für denDesigner anmelden (z.B. mit einem Beispieldateninhalt, der keine Rolle spielt, oder auchmit dem Inhalt des ersten Datensatzes).Nach der optionalen Anzeige einer Druckerauswahlbox (LlPrintOptionsDialog()) erfolgtnun die eigentliche Druckschleife.2.6.5. Etiketten und KarteikartendruckFolgende einfache Schleife soll den Druck von Etiketten demonstrieren, während eine(fiktive) Datenbank durchlaufen wird. Dabei wird dem Anwender die Auswahl überlassen,ob er auf Echtdatenvorschau, Drucker oder in eine Datei drucken möchte:'Die Variablen für den Syntax Check anmelden (mit Dummy-Inhalt)<strong>List</strong><strong>Label</strong>1.LlDefineVariableExt("ItemNo", "0815", LL_TEXT)<strong>List</strong><strong>Label</strong>1.LlDefineVariableExt("Description", "dummy", LL_TEXT)<strong>List</strong><strong>Label</strong>1.LlDefineVariableExt("Price", "123", LL_NUMERIC)<strong>List</strong><strong>Label</strong>1.LlDefineVariableExt("Deliverable", "T", LL_BOOLEAN)<strong>List</strong><strong>Label</strong>1.LlPrintWithBoxStart(LL_PROJECT_LABEL, "Item.lbl",LL_PRINT_USERSELECT, LL_BOXTYPE_NORMALWAIT, hWnd, "Printing <strong>Label</strong>")'Druckeroptionsdialog anzeigen<strong>List</strong><strong>Label</strong>1.LlPrintOptionsDialog(hWnd, "")'Gewünschtes Druckziel merkennDest = <strong>List</strong><strong>Label</strong>1.LlPrintGetOption(LL_PRNOPT_PRINTDLG_DEST)28


Die eigene DruckschleifeData1.Recordset.MoveFirst()While (Not Form1.Data1.Recordset.EOF) and nLLError = 0<strong>List</strong><strong>Label</strong>1.LlPrintSetBoxText("Printing...",Form1.Data1.Recordset.PercentPosition)'Die Variablen anmelden und den Echtdateninhalt an <strong>List</strong> & <strong>Label</strong> übergeben:contents$ = Form1.Data1.Recordset.Fields(1)<strong>List</strong><strong>Label</strong>1.LlDefineVariableExt("ItemNo", contents$, LL_TEXT)contents$ = Form1.Data1.Recordset.Fields(2)<strong>List</strong><strong>Label</strong>1.LlDefineVariableExt("Description", contents$, LL_TEXT)contents$ = Form1.Data1.Recordset.Fields(3)<strong>List</strong><strong>Label</strong>1.LlDefineVariableExt("Price", contents$, LL_NUMERIC)contents$ = Form1.Data1.Recordset.Fields(4)<strong>List</strong><strong>Label</strong>1.LlDefineVariableExt("Deliverable", contents$, LL_BOOLEAN)'Und nun das Etikett drucken:nLLError = <strong>List</strong><strong>Label</strong>1.LlPrint()'LL_WRN_REPEAT_DATA kann bei Etiketten ignoriert werden:if nLLError = LL_WRN_REPEAT_DATA then nLLError = 0Data1.Recordset.MoveNext()Wend<strong>List</strong><strong>Label</strong>1.LlPrintEnd(0)'Wollte Anwender Druck auf Preview?if (nLLError = 0) and (nDest = LL_DESTINATION_PRV) then'Preview anzeigen und dann Preview-Datei (.LL) löschen<strong>List</strong><strong>Label</strong>1.LlPreviewDisplay("Item.lbl", "", hWnd)<strong>List</strong><strong>Label</strong>1.LlPreviewDeleteFiles("Item.lbl", "")end if2.6.6. <strong>List</strong>endruckNachfolgender Beispielcode (ohne jegliche Fehlerabfrage) für den Druck einer Rechnung("invoice.lst") auf Echtdatenvorschau hat die Definition der Variablen und Felder in zweiUnterroutinen gekapselt (DefineVars und DefineFields) und verwendet 2 Datenbanktabellen,Data1 für die Rechnungskopfdaten wie 'Rechnungsnummer', 'Empfänger' etc.,die als Variablen definiert werden, und Data2 für die jeweiligen Postendaten wie 'Stückzahl','Artikel-Nr' etc., die als Felder definiert werden.'Variablen und Felder mit Dummy-Daten für Syntax Check definierenDefineVarsDefineFields'Druck starten<strong>List</strong><strong>Label</strong>1.LlPrintWithBoxStart(LL_PROJECT_LIST, "invoice.lst",LL_PRINT_PREVIEW, LL_BOXTYPE_NORMALWAIT, hWnd, "Printing")'Dialog für Drucker-Einstellungen anzeigen<strong>List</strong><strong>Label</strong>1.LlPrintOptionsDialog(Form1.hWnd, "")'Gehe zum ersten Posten-DatensatzData2.Recordset.MoveFirst'Variablen mit "Echtdaten" füllen29


Einführung in die ProgrammierungDefineVars'Variablen drucken, auf Seitenumbruch achtenWhile <strong>List</strong><strong>Label</strong>1.LlPrint = LL_WRN_REPEAT_DATAWend'Solange das Ende der Posten-Tabelle nicht erreicht ist...While Not Data2.Recordset.EOF'Prozentbalken setzen<strong>List</strong><strong>Label</strong>1.LlPrintSetBoxText("Printing invoice",Data2.Recordset.PercentPosition)'Wenn die Rechnungs-Nr. übereinstimmtIf Data2.Recordset.Fields(0) = Data1.Recordset.Fields(0) Then'Felder mit "Echtdaten" aus aktuellem Posten-Datensatz füllenDefineFields'Felder drucken, und wenn Seitenumbruch erfolgt ist,'Variablen/Felder erneut druckenWhile <strong>List</strong><strong>Label</strong>1.LlPrintFields = LL_WRN_REPEAT_DATA<strong>List</strong><strong>Label</strong>1.LlPrintWendEnd If'Gehe zum nächsten Posten-DatensatzData2.Recordset.MoveNextWend'Drucke FußzeilenWhile <strong>List</strong><strong>Label</strong>1.LlPrintFieldsEnd = LL_WRN_REPEAT_DATAWend'Druck beenden<strong>List</strong><strong>Label</strong>1.LlPrintEnd(0)'Beim Preview-Druck Preview anzeigen und dann Preview-Datei (.LL) löschen<strong>List</strong><strong>Label</strong>1.LlPreviewDisplay(buf$, "", hWnd)<strong>List</strong><strong>Label</strong>1.LlPreviewDeleteFiles(buf$, "")Aus Gründen der Übersichtlichkeit haben wir auf die Unterroutinen DefineVars und DefineFieldsverzichtet. Sie können sich die Routinen aber genau analog zu den LlDefineVariable[Ext]()-Aufrufenaus dem Etikettendruckbeispiel vorstellen. In DefineVars auf wirddabei auf Data1 (die Rechnungsdaten) zugegriffen und LlDefineVariable[Ext]() benutztund in DefineFields auf Data2 (die Postendaten) zugegriffen und LlDefineField[Ext]()benutzt.30


Aufruf des Designers3. Weiterführende Programmierung3.1. Aufruf des Designers3.1.1. GrundschemaDer Aufruf des Designers sieht, in Pseudo-Sprache ausgedrückt, folgendermaßen aus(die Funktionen mit '*' sind optionale Aufrufe, die nicht unbedingt benötigt werden):(LlJobOpen, LlJobOpenLCID)*(LlSetOption,LlSetOptionString,LlSetDebug,LlSetFileExtensions,LlSetNotificationMessage,LlSetNotificationCallback)*(LlSetDlgboxMode)*LlSelectFileDlgTitleEx(LlDefineVariableStart,LlDefineVariable,LlDefineVariableExt,LlDefineVariableExtHandle)* (nur LL_PROJECT_LIST)(LlDefineFieldStart,LlDefineField,LlDefineFieldExt,LlDefineFieldExtHandle)*(LlDesignerProhibitAction,LlDesignerProhibitFunction)(LlDefineLayout)(LlJobClose)Zur Jobverwaltung (LlJobOpen[LCID]() und LlJobClose()) reicht es auch aus, den Job amProgrammanfang anzufordern und am Programmende freizugeben, und dann diesen Jobfür Designeraufrufe und Ausdrucke gleichermaßen zu verwenden. Ein Job-Handle kannüber die ganze Laufzeit der Applikation behalten werden, so dass man es erst zumSchluss wieder freigeben muss.Aus Übersichtsgründen empfehlen wir, globale Einstellungen, die für alle <strong>List</strong> & <strong>Label</strong>-Aufrufe gelten sollen, ein einziges Mal nach LlJobOpen[LCID]() zu tätigen (z.B. Dialogdesign,Debug- oder Expression-Modus), und die lokalen Einstellungen wie Menü-Sperreinträge direkt vor Aufruf des Designers oder des Drucks vorzunehmen.31


Weiterführende Programmierung3.1.2. ErläuterungWenn die Einstellung von <strong>List</strong> & <strong>Label</strong> Optionen gewünscht ist, müssen diese vor Aufrufdes Designers vorgenommen werden. So kann beispielsweise ein spezieller 3D-Dialogmodus überLlSetDlgboxMode(LL_DLGBOXMODE_ALT1);eingestellt bzw. die entsprechende Property in der OCX oder VCL Komponente gesetztwerden.Normalerweise wird nun der Benutzer über eine Dialogbox gefragt, welche Datei erbearbeiten möchte. In unserem Fall nehmen wir an, dass er ein Etikett bearbeiten will.Wichtig ist, dass 'buf' vorinitialisiert wurde - entweder auf einen leeren String (""), oderauf einen Dateinamenvorschlag:TCHAR buf[_MAX_PATH];strcpy(buf, "c:\\mylabel.lbl");LlSelectFileDlgTitleEx(hJob,hWindow, "Etikett auswählen", LL_PROJECT_-LABEL, buf, sizeof(buf), NULL);Bei Verwendung des OCX- oder VCL-Controls kann man sich den Puffer sparen:sFilename = "c:\mylabel.lbl";LL1.LlSelectFileDlgTitleEx(me.hWnd, "Etikett auswählen", LL_PROJECT_-LABEL, sFilename,"")Natürlich können Sie den Aufruf auch mit einer eigenen Dialogbox realisieren, oder Siekönnen den Dateinamen ohne Benutzerabfrage dem Designer übergeben, falls nichtgewünscht ist, dass der Benutzer wählen kann.Jetzt müssen <strong>List</strong> & <strong>Label</strong> die möglichen Variablen mitgeteilt werden, damit es diesedem Benutzer in der Variablenliste zur Verfügung stellt. Sonst könnte der Benutzer nurfesten Text in die Objektdefinitionen übernehmen.Zuerst wird der Variablenpuffer gelöscht (falls schon Variablen definiert wurden, aber derAufruf ist zur Sicherstellung eines leeren Variablenpuffers empfehlenswert):LlDefineVariableStart(hJob);Jetzt kann man die Variablen auf mehrere Arten angeben. Wenn der Designer zu einerVariablen eine Beispiel-Übersetzung kennt, wird diese im Preview-Fenster statt desVariablennamens verwendet, um eine realistischere Preview-Darstellung zu gewährleisten.LlDefineVariable(hJob, "Vorname", "Otto");LlDefineVariable(hJob, "Name", "Normalverbraucher");Im Preview wird der auf dem Designer-Arbeitsblatt stehende Ausdruck'Vorname+" "+Name'in die Ausgabe'Otto Normalverbraucher'umgesetzt.32


DruckvorgangDie erweiterte Variablendefinition mit LlDefineVariableExt() wird benutzt, um andereVariablentypen als Text, z.B. für Barcode-Objekte oder Zeichnungen zu definieren.Wenn auch <strong>List</strong>enobjekte gebraucht werden, also ein Projekt des Typs LL_PROJECT_-LIST bearbeitet werden soll, muss der <strong>Programmierer</strong> die hier möglichen Felder zur Verfügungstellen. Dies geschieht analog zu oben (auch z.B. Barcode-Felder und Zeichnungensind als Tabellenspalten möglich), nur dass die Funktionsnamen nun statt 'Variable''Field' enthalten:LlDefineFieldStart(hJob);LlDefineField(hJob, "Buch");LlDefineField(hJob, "ISBN");LlDefineFieldExt(hJob, "ISBN#", "40|15589|97531", LL_BARCODE_EAN13,NULL);LlDefineFieldExt(hJob, "Foto", "c:\\dwg\\test.bmp", LL_DRAWING, NULL);Vor dem Aufruf von LlDefineLayout() können dem Benutzer über LlDesignerProhibitAction()Menüpunkte gesperrt werden, oder verhindert werden, dass der Designer minimiertwird. Dies macht beispielsweise der Aufruf vonLlDesignerProhibitAction(hJob, LL_SYSCOMMAND_MINIMIZE);Jetzt ist alles so weit definiert, dass der Benutzer sein Etikett, seine Karteikarte oder<strong>List</strong>e definieren kann, indem der Designer aufgerufen wird.LlDefineLayout(hJob, hParentWindow, "Test-Titel", LL_PROJECT_LABEL,"test");(Für eine <strong>List</strong>e mit der Konstanten LL_PROJECT_LIST bzw. für eine Karteikarte mit LL_-PROJECT_CARD.)Beachten Sie, dass prinzipbedingt im Vorschaufenster des Designers mit nur einem(immer gleichen) Datensatz gearbeitet wird. Vor dem Aufruf des Designers wird ja nurein Datensatz übergeben, und <strong>List</strong> & <strong>Label</strong> hat keinen direkten Zugriff auf die Datenquelle.Um das endgültige Ergebnis betrachten zu können, muss ein Druck angestoßenwerden (s. das folgende Kapitel).Es empfiehlt sich, generell den Fehlercode von Funktionsaufrufen auszuwerten.3.2. Druckvorgang3.2.1. GrundschemaEin Ausdruck geht prinzipiell so vor sich (Die Funktionen mit '*' sind optionale Aufrufe,die nicht unbedingt benötigt werden):(LlJobOpen, LlJobOpenLCID)*(LlSetOption,LlSetFileExtensions,LlSetNotificationMessage,33


Weiterführende ProgrammierungLlSetNotificationCallback)*(LlSetDlgboxMode)*(LlSelectFileDlgTitleEx) (siehe unten)(LlJobClose)Das meiste ist schon von dem vorigen Kapitel bekannt, und die diesbezüglichen Aussagengelten auch für den Ausdruck. Was jedoch unterschiedlich ist, ist der unterlegteTeil.Etiketten und KarteikartendruckFür den Etiketten- oder Karteikarten-Ausdruck (LL_PROJECT_LABEL, LL_PROJECT_CARD)sieht nun folgendermaßen aus:34(LlDefineVariableStart,LlDefineVariable,LlDefineVariableExt,LlDefineVariableExtHandle)LlSetPrinterDefaultsDir(LlPrintStart,LlPrintWithBoxStart)*(LlPrintSetOption,LlPrintSetOptionString,LlPreviewSetTempPath)*(LlPrintOptionsDialog,LlPrintOptionsDialogTitle,LlPrintSelectOffset,[LlPrinterSetup])*(LlDefineVariable,LlDefineVariableExt,LlDefineVariableExtHandle,LlPrintIsVariableUsed)*(LlPrintGetOption,LlPrintGetOptionString,LlPrintGetPrinterInfo)*{*(LlPrintSetBoxText,LlPrintGetCurrentPage,LlPrintGetOption)(LlDefineVariable,LlDefineVariableExt,LlDefineVariableExtHandle,LlPrintIsVariableUsed)


Druckvorgang*(LlPrintEnableObject)(LlPrint)*}(LlPrintEnd){(LlPreviewDisplay)*(LlPreviewDeleteFiles)}<strong>List</strong>endruckUnd für den <strong>List</strong>enausdruck (LL_PROJECT_LIST) wird wie folgt ersetzt:(LlDefineVariableStart,LlDefineVariable,LlDefineVariableExt,LlDefineVariableExtHandle)(LlDefineFieldStart,LlDefineField,LlDefineFieldExt,LlDefineFieldExtHandle)LlSetPrinterDefaultsDir(LlPrintStart,LlPrintWithBoxStart)(LlPrintSetOption,LlPrintSetOptionString,LlPreviewSetTempPath)*(LlPrintOptionsDialog,LlPrintOptionsDialogTitle,LlPrintSelectOffset,[LlPrinterSetup])(LlDefineVariable,LlDefineVariableExt,LlDefineVariableExtHandle,LlPrintIsVariableUsed)*(LlPrintGetOption,LlPrintGetOptionString,LlPrintGetPrinterInfo){*(LlPrintSetBoxText,LlPrintGetCurrentPage,LlPrintGetOption)35


Weiterführende Programmierung36(LlDefineVariable,LlDefineVariableExt,LlDefineVariableExtHandle,LlPrintIsVariableUsed)*(LlPrintEnableObject) (drucke alle Objekte)(LlPrint)(LlPrint){(LlDefineField,LlDefineFieldExt,LlDefineFieldExtHandle,LlPrintIsFieldUsed)(LlPrintFields)*}}(LlPrintFieldsEnd)(LlPrintFieldsEnd)(LlPrintEnd){(LlPreviewDisplay)*(LlPreviewDeleteFiles)}Es empfiehlt sich grundsätzlich, den Fehlercode auszuwerten, insbesondere die Interaktionsfunktionenkönnen z.B. LL_ERR_USER_ABORTED zurückgeben, wenn der Benutzerauf den Abbruch-Button drückt!3.2.2. NachrichtenschleifeMit "Nachrichtenschleife" ist die Message-Loopwhile (PeekMessage(hWindow,&msg,0,0,PM_REMOVE)){TranslateMessage(&msg);DispatchMessage(&msg);


Druckvorgang}{LlPrintAbort(hJob);}gemeint, die eingesetzt werden sollte, wenn nicht die Abbruch-Box von <strong>List</strong> & <strong>Label</strong>benutzt wird, da ansonsten alle anderen Programme während des Ausdrucks keineoptimale Rechnerzeit zugeteilt bekommen. Dies ist gerade bei sehr umfangreichenDruckvorgängen dringend erforderlich, damit das Betriebssystem hierüber die Chancebekommt, Systemressourcen wieder freizugeben.Die Nachrichtenschleife ermöglicht es sowohl einer Dialogbox, sich darzustellen und aufEingaben (z.B. den Abbruch-Button) zu reagieren, als auch Windows, Aufgaben quasiparallelzu bearbeiten. Beim Drücken des Abbruch-Buttons wird LlPrintAbort(HLLJOB)aufgerufen, das verursacht, dass bei folgenden LlPrint....-Aufrufen immer der FehlercodeLL_ERR_USER_ABORTED zurückgegeben wird.Bei Delphi können Sie statt dieser Schleife Application.ProcessMessages, bei VisualBasic DoEvents aufrufen.3.2.3. ErläuterungDruck-Beginn: Einlesen der ProjektdateiBevor man den Druck starten kann, muss man erst wissen, welches Projekt geladenwerden soll und welche Variablen ihm zur Verfügung gestellt werden sollen.Nach der optionalen Frage an den Benutzer nach der Projektdatei über LlSelectFileDlgTitleEx()müssen alle Variablen definieren werden, die dieses Projekt haben könnte. Wenn<strong>List</strong> & <strong>Label</strong> auf einen Ausdruck stößt, in dem eine unbekannte Variable vorkommt, beendet<strong>List</strong> & <strong>Label</strong> den Ladevorgang (und damit den Druckvorgang) und gibt den entsprechendenFehlercode zurück. Die Variablendefinitionen werden analog zu denjenigenbeim Designer-Aufruf programmiert.Wenn es ein <strong>List</strong>en-Projekt (LL_PROJECT_LIST) ist, müssen auch die Felder definiertwerden.Außerdem gibt es da noch Sonderwünsche, die der Benutzer evtl. eingeben möchte,also erste Seitennummer, Zahl der Kopien, Wahl eines Druckers etc., so dass der Druckerdialognicht fehlen sollte (LlPrintOptionsDialog(), LlPrintOptionsDialogTitle()). Normalerweisesollte zumindest die Möglichkeit geboten werden, den Drucker vor dem Ausdruckzu ändern, da sonst der im Designer eingestellte Drucker verwendet wird.Druckfortschrittsanzeige und MultitaskingEs ist üblich, dem Benutzer eine 'Abbrechen'-Dialogbox anzubieten, mit deren Hilfe er dieMöglichkeit erhält, den Ausdruck abzubrechen. Noch schöner ist es natürlich, wenn derBenutzer durch diese Box auch noch mitgeteilt bekommt, wie weit der Druck fortgeschrittenist.37


Weiterführende Programmierung<strong>List</strong> & <strong>Label</strong> bietet eine Funktion an, die eine Druck-Abbruch-Dialogbox mit Fortschrittsanzeigerund dem Multitasking-Overhead startet. Diese Box kann dann mit den momentangültigen Werten (Fortschritt in Prozent, Seitennummer etc.) versorgt werden.Durch Verwendung dieser Funktion spart man sich außerdem die Nachrichtenschleife,weil diese in <strong>List</strong> & <strong>Label</strong> implementiert ist.LlPrintWithBoxStart(hJob, LL_PROJECT_LABEL, buf, LL_PRINT_NORMAL,LL_BOXTYPE_BRIDGEMETER, hWindow, "Mein Test");Wenn von dieser Funktion kein Fehler zurückgegeben wurde, hat <strong>List</strong> & <strong>Label</strong> jetzt dieDefinition des Projekts eingelesen und ist bereit zum Ausdruck. Der Drucker ist aber zudiesem Zeitpunkt noch nicht initialisiert, das kommt erst bei dem ersten Aufruf einerFunktion, die eine Ausgabe provoziert.Denn jetzt kann (oder muss) man erst noch die Druckparameter einstellen. Wenn mandem Benutzer die Änderung der Druckparameter gestatten will, ruft man den Dialogdafür mitLlPrintOptionsDialog(hJob, hWindow, "Druck-Parameter");auf. Über LlSetOption() und LlSetOptionString() werden vor diesem Aufruf programmeigeneStandardwerte vorgegeben, man kann beispielsweise unerwünschte Auswahlfelderim Dialog unterdrücken, z.B. überLlPrintSetOption(hJob, LL_PRNOPT_COPIES, LL_COPIES_HIDE);für die Abfrage nach der Zahl der Kopien.Wenn man (siehe unten) schon jetzt weiß, wie viele Datensätze ausgegeben werden,könnte man z.B. auch als Titelzeile anzeigen lassen, wie viele Datensätze oder Seiten zudrucken sind.Wenn im Dialog "Änderungen permanent" angekreuzt worden ist, wird die gewählteDruckereinstellung in die entsprechende Drucker-Definitionsdatei gespeichert(Schreib/Löschrechte müssen vorhanden sein), die alten Einstellungen gehen verloren.Ursprünglich wird diese im Designer unter Datei-Seitenlayout bestimmt. Wenn dieseDatei nicht vorhanden ist, wird als Druckereinstellung der Windows-Standarddruckerverwendet.Einschränkungen der Druckseiten durch den BenutzerFolgendes müssen Sie beachten, wenn man den Fall, dass der Anwender Anfangs- undEndseiten angibt, speziell abfragen möchte: die Werte für Anfangs- und Endseite sindStartseite und 32767, wenn "Druck aller Seiten" gewünscht ist. Startseite ist die angegebeneSeitennummer der ersten Seite.<strong>List</strong> & <strong>Label</strong> kann auch ohne Unterstützung des <strong>Programmierer</strong>s die Einschränkungender Seitenzahlen auswerten, so dass im nicht-optimierten Ausdruck der <strong>Programmierer</strong>auf diesen Fall keine Rücksicht nehmen muss.Auf alle Fälle sollten Sie den Druck beenden, wenn die aktuelle Seite größer ist als dieEndseite.38


DruckvorgangKopienEs gibt prinzipiell 2 verschiedene Möglichkeiten, was "Kopien" sind.a) Kopien von Etiketten und evtl. Karteikarten sollen meist nicht auf verschiedenen Seiten,sondern auf hintereinander liegenden Etiketten sein. Um diese Art zu unterstützen,fragen Sie vor dem ersten LlPrint() die Zahl der Kopien ab, weil Sie einfach jeden Datensatzentsprechend oft ausgeben müssen, und setzen den Kopienzähler auf 1 (damit <strong>List</strong>& <strong>Label</strong> nicht den Drucker anweist, entsprechend Kopien zu drucken!). Wichtig: Anschließendmuss unbedingt LL_PRNOPT_COPIES_SUPPORTED abgefragt werden, umdie Kopienanzahl auch im Drucker zu setzen:// Benutzer kann Kopienanzahl ändern...:LlPrintOptionsDialog(hJob, hWnd, "Druck...");nCopies = LlPrintGetOption(hJob, LL_PRNOPT_COPIES);LlPrintSetOption(hJob, LL_PRNOPT_COPIES, 1);LlPrintGetOption(hJob, LL_PRNOPT_COPIES_SUPPORTED);Bei dem Ausdruck muss dann jedes Etikett entsprechend oft ausgegeben werden:for (nCopy = 1; (nCopy < nCopies) && (nError == 0); ++nCopy){nError = LlPrint(hJob);// unterstütze AUTOMULTIPAGE (meist bei Karteikarten)while (nError == LL_WRN_REPEAT_DATA)nError = LlPrint(hJob);}b) Wirkliche Seitenkopien, d.h. mehrere identische Seiten, meist bei Reports.Hier wäre es schön, wenn man die Kopien einfach dem Drucker überlassen könnte... nurkönnen es nicht alle Drucker!Sie müssen also entscheiden: möchten Sie in einem solchen Fall die Kopien selbst machen,oder möchten Sie dann darauf verzichten?Wenn Sie darauf verzichten wollen, machen Sie es sich leicht: wenn der Drucker keineKopien unterstützt, wird über LlPrintSetOption(hJob, LL_PRNOPT_PRINTDLG_-ONLYPRINTERCOPIES, TRUE) die entsprechende Box im Optionen-Dialog disabled. Dannkann der Benutzer bei einem solchen Drucker keine Kopien einstellen.Wenn Sie die Kopien im Problemfall selbst machen wollen, müssen Sie erst einmalabfragen, ob der Drucker die Kopienzahl unterstützt:// Benutzer kann Kopienanzahl ändern...:LlPrintOptionsDialog(hJob, hWnd, "Druck...");// unsere Kopienzahl optimistisch auf 1 setzennCopies = 1;if (LlPrintGetOption(hJob, LL_PRNOPT_COPIES_SUPPORTED) == 0){// wird nicht vom Drucker unterstützt, also selbst übernehmennCopies = LlPrintGetOption(hJob, LL_PRNOPT_COPIES);// in <strong>List</strong> & <strong>Label</strong> auf 1 zurücksetzenLlPrintSetOption(hJob, LL_PRNOPT_COPIES, 1);}39


Weiterführende ProgrammierungDaraufhin müssen Sie die Daten selbst nCopies-fach ausgeben.<strong>List</strong> & <strong>Label</strong> hat, wie oben schon erwähnt, eine Option für <strong>Programmierer</strong>, die dem Benutzerüberhaupt nicht ermöglichen wollen, mehrere Kopien zu wählen: Wenn LL_-PRNOPT_COPIES auf LL_COPIES_HIDE gesetzt wird, erscheint die Abfrage gar nicht erstnicht in der Dialogbox.Optimierung der Geschwindigkeita) ProgrammoptimierungZuerst einmal kann man Variablendefinitionen, die über den Ausdruck hinweg konstantsein sollen, aus der Druckschleife herausziehen. Wenn Sie also bei <strong>List</strong>en immer IhrenFirmennamen als Briefkopf ausgeben wollen, definieren sie diesen am besten außerhalbder Schleife vor LlPrintStart() bzw. LlPrintWithBoxStart(). In diesem Fall dürfen Sie in derSchleife den Variablenpuffer nicht über LlDefineVariableStart() löschen!b) LlPrintIsVariableUsed(), LlPrintIsFieldUsed()Man kann außerdem abfragen, welche Variablen oder Felder in den Ausdrücken verwendetwerden. Wenn das Angebot an Variablen oder Feldern größer ist als die tatsächlichverwendete Zahl, dann lohnt sich der Einsatz dieser Funktionen schnell.Diese können erst verwendet werden, wenn der Druck gestartet wurde, also nachLlPrintStart() oder LlPrintWithBoxStart(), denn es sind genau diese Funktionen, die dasProjekt einlesen und die Verwendung der Variablen überprüfen! In diesem Fall dürfenSie in der Schleife den Variablenpuffer nicht über LlDefineVariableStart() löschen!Bei der Definition von Variablen während des Drucks fragt man folglich <strong>List</strong> & <strong>Label</strong>, obdiese Variable gebraucht wird:if (LlPrintIsVariableUsed()==1) thenGenauso bei Feldern:if (LlPrintIsFieldUsed()==1) thenc) Sonderzeichen in Variablen- oder FeldnamenVerwenden Sie keine Sonderzeichen in Variablennamen. Dann können Sie den Checküber LlSetOption(HLLJOB, LL_OPTION_XLATVARNAMES, 0) ausschalten und so unnötigeund häufige Berechnungen unterdrücken.d) ParameterüberprüfungWenn Ihre Applikation fertig gestellt und getestet ist, können Sie die Parameterüberprüfungvon <strong>List</strong> & <strong>Label</strong> über den Befehl LlSetOption(HLLJOB, LL_OPTION_-NOPARAMETERCHECK, 1) ausschalten . Auch hierdurch sparen Sie wertvolle Zeit, indemSie hoffentlich überflüssige Checks vermeiden.e) RTF-Control40


DruckvorgangVerwenden Sie es sparsam. Wenn es nicht unbedingt nötig ist, gar nicht. Dieses Controlhat naturgemäß recht viel Arbeit mit der Formatierung und schluckt viel Zeit, der Ausdruckdauert wesentlich länger als ohne RTF-Ausgabe.Weitere OptimierungsmöglichkeitenEinige der von <strong>List</strong> & <strong>Label</strong> verwendeten Systembibliotheken (z.B. riched20.dll) scheinenunter bestimmten Umständen Ressourcenverluste zu verursachen. Diese sind sehrklein, fallen aber bei jedem Laden und Entladen der DLL an.Diese DLLs werden von <strong>List</strong> & <strong>Label</strong> bei jedem Öffnen bzw. Schließen des "ersten" Jobsge- bzw. entladen. Insofern sollten Sie in Ihrer Applikation ein häufiges LlJobOpen() /LlJobClose() vermeiden oder aber zu Beginn einen Dummy-Job öffnen und diesen biszum Ende geöffnet halten. Damit wird das ständige Laden und Entladen der DLLs umgangen,und neben einer dadurch erreichten Geschwindigkeitsoptimierung werden auchdie Ressourcenverluste nicht mehr auftreten.Wichtige Hinweise für <strong>List</strong>enprojekteVariablen sind bei <strong>List</strong>enprojekten Werte, die für eine Seite gleich bleiben und Felderübernehmen die datensatzabhängigen Daten. Diese druckt man dann mit LlPrintFields().Bei dem Aufruf von LlPrint() werden die Objekte gezeichnet, die nicht <strong>List</strong>en oder nichtan <strong>List</strong>en angehängt sind. Wenn die Option LL_OPTION_DELAYTABLEHEADER nichtgesetzt ist, werden dann auch die <strong>List</strong>enköpfe gedruckt, ansonsten kommen diese erstbeim ersten Aufruf von LlPrintFields() auf das Papier. Dann erwartet <strong>List</strong> & <strong>Label</strong> dieDefinition der Datensätze.Bei jedem LlPrintFields() wird getestet, ob der auszugebende Datensatz noch in die <strong>List</strong>epasst. Wenn er nicht vollständig gedruckt werden konnte, meldet die Funktion LL_-WRN_REPEAT_DATA zurück - dann muss man daran denken, den Satzzeiger nicht zuerhöhen!Sind die <strong>List</strong>en gefüllt, muss man jetzt die Variablen für angehängte Objekte definieren,bevor man an den Schleifenanfang (also LlPrint()) zurückkehrt, denn bei diesem LlPrint()werden nun die angehängten Objekte gefüllt, die neue Seite begonnen und - siehe oben- wieder die Objekte der neuen Seite inklusive <strong>List</strong>enköpfe gedruckt.Wichtig: Felder für Fußzeilen müssen gleichzeitig mit den Datenzeilen definiert werden,d.h. bei Rechnungen für Zwischensumme muss der Betrag des momentanen Satzes miteingerechnet werden. Die Verwaltung, welche Fußzeile ausgegeben wird (wenn mindestensein Teil des Datensatzes gedruckt werden konnte, die neue, sonst die alte) übernimmt<strong>List</strong> & <strong>Label</strong>.Das Prinzip also:(LlPrint[WithBox]Start){41


Weiterführende Programmierung(LlPrint){(LlPrintFields){}}}(LlPrintFieldsEnd)(LlPrintFieldsEnd)(LlPrintEnd)Vorzeitiger Seitenumbruch ist möglich, indem man einfach aus der Felddefinitionsschleifeausbricht, denn ein LlPrint() beendet die aktuelle Seite, wenn diese schon bedrucktist. Dies ist eventuell für eine Seiten-Gruppierung wichtig.3.2.4. Mehrere TabellenUm 2 unterschiedliche Tabellen auf einer Seite zu drucken können Sie wie folgt vorgehen:Plazieren Sie beide Tabellen und geben Sie jeder Tabelle einen Namen, unter dem Siediese Tabelle später ansprechen. So füllen Sie die Tabellen:• Starten Sie den Druck wie gewohnt und führen Sie LlPrint() aus.• Disablen Sie Tabelle 2, Enablen Sie Tabelle 1 (siehe LlPrintEnableObject()).• Füllen Sie Tabelle 1, bis LL_WRN_REPEAT_DATA zurückgegeben wird, oder keineDaten mehr zu drucken sind.• Disablen Sie dann Tabelle 1, Enablen Sie Tabelle 2• Füllen Sie Tabelle 2, bis LL_WRN_REPEAT_DATA zurückgegeben wird, oder keineDaten mehr zu drucken sind.• Enablen Sie beide Tabellen und führen Sie dann LlPrint() aus.Für viele Fälle besser geeignet und die von uns empfohlene Vorgehensweise ist dieVerwendung der im folgenden Kapitel beschriebenen spezialisierten API-Funktionen.42


Druckvorgang3.2.5. Verkettete Objekte<strong>List</strong> & <strong>Label</strong> gestattet es, dass Objekte voneinander abhängig sind. Die räumliche Abhängigkeitist für die Programmierung uninteressant, da diese automatisch von <strong>List</strong> &<strong>Label</strong> übernommen wird. Vom <strong>Programmierer</strong> muss dieses nur - wenn nötig - insofernunterstützt werden, weil die zeitliche Abhängigkeit bei an Tabellen angehängten Objektenmöglicherweise neue Datendefinitionen benötigt. Wichtig ist die Verkettung auch fürChart-Objekte.Wenn das zu druckende Projekt kein <strong>List</strong>en-Projekt ist, ist auch die zeitliche Abhängigkeitnicht wichtig, denn dann werden bei LlPrint() alle Objekte zwar zeitlich sortiert ausgefülltund zu Papier gebracht, aber da man zwischenzeitlich keine Variablen ändernkann, ist das für die programmtechnische Seite irrelevant.Es muss also nur unterstützt werden, wenn Objekte vor und nach einer <strong>List</strong>e definiertsind, denn dann kann man die Objekte, die an einer <strong>List</strong>e "hängen", nach dem Auffüllender entsprechenden <strong>List</strong>e drucken.(LlPrint[WithBox]Start){(LlPrint){(LlPrintFields){}}}(LlPrintFieldsEnd)(LlPrintFieldsEnd)(LlPrintEnd)<strong>List</strong> & <strong>Label</strong> geht nach folgendem Muster vor:(1) LlPrint() zeichnet alle Objekte, die nicht an einer <strong>List</strong>e hängen. Von <strong>List</strong>enobjektenwerden gegebenenfalls - s.o. - die Titelzeilen ausgegeben.43


Weiterführende Programmierung(2) Bei jedem Aufruf von LlPrintFields() wird eine Zeile in die Tabellen angehängt. Wenneine Tabelle auf der aktuellen Seite voll ist - der Datensatz also nicht mehr ausgegebenwerden kann - meldet <strong>List</strong> & <strong>Label</strong> dem Programm LL_WRN_REPEAT_DATA zurück.(3) Ein folgendes LlPrint() druckt nun erst einmal die Fußzeile und die angehängten Objekte,bevor es den Seitenwechsel durchführt und - siehe (1) - auf der neuen Seite dienicht angehängten Objekte druckt. Weiter geht es dann bei (2).(4) LlPrintFieldsEnd() druckt die Fußzeile und die angehängten Objekte. Wenn ein Objektnicht vollständig gedruckt werden konnte, wird hier LL_WRN_REPEAT_DATA zurückgegeben.(5) LlPrintEnd() beendet den Ausdruck.Einige Beispiele, die mit der Verkettung leicht realisierbar sind:• Eine Seite, die wie bei Wörterbüchern den Anfangs- und Endsatz der <strong>List</strong>e übersichtlichaufgeführt haben.Der Anfangssatz wird in eine Variable geschrieben, die in einem 'vor der <strong>List</strong>e angeordnetenObjekt' ausgegeben wird. Nachdem die <strong>List</strong>e dann voll ist wird der letzteSatz in eine Variable geschrieben, die in einem an diese <strong>List</strong>e angehängten Objektbenutzt wird.In diesem Beispiel ist die Variable 'Anfangsautor' in einem unverketteten Objekt,'Endautor' in einem an die <strong>List</strong>e angehängten Objekt:LlPrintStart()44Endautor = "";{LlDefineVariable("Anfangsautor",)LlPrint();{LlDefineVariable("Endautor",Endautor)Fehler = LlPrintFields();if (Fehler LL_WRN_REPEAT_DATA){if (LlPrintDidMatchFilter())Endautor = ;}}if (Fehler = LL_WRN_REPEAT_DATA)Fehler = 0}LlPrintEnd()• Rechnungen, die variabel lange <strong>List</strong>en haben, sind kein Problem, da das angehängteObjekt (in diesem Fall ein Textobjekt mit dem Zwischensumme und Endsumme desRechnungsbetrags) immer auch erst dann ausgefüllt wird, wenn man die Teilsummeder <strong>List</strong>e dieser Seite kennt, weil diese Datensätze schon ausgegeben wurden. Hier


Druckvorgangkann in angehängte Objekte nur die Zwischensumme vollständig ausgegebener Datensätzeeingefüllt werden.LlPrintStart()< ... das übliche (s.o.) ...>Fehler = 0Summe = 0{Zwischensumme = 0LlPrint();{Fehler = LlPrintFields();if (Fehler LL_WRN_REPEAT_DATA){if (LlPrintDidMatchFilter()){Summe = Summe + Betrag des DatensatzesZwischensumme = Zwischensumme + Betrag des DatensatzesLlDefineVariable("Zwischensumme", Zwischensumme);LlDefineVariable("Gesamtsumme", Summe);}}}if (Fehler = LL_WRN_REPEAT_DATA)Fehler = 0}LlPrintEnd()Bitte beachten Sie, dass <strong>List</strong>enobjekte nicht sinnvoll an andere <strong>List</strong>enobjekte gehängtwerden können. Um das gleiche oder ähnliche Resultat zu erzielen, empfehlen wir dieFunktionalität der multiplen Zeilendefinition zu nutzen.3.2.6. PreviewDie Möglichkeit des Preview ist sehr leicht einzubauen, man benötigt nur sehr geringeÄnderungen gegenüber den Drucker-Ausgaberoutinen, so dass es sich empfiehlt, beidesin einer Routine unterzubringen und die Unterscheidung anhand eines Flags durchzuführen:Erste Abweichung: LL_PRINT_PREVIEW oder LL_PRINT_USERSELECT stattLL_PRINT_NORMAL in dem entsprechenden Parameter bei dem LlPrint[WithBox]Start()-Befehl.Um Netzwerk Zugriffsrecht-Konfikte zu vermeiden, kann man den Pfad der Preview-Dateien mittels LlPreviewSetTempPath() festlegen. Standardmäßig wird der Pfad verwendet,in dem das Definitionsfile gespeichert ist.45


Weiterführende ProgrammierungDieser Pfad wird dann auch bei den beiden Abschluss-Befehlen (LlPreviewDisplay(),LlPreviewDeleteFiles()) als Parameter gebraucht.Nach LlPrintEnd() kann man sich (wenn kein Fehler aufgetreten ist) den Preview mittelsLlPreviewDisplay() anzeigen lassen.Nach dem Anzeigen sollte man dann die Preview-Dateien wieder löschen, da man sie janicht mehr braucht, es sei denn sie sollen archiviert oder versendet werden.Also sieht das Ganze in etwa so aus:LlPrintWithBoxStart(hJob,LL_PROJECT_LABEL, "test",LL_PRINT_PREVIEW,LL_BOXTYPE_NORMALMETER, hWnd, "Seitenvorschau");LlPreviewSetTempPath(hJob,"t:\\");LlPrintEnd(...);if (!Error)LlPreviewDisplay(hJob, "test", "t:\\");LlPreviewDeleteFiles(hJob, "test", "t:\\"); //optionalMit diesen kleinen Abweichungen kann man die Ausdruck-Routine zu einer Preview-Routine umfunktionieren.Alternativ kann man den Benutzer das Ausgabemedium wählen lassen, dann ist derCode absolut unabhängig davon, ob es ein Preview- oder Datei- oder Drucker-Druck ist:LlPrintWithBoxStart(hJob,LL_PROJECT_LABEL, "test", LL_PRINT_USERSELECT,LL_BOXTYPE_NORMALMETER, hWnd, "Ausgabe");LlPreviewSetTempPath(hJob,"t:\\");bPrev = LlPrintGetOption(hJob, LL_PRNOPT_PRINTDLG_DEST) ==LL_DESTINATION_PRV;LlPrintEnd(...);if (bPrev){LlPreviewDisplay(hJob, "test", "t:\\");LlPreviewDeleteFiles(hJob, "test", "t:\\"); //optional}Da die Preview-Dateien später verlustfrei ausgegeben werden können, können Sie diesezu Archivierungszwecken kopieren, z.B. versenden oder anderen Benutzern zur Verfügungstellen. Dazu kopieren Sie die Datei .LL bevor Sie LlPreviewDelete-Files() aufrufen, oder verschieben sie in den gewünschten Pfad.Um zusätzlich zu Druck und Preview-Druck die Exportmodule benutzen zu können, könnennicht die o.g. LL_PRINT_xxx Flags benutzt werden, in diesem Falle sollten die Ausgabemedienüber die Funktionen LlPrintGetOptionStr() und LlPrintSetOptionStr() mit den46


Ansteuerung von Chart- und Kreuztabellen-ObjektenFlags LL_OPTIONSTR_EXPORTS_ALLOWED, LL_PRNOPTSTR_EXPORT eingestellt werden.Weitere Informationen finden Sie im Kapitel "Die Export-Module".3.3. Ansteuerung von Chart- und Kreuztabellen-ObjektenAm einfachsten können Chart- und Kreuztabellenobjekte angesteuert werden, indem Sie– zusammen mit Tabellen – im Objektfenster "Berichtsstruktur" eingefügt werden. DieAnsteuerung solcher Berichte wird im Kapitel "4. Ansteuerung des Berichtscontainer-Objekts" detailliert erläutert.Für Etiketten- oder Karteikartenprojekte kann aber auch eine getrennte Ansteuerung vonsolchen Objekten interessant sein.Im Folgenden ist nur von "Charts" die Rede, die Ansteuerung funktioniert für Kreuztabellenanalog.Für die Datenversorgung von Chart-Objekten gibt es neben der oben genannten zweiweitere verschiedene Methoden. Welche von beiden Sie verwenden möchten, stellenSie über die Option LL_OPTION_USECHARTFIELDS ein. Grundsätzlich funktioniert derDruck mit Charts dann analog zu dem Tabellendruck, d.h. Sie definieren zunächst eineDatenreihe, die Sie an die Chartobjekte übergeben möchten und übergeben diese dannmit einem Aufruf an die Chart-Objekte.3.3.1. Der Standardmodus (Voreinstellung)Dieser Modus steht Ihnen nur für <strong>List</strong>enprojekte zur Verfügung und benötigt keine Änderungenan Ihren bestehenden Projekten. Die Chart-Objekte werden hierbei mit den gleichenDaten wie die Tabellenobjekte versorgt, ein LlPrintFields() übergibt die Daten sowohlan Tabellen- als auch an Chartobjekte, wobei diese die Werte zunächst nur aufnehmenund – im Gegensatz zu Tabellen – nicht gleich drucken. Dieser Modus ist ausKompatibilitätsgründen zu älteren Versionen noch enthalten und ermöglicht eine einfacheVerwendung von Chartobjekten z.B. hinter Tabellen verkettet.3.3.2. Der erweiterte ModusDiesen Modus aktivieren Sie durch Setzen der Option LL_OPTION_USECHARTFIELDS aufTRUE. In diesem Falle stehen Ihnen neben den Variablen und Feldern noch spezielleChart-Felder zur Verfügung. Diese können Sie analog zu Feldern über API-Aufrufe deklarieren.Ihre Benutzer können damit• Chart-Objekte an beliebigen Stellen im Ausdruck verwenden• Chart-Objekte auf Etiketten/Karteikarten verwendenEin LlPrintFields() hat in diesem Modus keinen Einfluss auf die Chart-Objekte, der analogeBefehl hierfür ist im erweiterten Modus LlPrintDeclareChartRow(). Durch diesen API-Aufruf werden die gegenwärtig definierten Daten an die Chart-Objekte übergeben. Wel-47


Weiterführende Programmierungche Chart-Objekte dabei angesprochen werden sollen, kann durch den Parameter vonLlPrintDeclareChartRow() bestimmt werden:WertLL_DECLARECHARTROW_-FOR_OBJECTSLL_DECLARECHARTROW_-FOR_TABLECOLUMNSBedeutungDie Daten werden an alle Chart-Objekte übergeben,die nicht in Tabellenspalten enthalten sind.Die Daten werden an alle Chart-Objekte übergeben,die sich in Tabellenspalten befinden (ausKompatibilitätsgründen weiter unterstützt).Für Charts in einem Etikettenprojekt würden Sie in Pseudocode wie folgt vorgehen:(LlPrintStart,LlPrintWithBoxStart){ (z.B. i = 1..12){(LlPrintDeclareChartRow(LL_DECLARECHARTROW_FOR_OBJECTS))}(LlPrint)}(LlPrintEnd)Wie üblich müssen alle verwendeten Chart-Felder auch vor dem Designeraufruf angemeldetwerden, damit Sie dem Benutzer überhaupt zur Verfügung stehen.48


Benötigte API-Funktionen4. Ansteuerung des Berichtscontainer-Objekts<strong>List</strong> & <strong>Label</strong> bietet Ihnen komfortable Möglichkeiten, Druckprojekte mit mehreren Datenbanktabellen(hierarchische Reports) zu gestalten. Dies stellt die für den Anwender komfortabelsteArt dar, mit mehreren Tabellen, Kreuztabellen und Charts zu arbeiten. Grundsätzlichverwenden Sie für solche Projekte den Projekttypen LL_PROJECT_LIST.Im folgenden wird "Tabelle" als Synonym für eine Gruppe zusammengehöriger Felderim <strong>List</strong> & <strong>Label</strong>-Designer bzw. im Berichtsstruktur-Toolfenster verwendet. Sie sind hierbeinicht an "echte" Datenbanken gebunden, auch Klassenarrays oder dynamisch erzeugteDaten können eine "Tabelle" darstellen, z.B. alle Member-Variablen einer Klasse.Beachten Sie, dass Sie im <strong>List</strong> & <strong>Label</strong> Designer dennoch nur mit einem einzigen Berichtscontainer-Objektarbeiten. Dieses kann aber mehrere Unterobjekte wie Tabellen,Kreuztabellen und Charts enthalten.Bei der Ausgabe im Druck sind sie ebenfalls nicht an die Tabellenausgabe gebunden –mit dem gleichen Code werden auch Kreuztabellen sowie Chartobjekte (auch in Tabellenspalten)gefüllt.Sobald Sie einzelne Tabellen über LlDbAddTable() hinzugefügt haben, können Ihre Anwenderim Designer mit einem neuen Toolfenster arbeiten – dem Berichtsstruktur-Fenster. Weitere Hinweise zum Design finden Sie im entsprechenden Kapitel des Designerhandbuchs.Dieses Kapitel konzentriert sich auf die Fragen der Ansteuerung solcherDesigns.Die .NET- und VCL-Komponenten bieten Ihnen eine komfortable Datenbankanbindung –wenn Sie Ihre Daten in einem DataSet mit DataRelations (.NET) bzw. einem DataSet(VCL) darstellen können, brauchen Sie sich in der Regel nicht um die Ansteuerung zukümmern – in diesem Falle können Sie die folgenden Abschnitte überspringen.Für viele andere Programmiersprachen sind Beispiele für die Ansteuerung von <strong>List</strong> &<strong>Label</strong> bei Verwendung mehrerer Tabellen im Lieferumfang enthalten.4.1. Benötigte API-FunktionenDie API-Funktionen, die Sie für die Ansteuerung dieser Funktionalität benötigen beginneneinheitlich mit LlDb... bzw. LlPrintDb... Sie können Tabellen hinzufügen (LlDbAdd-Table()), Sortierungen innerhalb der Tabellen zur Verfügung stellen (LlDbAddTableSortOrder())und Beziehungen zwischen Tabellen definieren (LlDbAddTableRelation()).Zur Druckzeit können Sie dann die derzeit aktive Tabelle abfragen (LlPrintDbGetCurrent-Table()) sowie analog die gerade aktive Beziehung und Sortierung erhalten (LlPrintDb-49


Ansteuerung des Berichtscontainer-ObjektsGetCurrentTableSortOrder(), LlPrintDbGetCurrentTableRelation()). Ausführliche Beispielefür die Verwendung dieser Funktionen finden Sie im Laufe dieses Kapitels.4.2. Aufruf des DesignersZunächst müssen alle Tabellen bei <strong>List</strong> & <strong>Label</strong> bekannt gemacht werden, die Sie demBenutzer für das Design zur Verfügung stellen möchten:LlDbAddTable(hJob, "", ""); // evtl. vorhandene Tabellen löschenLlDbAddTable(hJob, "Orders", "Bestellungen");LlDbAddTable(hJob, "OrderDetails", "Bestellposten");Der erste Parameter ist wie üblich das Job-Handle des <strong>List</strong> & <strong>Label</strong>-Jobs. Der zweiteParameter ist die TableID, dies ist der Wert, den Sie beim Druckvorgang von LlPrintDb-GetCurrentTable() zurückgeliefert bekommen. Der dritte Parameter ist der Anzeigenameder Tabelle im Designer. Wenn Sie NULL bzw. einen Leerstring übergeben, sind TableIDund Anzeigename identisch.Eine besondere Rolle kommt dabei dem Tabellennamen "LLStaticTable" zu. Dieser istreserviert und kann für das Einfügen von 'statischen' Inhalten (feste Texte oder Inhaltevon Variablen, Chartunterschriften etc.) verwendet werden. Eine solche statische Tabellekann vom Benutzer im Designer nur mit Datenzeilen befüllt werden. In Ihrem Codemüssen Sie entsprechend auf die Tabelle reagieren - wie wird im Druck-Kapitel erläutert.Im nächsten Schritt werden die Beziehungen zwischen den Tabellen definiert. <strong>List</strong> &<strong>Label</strong> unterscheidet hierbei nicht direkt zwischen unterschiedlichen Beziehungstypen –Sie melden eine Beziehung einfach mit einer ID an, die Sie hinterher im Druck abfragenkönnen:LlDbAddTableRelation(hJob, "OrderDetails", "Orders","Orders2OrderDetails", NULL);Mit diesem Befehl haben Sie bekanntgemacht, dass "OrderDetails" im Designer als Untertabellefür die Tabelle "Orders" zur Verfügung stehen soll. In diesem Falle wurde nurdie ID der Relation übergeben, diese erscheint dann auch im Designer.Zuletzt können Sie noch Sortierungen übergeben, die für die jeweiligen Tabellen zurAuswahl stehen sollen. Auch hier erhält wieder jede Sortierung eine eindeutige ID, dieSie im Druck abfragen können:50LlDbAddTableSortOrder(hJob, "Orders", "OrderDate ASC","Order Date [+]");


Aufruf des DesignersLlDbAddTableSortOrder(hJob, "Orders", "OrderDate DESC","Order Date [-]");Nun kann der Benutzer im Designer auswählen, ob er die Daten nach Datum auf- oderabsteigend sortiert ausgeben möchte.Der restliche Ablauf des Designeraufrufs ist analog zum "normalen" Aufruf, d.h. dasgesamte Schema eines Designeraufrufs mit mehreren Tabellen würde so aussehen:(LlJobOpen, LlJobOpenLCID)(LlSetOption,LlSetOptionString,LlSetDebug,LlSetFileExtensions,LlSetNotificationMessage,LlSetNotificationCallback)(LlSetDlgboxMode)LlSelectFileDlgTitleEx(LlDbAddTable,LlDbAddTableRelation,LlDbAddTableSortOrder)(LlDefineVariableStart,LlDefineVariable,LlDefineVariableExt,LlDefineVariableExtHandle)(LlDefineFieldStart,LlDefineField,LlDefineFieldExt,LlDefineFieldExtHandle)(LlDesignerProhibitAction,LlDesignerProhibitFunction)(LlDefineLayout)(LlJobClose)Alle Felder einer Tabelle müssen in der Form "." benanntwerden, damit <strong>List</strong> & <strong>Label</strong> diese korrekt den einzelnen Tabellen zuordnen kann. StellenSie also sicher, dass Sie jedem Feldnamen die TabellenID voranstellen.Wenn Sie zusätzlich zu den Feldern einer Tabelle alle Felder von 1:1 verknüpften Tabellenzur Verfügung stellen möchten, beachten Sie bitte die Hinweise im Kapitel "4.4.Umgang mit 1:1-Relationen"51


Ansteuerung des Berichtscontainer-Objekts4.3. Ansteuerung der DruckengineDie Ansteuerung von hierarchischen Reports mit <strong>List</strong> & <strong>Label</strong> erfolgt im Prinzip analogwie im vorigen Kapitel beschrieben. Über die Funktion LlPrintDbGetCurrentTable() kannabgefragt werden, welche Tabelle im Augenblick befüllt werden muss. Diese wird dann– wie gehabt – über LlDefineField[Ext]() und LlPrintFields() ausgegeben. Je nach Druckvorlagekönnen zwei Sonderfälle auftreten:• Nach der Ausgabe einer Tabelle kann der Benutzer eine zweite Tabelle platzierthaben• Der Benutzer kann auch zur aktuellen Tabelle eine Untertabelle eingefügt habenDiese beiden Fälle werden in den beiden nächsten Abschnitten betrachtet.4.3.1. Mehrere unabhängige TabellenEin Beispiel hierfür wäre eine <strong>List</strong>e der Kunden, die von einer Chartauswertung der Angestelltengefolgt werden soll. Beide Tabellen sind nicht voneinander abhängig. DieDruckschleife für eine solche Ausgabe ist der aus dem vorigen Kapitel sehr ähnlich, miteinem Unterschied. Der Abschluss des Drucks einer Tabelle erfolgt über LlPrintFieldsEnd(),Sie bekommen an dieser Stelle aber möglicherweise den RückgabewertLL_WRN_TABLECHANGE. Dies bedeutet, dass im Layout noch eine weitere zu druckendeTabelle vorhanden ist. Am Einfachsten teilen Sie die Druckschleife so auf, dass Sieverschiedene Unterroutinen haben.Der erste Teil meldet die Daten und Datenstruktur an, startet den Druckjob und initialisiertdie erste Seite, so dass mit dem Druck einer Tabelle begonnen werden kann. Dieoptionalen Teile der Druckschleife sind hier aus Übersichtlichkeitsgründen nicht enthalten,diese sind analog zu den im letzten Kapitel beschriebenen.52(LlDbAddTable,LlDbAddTableRelation,LlDbAddTableSortOrder)(LlDefineVariableStart,LlDefineVariable,LlDefineVariableExt,LlDefineVariableExtHandle)(LlDefineFieldStart,LlDefineField,LlDefineFieldExt,LlDefineFieldExtHandle)LlSetPrinterDefaultsDir(LlPrintStart,LlPrintWithBoxStart)(LlPrintSetOption,


Ansteuerung der DruckengineLlPrintSetOptionString,LlPreviewSetTempPath)(LlDefineVariable,LlDefineVariableExt,LlDefineVariableExtHandle,LlPrintIsVariableUsed) (drucke alle Objekte)(LlPrint)(LlPrint)Der zweite Teil der Druckschleife benötigt eine Hilfsfunktion. Diese druckt die Dateneiner einzelnen (Datenbank-)Tabelle:Funktion DruckeTabelle(DataTable Datenobjekt){// DataTable ist ein geeignetes Datenzugriffsobjekt, z.B. eine// Datenbanktabelle, ein Klassenarray o.ä.{(LlDefineField,LlDefineFieldExt,LlDefineFieldExtHandle,LlPrintIsFieldUsed)(LlPrintFields)(LlPrint,LlPrintFields)}}(Rückgabewert = LlPrintFieldsEnd)(Rückgabewert = LlPrintFieldsEnd)Als Rückgabewert erhält man die Information, ob eine weitere Tabelle folgt (LlPrintFieldsEnd()liefert dann LL_WRN_TABLECHANGE zurück), oder ob der Druck abgeschlossenwerden kann (Rückgabewert 0).Damit kann der zweite Teil des Drucks, also der Teil nach der Initialisierung der erstenSeite, wie folgt gecodet werden:53


Ansteuerung des Berichtscontainer-Objekts{(LlPrintDbGetCurrentTable)(LlPrintDbGetCurrentTableSortOrder)}(LlPrintEnd){(LlPreviewDisplay)(LlPreviewDeleteFiles)}Wenn Sie die "LLStaticTable"-Tabelle für statische Inhalte angemeldet haben undLlPrintDbGetCurrentTable() diese Tabelle als aktuelle Tabelle liefert, muss Ihre Druckschleifedarauf mit dem Druck einer einzelnen Datenzeile über LlPrintFields() reagieren.Im Beispiel oben könnten Sie für den Fall von "LLStaticTable" einfach ein DataTable-Objekt mit nur einem beliebigen Datensatz erzeugen, dann läuft der Druck automatischkorrekt.Dieser Code erlaubt bereits die beliebige Abfolge von mehreren Tabellen hintereinander.Im folgenden Abschnitt wird eine Erweiterung für den Druck von Untertabellen vorgenommen.4.3.2. Einfache 1:n-RelationenDas typische Beispiel für diesen Fall ist die bereits angesprochene 1:n-Beziehung Bestellung– Bestellposten. In diesem Fall werden nach jeder Datenzeile mit Bestell-Datenn Bestellpositionen ausgegeben. Die Ausgabe einer Zeile erfolgt mit LlPrintFields(). Analogzum Verhalten von LlPrintFieldsEnd() im letzten Abschnitt erhalten Sie – wenn derBenutzer eine Untertabelle platziert hat – nun auch hier LL_WRN_TABLECHANGE zurückund müssen darauf entsprechend reagieren. Sie können die Tabellenbeziehung überLlPrintDbGetCurrentRelation() und den Namen der Kindtabelle über LlPrintDbGetCurrent-TableName() erfragen. Mit diesen Informationen können Sie dann wiederum die HilfsfunktionDruckeTabelle() aus dem vorigen Abschnitt aufrufen. Dieser Aufruf muss direktnach dem LlPrintFields() erfolgen – also aus der Funktion DruckeTabelle() selbst. DieFunktion muss also dahingehend abgeändert werden, dass sie sich selbst rekursiv aufruft:54Funktion DruckeTabelle(DataTable Datenobjekt){


Ansteuerung der Druckengine// DataTable ist ein geeignetes Datenzugriffsobjekt, z.B. eine// Datenbaktabelle, ein Klassenarray o.ä.{(LlDefineField,LlDefineFieldExt,LlDefineFieldExtHandle,LlPrintIsFieldUsed)(LlPrintFields)(LlPrint,Rückgabewert = LlPrintFields){(LlPrintDbGetCurrentTable)(LlPrintDbGetCurrentTableRelation)(LlPrintDbGetCurrentTableSortOrder)}}(Rückgabewert = LlPrintFieldsEnd)(Rückgabewert = LlPrintFieldsEnd)}Damit können nun auch beliebige Abfolgen von Untertabellen ausgegeben werden. DieRekursion stellt hierbei sicher, dass dies beliebig "tief" funktioniert, d.h. der Code kann indieser Form auch mehrstufige Relationen korrekt ansteuern.4.3.3. Die rekursive DruckschleifeFür eine vollständige Druckschleife, die sowohl Folgetabellen als auch Untertabellenkorrekt unterstützt muss nun nichts mehr getan werden – der Code aus den beidenletzten Abschnitten stellt sicher, dass der komplette Baum der Tabellenstruktur durchlaufenwird.Insofern bleibt nur noch Feinarbeit zu leisten – z.B. die Anzeige eines Fortschrittsbalkens.Da das Layout beliebig komplex werden kann, kann nicht mehr einfach die aktuellePosition innerhalb der Datenquelle zur Gesamtzahl der Datensätze in Verhältnis gesetztwerden. Dieser Ansatz funktioniert schon dann nicht mehr korrekt, wenn der Benutzer55


Ansteuerung des Berichtscontainer-Objektszwei Tabellen hintereinander im Designer platziert. Daher bietet <strong>List</strong> & <strong>Label</strong> über dieFunktion LlPrintDbGetRootTableCount() die Möglichkeit, die Anzahl der Tabellen auf deräußersten Ebene ("Root") zu bestimmen. Dann können Sie die Fortschrittsanzeige immerdann aktualisieren, wenn Sie auf dieser Ebene einen Datensatz ausgeben.Für den maximal pro Tabelle verfügbaren Prozentsatz giltINT nMaxPerc = 100/LlPrintDbGetRootTableCount();Wenn Sie die Root-Tabellen von 0.. LlPrintDbGetRootTableCount()-1 durchindizieren,können Sie den Gesamt-Prozentsatz dann alsINT nPercTotal = nMaxPerc*nIndexCurrentTable+(nPerc/100*nMaxPerc);berechnen, wobei nPerc der Prozentposition innerhalb der aktuellen Tabelle entspricht.Für die eigentliche Aktualisierung der Prozentanzeige kann dann die DruckeTabelle()-Funktion aus dem letzten Abschnitt angepasst werden. Durch einen weiteren Eingangsparameterkann die augenblickliche Rekursionstiefe bestimmt werden – ist diese 0 wirdgerade ein "Root"-Datensatz gedruckt und die Anzeige kann aktualisiert werden:Funktion DruckeTabelle(DataTable Datenobjekt, Rekursionstiefe Tiefe){{...(LlPrintDbGetRootTableCount,LlPrintSetBoxText)(LlPrintFields)(LlPrint,Rückgabewert = LlPrintFields){...}...}...}4.3.4. Übergabe der Master-Daten als VariablenIm Falle einer Bestellung mit den zugehörigen Bestellposten kann es auch erwünschtsein, die "Master"-Daten, d.h. in diesem Beispiel die Daten der Orders-Tabelle als Variab-56


Umgang mit 1:1-Relationenlen zu übergeben. So kann der Adressat dann z.B. in einem Textobjekt ausgegebenwerden, die Posten im Tabellenobjekt.Damit Ihnen die "OrderDetails"- Tabelle mit der benötigten Relation zum Einfügen imTabellenstruktur-Dialog angeboten wird, müssen Sie zuvor mitteilen, dass Sie die Master-Datenals Variablen verwalten und somit schon in der äußersten Ebene des Tabellenobjektsdie 1:n-verknüpfte OrderDetails- Tabelle zur Verfügung stellen möchten. Hierzuverwenden Sie LlDbSetMasterTable(). Die benötigten Aufrufe wären alsoLlDbAddTable(hJob, "Orders", "Bestellungen");LlDbAddTable(hJob, "OrderDetails", "Bestellposten");LlDbAddTableRelation(hJob, "OrderDetails", "Orders","Orders2OrderDetails", NULL);LlDbSetMasterTable(hJob, "Orders");Der Ablauf der Druckschleife erfolgt dann analog zu oben, allerdings müssen Sie jetztggf. schon auf der äußersten Ebene (vgl. Kap. 4.3.1. Mehrere unabhängige Tabellen) diegeeignete Kind- Datenbanktabelle bereitstellen:{(LlPrintDbGetCurrentTable)(LlPrintDbGetCurrentTableSortOrder)(LlPrintDbGetCurrentTableRelation)}(LlPrintEnd){(LlPreviewDisplay)*(LlPreviewDeleteFiles)}4.4. Umgang mit 1:1-RelationenMeist werden 1:1-Relationen zum Reporten über ein JOIN so zusammengefasst, dassdie Daten innerhalb der selben Tabelle zur Verfügung stehen. Sollte dies nicht der Fallsein oder sollten Sie dies nicht wünschen, so können Sie 1:1-Relationen auch visuell im57


Ansteuerung des Berichtscontainer-ObjektsVariablenfenster innerhalb der Felder der Elterntabelle einblenden. Hierzu müssen Siedie Felder mit einer besonderen Syntax anmelden.4.4.1. 1:1 Relation ohne SchlüsselfeldangabeWenn die Schlüsselfelder für die Relation nicht relevant sind, es also nur eine 1:1-Relation zwischen den beiden beteiligten Tabellen gibt, können Sie die Felder wie folgtanmelden::., also z.B.OrderDetails:Orders.OrderDateDamit erscheint innerhalb der OrderDetails-Hierarchie im Variablenfenster ein Ordner mitdem Feld OrderDate der Orders- Tabelle:Sie müssen nun natürlich auch dafür sorgen, dieses Feld für jeden Datensatz, den Sie inder OrderDetails- Tabelle durchlaufen, mit dem zugehörigen Inhalt zu füllen.4.4.2. 1:1 Relation mit SchlüsselfeldangabeIm Falle mehrfacher 1:1-Verknüpfungen ist es für den Benutzer wichtig zu sehen, überwelches der Schlüsselfelder die Verknüpfung vorgenommen wird. In diesem Falle könnenSie die Felder wie folgt anmelden:.@.:, also z.B.OrderDetails.OrderID@Orders.OrderID:OrderDateNun erscheint im Variablenfenster neben der Verknüpfung auch die Schlüsselfeldangabe:58


Umgang mit 1:1-RelationenAuch hier muss das Feld für jeden Datensatz, den Sie in der OrderDetails-Tabelle durchlaufen,mit dem zugehörigen Inhalt gefüllt werden.4.4.3. Performance-TippsGerade beim Umgang mit 1:1-Relationen sollten Sie unbedingt prüfen, ob der Benutzerüberhaupt ein Feld der verknüpften Tabelle platziert hat. Sie können dies durch Verwendungder Wildcard-Option bei LlPrintIsFieldUsed() erreichen. Um etwa zu sehen, ob einFeld der 1:1 verknüpften Tabelle "Orders" innerhalb der "OrderDetails"- Tabelle verwendetwurde, können SieLlPrintIsFieldUsed(hJob, "OrderDetails.OrderID@Orders.OrderID*");verwenden. Erhalten Sie hier einen Rückgabewert von 0, so ist kein Feld der Orders-Tabelle verwendet und Sie brauchen die Inhalte auch nicht bereitzustellen.59


Verwendung der DOM-API5. Verwendung der DOM-APIUm Projektdateien dynamisch zur Laufzeit zu erstellen oder auch um bestehende Projektdateienper Code zu bearbeiten, können Sie ab der Professional Edition mit den <strong>List</strong>& <strong>Label</strong> DOM-Funktionen arbeiten. Für die Komponenten .NET und VCL stehen Ihnenkomfortable Klassenwrapper für diese Funktionen zur Verfügung. Hinweise zu derenVerwendung finden Sie im Kapitel "6. Arbeiten mit den Komponenten". Die Beschreibungin diesem Kapitel umfasst die Ansteuerung in allen anderen Programmiersprachen.5.1. GrundlagenJedes "Objekt" innerhalb einer Projektdatei hat ein eigenes Handle ("DOM-Handle"). DieFunktionen des DOM-API verwenden dieses Handle, um Objekte eindeutig zu identifizieren."Objekte" in diesem Sinne sind hierbei alle Designerobjekte, aber auch andere Elementewie Hilfslinien, Projektparameter etc. Der im Lieferumfang befindliche DOM-Viewer erlaubt einen schnellen Überblick über alle Objekte, deren Wert und weitereEigenschaften. Zusätzlich dazu können mit dem Viewer Eigenschaften bzw. Werte geändertund im Projekt gespeichert werden. Über die Clipboard Funktion kann jedes Objektbzw. Eigenschaft zur weiteren Verwendung in die Zwischenablage kopiert werden.60


Grundlagen61


Verwendung der DOM-APIDie für das DOM-API relevanten Funktionen unterteilen sich in 2 Gruppen: zunächstkönnen Projektdateien geladen, erzeugt und gespeichert werden. Dafür stehen die FunktionenLlProjectOpen, LlProjectClose und LlProjectSave zur Verfügung. Dabei liefert dieFunktion LlProjectOpen das DOM-Handle für das Projektobjekt zurück. Dieses liefertdann die Basis für die Verwendung der weiteren Funktionen.5.1.1. DOM-Funktionen5.1.1.1. LlDomGetObjectMit dieser Funktion können vom Projekt-Objekt wichtige Unterobjekte erhalten werden.Um z.B. die Objektliste zu erhalten, kannHLLDOMOBJ hProj = LlProjectOpen(hJob, LL_PROJECT_LIST, "c:\\filename.lst",LL_PRJOPEN_AM_READONLY);HLLDOMOBJ hObj<strong>List</strong>;INT nRet = LlDomGetObject(hProj, "Objects", &hObj<strong>List</strong>);verwendet werden. Die weiteren verfügbaren Objekte entsprechen den Einträgen innerhalbder Baumstruktur im DOM-Viewer: "Layout", "ProjectParameters", "Settings", "Sum-Vars" und "UserVars". Eine Beschreibung der einzelnen Objekte mit allen Eigenschaftenfinden Sie im <strong>Referenz</strong>kapitel, hier soll das Prinzip der Arbeit mit den DOM-Funktionenim Vordergrund stehen.5.1.1.2. LlDomGetSubobjectCountDient dazu, die Anzahl der Unterobjekte in der angegebenen <strong>List</strong>e abzufragen. Um etwadie Anzahl der Objekte im Projekt zu erfragen, verwendet manINT nObjCount;INT nRet = LlDomGetSubobjectCount(hObj<strong>List</strong>, &nObjCount);5.1.1.3. LlDomGetSubobjectLiefert das DOM-Handle des angegebenen Unterobjektes zurück. Parameter sind nebendem DOM-Handle der <strong>List</strong>e der Index (0-basiert) und ein Pointer für die Rückgabe desHandles. Der Code für ein DOM-Handle auf das erste Objekt in der Projektdatei lautetHLLDOMOBJ hObj;INT nRet = LlDomGetSubobject(hObj<strong>List</strong>, 0, &hObj);62


Grundlagen5.1.1.4. LlDomCreateSubobjectErzeugt ein neues Unterobjekt in der angegebenen <strong>List</strong>e. Parameter sind das <strong>List</strong>enhandle,die Einfügeposition, der gewünschte Typ sowie ein Handle-Pointer für das neueObjekt. Um ein neues Textobjekt am Anfang der Objektliste einzufügen, verwendet manHLLDOMOBJ hObj;INT nRet = LlDomCreateSubobject(hObj<strong>List</strong>, 0, _T("Text"), &hObj);Innerhalb der Objektliste z.B. können Sie mit Hilfe dieser Funktion die folgenden Objekteerzeugen:ObjekttypLinieRechteckEllipseZeichnungTextFormularvorlageBarcodeRTFHTMLBerichtscontainerBenötigter dritter Parameter"Line""Rectangle""Ellipse""Drawing""Text""Template""Barcode""RTFText""LLX:LLHTMLObject""ReportContainer"Die weiteren möglichen Werte für andere <strong>List</strong>en (z.B. Feldliste innerhalb einer Tabelle)finden Sie in der Onlinehilfe der DOM-Vieweranwendung.5.1.1.5. LlDomDeleteSubobjectLöscht das angegebene Unterobjekt. Um z.B. das erste Objekt der Objektliste zu löschencodet manINT nRet = LlDomDeleteSubobject(hObj<strong>List</strong>, 0);63


Verwendung der DOM-API5.1.1.6. LlDomSetPropertyErlaubt das Setzen einer Eigenschaft für das angegebene Objekt. Um z.B. den Seitenumbruchfür ein Textobjekt zu erlauben, benötigt manINT nRet = LlDomSetProperty(hObj, _T("AllowPageWrap"), _T("True"));WICHTIG: Der Übergabeparameter für den Wert muss eine gültige <strong>List</strong> & <strong>Label</strong>-Formelsein. Eine Besonderheit ergibt sich hierdurch für Eigenschaften, die Zeichenkettenenthalten (z.B. der Inhalt eines Text-Absatzes): Zeichenketten müssen ja innerhalb desDesigners ihrerseits in Anführungszeichen gesetzt werden, um als gültige Formel verwendbarzu sein. Um also den festen Text "<strong>combit</strong>" zu übergeben muss der Parameter"'<strong>combit</strong>'" verwendet werden. Dies gilt auch z.B. für feste Fontnamen, auch hier mussz.B. "'Verdana'" übergeben werden, nicht "Verdana",Beispielcode:LlDomSetProperty(hObj, _T("Contents"), _T("'") + sProjectTitle + _T("'"));Um die Werte von verschachtelten Eigenschaften wie den der Farbe einer Füllung zusetzen, kann der Eigenschaftsname "." verwendetwerden, also z.B.INT nRet = LlDomSetProperty(hObj, _T("Filling.Color"), _T("LL.Color.Black"));5.1.1.7. LlDomGetPropertyLiest den Wert einer Eigenschaft aus. Es empfiehlt sich, wie üblich zunächst durch Ü-bergabe eines NULL-Puffers die benötigte Pufferlänge zu ermitteln und dann einen ausreichendgroßen Puffer zu allozieren:INT nBufSize = LlDomGetProperty(hObj, _T("AllowPageWrap"), NULL, 0);TCHAR* pszBuffer = new TCHAR[nBufSize];INT nRet = LlDomGetProperty(hObj, _T("AllowPageWrap"), pszBuffer, nBufSize);…delete[] pszBuffer;Zur Vereinfachung können Objekte (nicht aber <strong>List</strong>en!) mit Hilfe des Punktes als Hierarchietrennerauch "durchtunnelt" werden, wie z.B.:...//D: Auslesen der Seitenkoordinaten der ersten Seite//US: Get the page coordinates for the first page64


BeispieleLlDomGetProperty(hProj,_T("Printers.First.Paper.Extent.Horizontal"),pszContainerPositionWidth, nBufSize);5.1.2. EinheitenViele Eigenschaften enthalten Informationen über Größen, Breiten etc. Diese werden –wenn Sie als feste Zahl übergeben werden – als SCM-Einheiten (1/1000 mm) interpretiertund zurückgeliefert und sind somit vom gewählten Einheitensystem unabhängig.Um ein Objekt an einer (festen) Position 5 mm vom linken Rand entfernt zu platzieren,würde manINT nRet = LlDomSetProperty(hObj, _T("Position.Left"), _T("5000"));verwenden. Wenn die Eigenschaft allerdings keinen festen Wert, sondern eine Formelenthalten soll, muss die Funktion UnitFromSCM verwendet werden, um unabhängig vonden Einheiten zu sein. Einen Bundsteg mit einem Einzug von 10 mm auf ungeraden und5 mm auf geraden Seiten würde man überINT nRet = LlDomSetProperty(hObj, _T("Position.Left"),_T("Cond(Odd(Page()), UnitFromSCM(10000), UnitFromSCM(5000))"));realisieren.5.2. Beispiele5.2.1. Textobjekt anlegenDer folgende Code erzeugt ein neues Projekt, fügt ein Textobjekt und darin einen neuenAbsatz mit dem Inhalt "DOM" ein und speichert das Projekt:HJOB hJob = LlJobOpen(-1);// Neues Projekt erzeugenLlProjectOpen(hJob,LL_PROJECT_LIST,"c:\\simple.lst",LL_PRJOPEN_CD_CREATE_ALWAYS | LL_PRJOPEN_AM_READWRITE);// Projektobjekt holenHLLDOMOBJ hProj;65


Verwendung der DOM-APILlDomGetProject(hJob, &hProj);// Objektliste holenHLLDOMOBJ hObj<strong>List</strong>;LlDomGetObject(hProj, "Objects", &hObj<strong>List</strong>);// Textobjekt erzeugenHLLDOMOBJ hObj;LlDomCreateSubobject(hObj<strong>List</strong>, 0, _T("Text"), &hObj);LlDomSetProperty(hObj, _T("Name"), _T("My new Textobject"));// Absatzliste holenHLLDOMOBJ hObjParagraph<strong>List</strong>;LlDomGetObject(hObj, _T("Paragraphs"), &hObjParagraph<strong>List</strong>);// Neuen Absatz erzeugen und Inhalt anlagenHLLDOMOBJ hObjParagraph;LlDomCreateSubobject(hObjParagraph<strong>List</strong>, 0, _T("Paragraph"), &hObjParagraph);LlDomSetProperty(hObjParagraph, _T("Contents"), _T("DOM"));// Projekt speichernLlProjectSave(hJob, NULL);LlProjectClose(hJob);LlJobClose(hJob);5.2.2. Tabelle anlegenDieses Beispiel zeigt die Erzeugung eines Tabellenobjektes innerhalb eines Berichtscontainers,legt darin eine neue Datenzeile und drei Spalten an.Beachten Sie, dass Sie auch dann, wenn Sie nicht die APIs zur Ansteuerung des Berichtscontainers(LlDbAddTable() etc.) verwenden einen Berichtscontainer mit genaueiner Tabelle anlegen müssen.HJOB hJob = LlJobOpen(-1);// Neues Projekt erzeugenLlProjectOpen(hJob, LL_PROJECT_LIST, "c:\\simple.lst",LL_PRJOPEN_CD_CREATE_ALWAYS | LL_PRJOPEN_AM_READWRITE);// Projektobjekt holenHLLDOMOBJ hProj;LlDomGetProject(hJob, &hProj);// Objektliste holenHLLDOMOBJ hObj<strong>List</strong>;LlDomGetObject(hProj, "Objects", &hObj<strong>List</strong>);66


Beispiele// Berichtscontainer erzeugen und Eigenschaften setzenHLLDOMOBJ hObjReportContainer;LlDomCreateSubobject(hObj<strong>List</strong>, 0, _T("ReportContainer"),&hObjReportContainer);LlDomSetProperty(hObjReportContainer,_T("Position.Left"), _T("27000"));LlDomSetProperty(hObjReportContainer,_T("Position.Top"), _T("103500"));LlDomSetProperty(hObjReportContainer,_T("Position.Width"), _T("153400"));LlDomSetProperty(hObjReportContainer,_T("Position.Height"), _T("159500"));// Unterobjektliste holen und Tabelle darin anlegenHLLDOMOBJ hObjSubItems;LlDomGetObject(hObjReportContainer, _T("SubItems"), & hObjSubItems);HLLDOMOBJ hObjTable;LlDomCreateSubobject(hObjSubItems, 0, _T("Table"), &hObjTable);// Zeilenliste holenHLLDOMOBJ hObjTableLines;LlDomGetObject(hObjTable , _T("Lines"), &hObjTableLines);// Datenzeilenliste holenHLLDOMOBJ hObjTableData;LlDomGetObject(hObjTableLines , _T("Data"), &hObjTableData);// Neue Zeilendefinition anlegenHLLDOMOBJ hObjTableLine;LlDomCreateSubobject(hObjTableData, 0, _T("Line"), &hObjTableLine);LlDomSetProperty(hObjTableLine,_T("Name"), _T("My new table line"));// Kopfzeilenliste holenHLLDOMOBJ hObjTableHeader;LlDomGetObject(hObjTableLines , _T("Header"), &hObjTableHeader);// Neue Zeilendefinition anlegenHLLDOMOBJ hObjTableHeaderLine;LlDomCreateSubobject(hObjTableHeader, 0, _T("Line"), &hObjTableHeaderLine);// Feldliste für Kopfzeilen holenHLLDOMOBJ hObjTableHeaderFields;LlDomGetObject(hObjTableHeaderLine , _T("Fields"), &hObjTableHeaderFields);// Feldliste für Datenzeilen holenHLLDOMOBJ hObjTableDataFields;LlDomGetObject(hObjTableLine , _T("Fields"), &hObjTableDataFields);TCHAR aczVarName[1024];int nItemCount = 3;// Tabelle mit nItemCount Spalten anlegenfor (int i=0; i < nItemCount; i++){// Spalteninhalt für die Kopfzeile bestimmen. Beachten Sie// die Hochkommata – dadurch wird fester Text (z.B. "Field1") als// Inhalt übergeben_stprintf(aczVarName, "'Field%d'", i);67


Verwendung der DOM-API// Neues Feld in Kopfzeile anlegen und Eigenschaften setzenHLLDOMOBJ hObjHeaderField;LlDomCreateSubobject(hObjTableHeaderFields, 0, _T("Text"),&hObjHeaderField);LlDomSetProperty(hObjHeaderField, _T("Contents"), aczVarName);LlDomSetProperty(hObjHeaderField,_T("Filling.Style"), _T("1"));LlDomSetProperty(hObjHeaderField,_T("Filling.Color"),_T( "RGB(204,204,255)"));LlDomSetProperty(hObjHeaderField,_T("Font.Bold"), _T("True"));LlDomSetProperty(hObjHeaderField,_T("Width"), _T("50000"));// Spalteninhalt für die Datenzeile bestimmen. Jetzt ohne// die Hochkommata – dadurch wird der Feldinhalt (z.B. Field1) als// Inhalt übergeben_stprintf(aczVarName, "Field%d", i);// Neues Feld in Datenzeile anlegen und Eigenschaften setzenHLLDOMOBJ hObjDataField;LlDomCreateSubobject(hObjTableDataFields, 0, _T("Text"),&hObjDataField);}LlDomSetProperty(hObjDataField,_T("Contents"), aczVarName);LlDomSetProperty(hObjDataField,_T("Width"), _T("50000"));// Projekt speichernLlProjectSave(hJob, NULL);LlProjectClose(hJob);LlJobClose(hJob);5.2.3. Projektparameter setzenDer nachfolgende Code setzt Projektparameter in ein bestehendes <strong>List</strong> & <strong>Label</strong> Projektfür den Fax- und Mailversand:HJOB hJob = LlJobOpen(-1);LlProjectOpen(hJob, LL_PROJECT_LIST, "c:\\simple.lst",LL_PRJOPEN_CD_OPEN_EXISTING | LL_PRJOPEN_AM_READWRITE);HLLDOMOBJ hProj;LlDomGetProject(hJob, &hProj);// Fax parameter:LlDomSetProperty(hProj, _T("ProjectParameters.LL.FAX.RecipName.Contents"),_T("'sunshine agency'"));LlDomSetProperty(hProj, _T("ProjectParameters.LL.FAX.RecipNumber.Contents"),_T("'555-555 555'"));LlDomSetProperty(hProj,_T("ProjectParameters.LL.FAX.SenderCompany.Contents"),_T("'<strong>combit</strong>'"));LlDomSetProperty(hProj,_T("ProjectParameters.LL.FAX.SenderName.Contents"),68


Beispiele_T("'Mustermann'"));// Mail parameter:LlDomSetProperty(hProj, _T("ProjectParameters.LL.MAIL.Subject.Contents"),_T("'Your request'"));LlDomSetProperty(hProj, _T("ProjectParameters.LL.MAIL.From.Contents"),_T("'info@<strong>combit</strong>.net'"));LlDomSetProperty(hProj, _T("ProjectParameters.LL.MAIL.To.Contents"),_T("'info@sunshine-agency.net'"));LlProjectSave(hJob, NULL);LlProjectClose(hJob);LlJobClose(hJob);69


Arbeiten mit den Komponenten6. Arbeiten mit den Komponenten6.1. Arbeiten mit der .NET KomponenteParallel zu den OCX- und VCL-Komponenten für Visual Basic und Delphi erhalten Sie mitder <strong>List</strong> & <strong>Label</strong> .NET Assembly eine spezielle Komponente für die Entwicklung mit Microsoft.NET. Das folgende Kapitel bezieht sich ausschließlich auf die Arbeit mit dieserKomponente. Wenn Sie nicht unter .NET arbeiten, können Sie diesen Abschnitt überspringen.6.1.1. Prinzipielle UnterschiedeDie Komponente wurde optimal in das Framework integriert und unterscheidet sich ineinigen Bereichen von der regulären API. Konkret bietet die Assembly unter anderemfolgende Features:• Umfangreiche Datenbindung analog zu den bekannten Windows und Web FormsControls• Vereinfachte Übergabe von beliebigen Daten als Variablen und Felder• Verwendung von .NET Ausnahmen statt Rückgabewerten• Vereinfachung von vielen Methodenaufrufen mittels Überladungen6.1.2. Einbindung der KomponenteDie Einbindung erfolgt mittels <strong>Referenz</strong>ierung der Datei listlabel13.dll bzw. listlabel13unicode.dllin der Entwicklungsumgebung Visual Studio .NET. Für Visual Studio2005 stehen eigene 2.0-Framework Assemblies zur Verfügung, die für die Arbeit in dieserEntwicklungsumgebung optimiert sind.Im Anschluss an die Einbindung werden automatisch mehrere Symbole im Komponentenbereichder Werkzeugleiste angelegt. In manchen Fällen müssen die Symbole manuelleingefügt werden, indem diese im Menü unter Tools > Customize Toolbox selektiertwerden.Wird die Komponente in der Toolbox angezeigt, kann sie per Drag & Drop auf den Arbeitsbereichdes aktiven Formulars gezogen werden. Dies ist sowohl bei WindowsForms als auch bei Web Forms möglich. Da die Komponente selbst nicht im Formularvisualisiert wird, wird ein entsprechendes Icon im Tray des Formulars angezeigt. EinKlick auf dieses zeigt die zugehörigen Eigenschaften im Eigenschaftsfenster an. Hierkönnen Sie viele wichtige Einstellungen vornehmen, die jeweils kurz beschrieben sind.Ist die Komponente eingebunden, empfiehlt es sich, den Namespace "<strong>combit</strong>.<strong>List</strong><strong>Label</strong>13"einzubinden. Dies sieht je nach Sprache und Einsatzort zum Beispiel wiefolgt aus:70


Arbeiten mit der .NET Komponenteusing <strong>combit</strong>.<strong>List</strong><strong>Label</strong>13; // C#Import <strong>combit</strong>.<strong>List</strong><strong>Label</strong>13 'VB.NET Sie können nun beginnen, <strong>List</strong> & <strong>Label</strong> durch die angebotenen Eigenschaften individuellan Ihre Bedürfnisse anzupassen und die benötigte Programmlogik zu implementieren.Hierzu bieten sich drei unterschiedliche Ansätze an:• Datenbindung• Die einfachen Print- und Design-Methoden• Eine eigene, iterative DruckschleifeDie beiden erstgenannten Möglichkeiten werden nachfolgend vorgestellt. Der iterativeAnsatz entspricht weitgehend der direkten Verwendung der DLL und ist somit durch dieallgemeine Beschreibung der <strong>List</strong> & <strong>Label</strong> API abgedeckt.6.1.3. DatenbindungDie <strong>List</strong> & <strong>Label</strong> Komponente für Microsoft .NET verfügt über umfangreiche Möglichkeitenzur direkten Datenbindung. Das implementierte System wurde den bekannten Windowsund Web Forms Controls nachempfunden. Demnach stehen zwei wichtige Eigenschaftenzur Verfügung. Über DataSource wird die Datenquelle angegeben, über Data-Member optional ein Mitglied dieser Quelle. Der Ursprung der Daten kann sehr flexibelgewählt werden. Unter anderem werden folgende Datentypen unterstützt:• DataSet (optional Angabe der gewünschten Tabelle über DataMember)• DataTable• DataView• DataViewManager• OleDbDataReader und SqlDataReader (über IDataReader)• Generische <strong>List</strong>enklassen (ab .NET 2.0)• Die Schnittstellen I<strong>List</strong>Source, I<strong>List</strong>, und IEnumerableInsbesondere die Schnittstelle IEnumerable erlaubt die Übergabe von nahezu beliebigenDaten, beispielsweise auch eigenen Collections. Das vom Enumerator gelieferte Objekt(IEnumerator.Current) wird mithilfe von Reflections angemeldet. Hierbei werden Nameund Inhalt aller angebotenen Eigenschaften und öffentlichen Felder des jeweiligen Objektsgenutzt.71


Arbeiten mit den Komponenten6.1.3.1. Bindung von <strong>List</strong> & <strong>Label</strong> an eine DatenquelleDie Datenbindung erfolgt über die Eigenschaft DataSource. Sie können diese programmatischzuweisen oder implizit mittels der Methode SetDataBinding übergeben. Alternativbietet die Komponente eine UI-Unterstützung der Entwicklungsumgebung VisualStudio .NET.Haben Sie hier bereits ein DataSet in Ihrem Formular angelegt, so können Sie dies überdas Eigenschaftsfenster auswählen. Die notwendige Verknüpfung wird automatischerzeugt.Sie können nun den Programmcode zum Start des Designs und Drucks implementieren.Nehmen Sie hierzu beispielsweise im Click-Ereignis eines neuen Buttons den MethodenaufrufPrint bzw. Design ohne zusätzliche Parameter auf. Die Daten der zugewiesenenQuelle werden automatisch zur Verfügung gestellt.// Daten zuweisenlist<strong>Label</strong>1.SetDataBinding(myDataSet, "Tabellenname");// Designer anzeigenlist<strong>Label</strong>1.Design();// Druck durchführenlist<strong>Label</strong>1.Print();Sofern Sie den Standardablauf des datengebundenen Drucks modifizieren wollen, stehenIhnen eine Reihe von Eigenschaften zur Verfügung. Diese beginnen mit Auto… undsind im Daten-Bereich des Eigenschaftsfensters zu finden.EigenschaftAutoDesignerFileAutoDestinationAutoProjectTypeAutoFileAlsoNewAutoShowPrintOptionsAutoShowSelectFileAutoBoxTypeAutoDialogTitleBeschreibungDateiname des zu verwendenden DruckprojektsDruckformat, zum Beispiel Drucker, Vorschau, PDF, HTMLund so weiterTyp des Druck-Projekts (<strong>List</strong>e, Karteikarte, Etikett)Projektneuanlage bei Designeraufruf möglichAnzeige der Druckoptionen beim DruckstartAnzeige des Dateiauswahl-Dialoges bei Druck und DesignerArt der FortschrittsboxTitel für Dialoge (z.B. Designer, Fortschrittsbox)72


Arbeiten mit der .NET KomponenteDie Datenbankanbindung wurde in Version 11 komplett überarbeitet. Sie können denalten Modus aktivieren, indem Sie das Property "AdvancedDataBinding" auf "False"setzen. Für neue Projekte sollten Sie in jedem Fall den Defaultwert "True" verwenden.6.1.3.2. Arbeiten mit Master-Detail-DatensätzenIn Verbindung mit der Datenbindung und <strong>List</strong>enprojekten kann <strong>List</strong> & <strong>Label</strong> automatischvorhandene Relationen zwischen mehreren Tabellen eines DataSet-Objekts auswertenund übernehmen. Solche Relationen werden zwischen zwei Spalten (DataColumn) mithilfeeiner DataRelation hergestellt. Dies sieht beispielsweise wie folgt aus:DataColumn dc1 = mydataset.Tables["invoice"].Columns["billno"];DataColumn dc2 = mydataset.Tables["items"].Columns["billno"];DataRelation dr = new DataRelation("invoice2items", dc1, dc2);mydataset.Relations.Add(dr);Der angegebene Name kennzeichnet die Relation eindeutig. Auf diese Weise ist esmöglich, eine beliebige Anzahl von Relationen anzulegen, die <strong>List</strong> & <strong>Label</strong> parallel zurLaufzeit auswerten kann.Die Art der Datenübergabe wird mithilfe der Eigenschaft AutoMasterMode festgelegt.Die zugrundeliegende Enumeration stellt folgende Werte zur Verfügung:• None: Es werden keine Master-Detail-Relationen ausgewertet (nur im "alten" Modus,s.o.)• AsFields: Master- und Detaildaten werden parallel als Felder angemeldet. Es lassensich dadurch Gruppierungen, Statistiken und Übersichten realisieren.• AsVariables: Die Masterdaten werden als Variablen, die Detaildaten als Felder angemeldet.Nach jedem Masterdatensatz wird das Projekt intern mittels LlPrintResetProjectStatezurückgesetzt. Auf diese Weise lassen sich mehrere identische Reportsmit unterschiedlichen Daten hintereinander in einem Job drucken, zum Beispielmehrere Rechnungen.Bitte beachten Sie auch die mitgelieferten Beispiele zur Datenbindung.6.1.3.3. Weitere Möglichkeiten der DatenbindungDie Datenbindung der Komponente stellt Ihnen vier unterschiedliche Ereignisse zurVerfügung, mithilfe derer Sie den Ablauf beeinflussen können. Die Tabelle zeigt eineÜbersicht.EreignisAutoDefineNewPageBeschreibungDas Ereignis wird für jede neue Seite aufgerufen und erlaubtdie Anmeldung von zusätzlichen Variablen für diese Seite.73


Arbeiten mit den KomponentenAutoDefineNewLineAutoDefineVariableAutoDefineFieldAutoDefineTableAutoDefineTableSortOrderDie Eigenschaft IsDesignMode der Ereignisargumente gibtan, ob es sich um den Design-Modus handelt.Dieses Ereignis wird für jede neue Zeile vor der automatischenAnmeldung der datengebundenen Felder aufgerufen.Analog zu AutoDefineNewPage können Sie hier zusätzlicheFelder anmelden.Für jede automatisch mittels Datenbindung angelegte Variablewird dieses Ereignis aufgerufen. Über die EigenschaftenName und Value der Ereignisargumente können Sie denNamen sowie den Inhalt jeder einzelnen Variable individuellvor der Übergabe an die Druckengine manipulieren.Analog zu AutoDefineVariable für FelderDieses Ereignis wird für jede Tabelle aufgerufen, die überLlDbAddTable() angemeldet wird. Sie können z.B. den Namenändern oder die Übergabe unterdrücken.Dieses Ereignis wird für jede Sortierung aufgerufen, die überLlDbAddTableSortOrder() angemeldet wird. Sie können z.B.den Namen ändern oder die Übergabe unterdrücken.AutoDefineTableRelation Dieses Ereignis wird für jede DataRelation aufgerufen, dieüber LlDbAddTableRelation() angemeldet wird. Sie könnenz.B. den Namen ändern oder die Übergabe unterdrücken.6.1.4. Einfache Print- und Design-MethodenDie Print- und Design-Methoden der .NET Komponente wurden analog zu den korrespondierendenOCX- und VCL-Controls realisiert. Die Methoden implementieren einestandardisierte Druckschleife, die für den Großteil der einfacheren Anwendungen direktverwendbar ist, wenn Sie die Daten nicht in einem über DataBinding verwendbarenObjekt halten. Beide Methoden verfügen über eine Reihe von Überladungen, über diesich beispielsweise das Druckprojekt, Druckziel sowie die Projektart angeben lassen.Ohne Parameter aufgerufen werden hierfür Standardwerte angenommen.Die Daten werden bei diesem Ansatz innerhalb der Ereignisse DefineVariables und DefineFieldsan <strong>List</strong> & <strong>Label</strong> übergeben. Auf diese Weise können beliebige Datenquellenindividuell angebunden werden. Die Ereignisargumente erlauben den Zugriff auf nützlicheInformationen wie die übergebenen Benutzerdaten, den Design-Mode und so weiter.Über die Eigenschaft IsLastRecord wird der Druckschleife mitgeteilt, dass der letzteDatensatz erreicht wurde. Solange dies nicht der Fall ist, wird das jeweilige Ereigniswiederholt aufgerufen, um die Daten abzufragen.74


Arbeiten mit der .NET KomponenteZusätzliche Optionen lassen sich im Ereignis DefinePrintOptions festlegen. Intern wirddieses Ereignis nach dem Aufruf von LlPrintWithBoxStart aber vor dem eigentlichenDruck ausgelöst.Eine sehr einfache Verwendung der Methode Print sieht wie folgt aus:private void button1_Click(object sender, System.EventArgs e){<strong>List</strong><strong>Label</strong> LL = new <strong>List</strong><strong>Label</strong>();LL.DefineVariables += newDefineVariablesHandler(LL_DefineVariables);LL.Print(LlProject.<strong>List</strong>, "test.lst", false);}private void LL_DefineVariables(object sender, DefineElementsEventArgs e){<strong>List</strong><strong>Label</strong> LL = (<strong>List</strong><strong>Label</strong>) sender;LL.Variables.Add("meine variable", "inhalt");//Es soll nur ein Datensatz gedruckt werden!if(!e.IsDesignMode) e.IsLastRecord = true;}6.1.4.1. Verwendung des UserData-ParametersEine Überladung der Methoden Print und Design erlaubt die Übergabe eines ParametersUserData vom Typ object. Mithilfe dieses Parameters können Sie beliebige Daten an dieEreignisse DefineVariables und DefineFields weiterleiten. Das übergebene Objekt stehtdort über die Ereignisargumente zur Verfügung.Durch dieses System können Sie benötigte Daten wie beispielsweise einen DataReaderan das untergeordnete Ereignis weiterleiten, ohne dass Sie dieses als globale Variabledeklarieren müssen. Das <strong>List</strong>ing zeigt dies anhand eines Beispiels.OleDbDataReader reader = …if(reader.Read())LL.Print(reader, LlProject.<strong>List</strong>, "test.lst", …);private void LL_DefineVariables(object sender, DefineElementsEventArgs e){<strong>List</strong><strong>Label</strong> LL = (<strong>List</strong><strong>Label</strong>) sender;OleDbDataReader reader = (OleDbDataReader) e.UserData;for(int I=0; I


Arbeiten mit den Komponenten6.1.5. Übergabe von ungebundenen Variablen und FeldernDie Übergabe von Variablen und Feldern weicht vom regulären <strong>List</strong> & <strong>Label</strong> Prinzip starkab und wurde an den objektorientierten Ansatz von .NET angepasst. Die Komponentebietet zwei Eigenschaften Variables und Fields, die jeweils eine Collection vom Typ VariableCollectionbeziehungsweise FieldCollection liefern. Mithilfe der Collections lassensich die gewünschten Variablen und Felder beispielsweise in Verbindung mit den PrintundDesign-Methoden übergeben. Beide Collections wurden von der selben abstraktenBasisklasse abgeleitet, so dass sich die nachfolgende Beschreibung auf die VariableCollectionbeschränkt.Die Methode Add der VariableCollection erlaubt die Anlage einer neuen Variable. Internresultiert dies in einem Aufruf der API-Funktion LlDefineVariable. Neben dem Namenwird der Inhalt der Variable übergeben. Es existieren eine Vielzahl von Überladungen, diedie jeweiligen CLS-Datentypen auf die internen <strong>List</strong> & <strong>Label</strong> Typen abbilden. Die Überladungenweichen demnach im zweiten Parameter ab, dessen mögliche Datentypen inder Tabelle gezeigt sind.CLS / Framework C# VB.NET <strong>List</strong> & <strong>Label</strong>System.String String String LL_TEXTSystem.Char[] Char[] Char LL_TEXTSystem.Int16 Short Short LL_NUMERICSystem.Int32 Int Integer LL_NUMERICSystem.Int64 Long Long LL_NUMERICSystem.Single Float Single LL_NUMERICSystem.Double Double Double LL_NUMERICSystem.Decimal Decimal Decimal LL_NUMERICSystem.Boolean Bool Boolean LL_BOOLSystem.DateTime DateTime Date LL_DATESystem.Object Object Object - Je nach Inhalt -Die Überladung für den obersten Datentyp System.Object implementiert eine verschachtelteTypenkonvertierung. Hier wird versucht, das übergebene Objekt dynamischin einen der bekannten Datentypen zu konvertieren. Ist dies nicht möglich, wird eineTextvariable angemeldet, deren Inhalt sich aus der Anwendung der Methode ToStringauf das Objekt ergibt.76


Arbeiten mit der .NET KomponenteDie folgenden Zeilen zeigen die Anmeldung einer Zeichenkette, eines numerischen Wertessowie eines Datums. In jedem Fall werden automatisch die korrespondierenden <strong>List</strong>& <strong>Label</strong> Variablentypen angewandt und im Designer zur Verfügung gestellt.LL.Variables.Add("meintext", "hallo welt"); // -> ZeichenketteLL.Variables.Add("meinezahl", 51515); // -> Numerischer WertLL.Variables.Add("meindatum", DateTime.Now); // -> DatumNeben den aufgelisteten Standarddatentypen existieren auch Überladungen für folgendeKlassen:• StringBuilder• Bitmap• Icon• MetafileIntern wird vor jeder Anmeldung von Variablen und Feldern zur Druckzeit geprüft, obdiese im Drucklayout überhaupt verwendet werden. Um die Anzahl der Aufrufe zu reduzieren,wird überdies ein Cache von verwendeten Feldern und Variablen aufgebaut.Sie brauchen sich um die Prüfung mittels LlPrintIsFieldUsed() bzw. den Pendants fürVariablen und Chartfelder also nicht zu kümmern.6.1.5.1. BilderDie Übergabe von Grafiken erfolgt mittels der gezeigten Überladungen für Bitmap, Metafileund Icon. Um beispielsweise die Grafik c:\meinbild.jpg in <strong>List</strong> & <strong>Label</strong> darzustellen,verwenden Sie folgenden Aufruf:LL.Variables.Add("meinbild", new Bitmap("c:\\meinbild.jpg"));Tipp: Aus lizenzrechtlichen Gründen wird das GIF-Format von <strong>List</strong> & <strong>Label</strong> nicht direktunterstützt. Die Klasse Bitmap des .NET-Frameworks kennt dieses Format jedoch, sodassauf diesem Umweg eine Anmeldung von GIF-Bildern theoretisch möglich ist, soferndie lizenzrechtlichen Aspekte dies im jeweiligen Fall erlauben.6.1.5.2. BarcodesDie Übergabe von Barcodes ist bei der .NET Komponente stark vereinfacht worden. EinBarcode wird über die Klasse LlBarcode repräsentiert. Dem Konstruktor wird der Inhaltdes Barcodes sowie das gewünschte Format übergeben. Eine eventuell notwendigeFormatierung mit Trennzeichen (vergleiche Thema "Barcode-Formate" in Online-Hilfe)77


Arbeiten mit den Komponentenwird automatisch vorgenommen. Die so angelegte Instanz der Klasse wird der MethodeAdd der VariablesCollection übergeben.LlBarcode bc = new LlBarcode("123456789012", LlBarcodeType.EAN13);LL.Variables.Add("myBarcode", bc);6.1.5.3. DictionariesMithilfe mehrerer Überladungen lassen sich an <strong>List</strong> & <strong>Label</strong> verschiedene Dictionariesmit einer Schlüssel-Wert-Beziehung anmelden. Hierzu steht eine spezielle MethodeAddFromDictionary der VariablesCollection zur Verfügung. Sie können Klassen übergeben,die von der abstrakten Basisklasse NameObjectCollectionBase abgeleitet sind oderdie Schnittstelle IDictionary implementieren. Zu den gängigsten Vertretern gehören dieKlassen NameValueCollection und Hashtable.Die Methode durchläuft das Dictionary und meldet alle enthaltenen Daten an. Als Variablennamewird automatisch der vergebene Schlüssel verwendet. Es ist zudem dieÜbergabe eines Variablenpräfix möglich, beispielsweise zur Gliederung der Variablenliste.Hashtable customer = new Hashtable();ht.Add("Customer.Firstname", "John");ht.Add("Customer.Lastname", "Doe");LL.Variables.AddFromDictionary(ht);6.1.5.4. Streams und TextReaderUmfangreiche Daten können Sie direkt aus der jeweiligen Quelle abfragen. Hierzu bietetdie Komponente zwei Methoden AddFromStream und AddFromTextReader an, der Sieeine Ableitung der jeweiligen abstrakten Klasse übergeben können. Sie können so beispielsweiseganze Dateien an <strong>List</strong> & <strong>Label</strong> anmelden (Klasse FileStream).6.1.5.5. DatenzeilenÜberladungen der Methode AddFromDataRecord erlauben die Übergabe von Klassen,die die Schnittstelle IDataRecord unterstützen. Hierzu gehören beispielsweise die KlassenOleDbDataReader und SqlDataReader. Es wird der jeweils aktuelle Datensatz angemeldet,der Datensatzzeiger wird nicht bewegt (Methode Read). Zudem ist es möglich,der Methode eine Instanz der Klasse DataRow zu übergeben. Eine weitere FunktionAddFromDataRowView erlaubt die Übergabe einer DataRowView. Dabei werden dieDatentypen aus dem Schema übernommen.6.1.5.6. RTF-Texte und andere <strong>List</strong> & <strong>Label</strong> DatentypenBei den vorgestellten Aufrufen werden die internen <strong>List</strong> & <strong>Label</strong> Datentypen automatischangenommen. So werden numerische Werte zu LL_NUMERIC, Dati zu LL_DATE undlogische Werte zu LL_BOOL. Bei einigen Formaten existieren keine korrespondierendenDatentypen im .NET Framework, so dass diese <strong>List</strong> & <strong>Label</strong> explizit mitgeteilt werden78


Arbeiten mit der .NET Komponentemüssen. In diesem Zusammenhang sind insbesondere LL_RTF und LL_HTML zu nennen.Die bisher vorgestellten Methode erlauben mittels Überladung immer auch die expliziteAngabe des zu verwendenden <strong>List</strong> & <strong>Label</strong> Datentyps. So können Sie beispielsweise dieMethode AddFromStream verwenden, um eine RTF-Datei anzumelden.FileStream myFileStream = File.OpenRead("c:\\test.rtf");LL.Variables.AddFromStream("RTF-Text", myFileStream, LlFieldType.RTF);Auch die anderen Add…-Methoden verfügen über eine derartige Überladung. Der gewünschteDatentyp entspringt dabei der Enumeration LlFieldType.6.1.5.7. HandlesDie API-Funktion LlDefineVariableExtHandle wird mithilfe der Methode AddFromHandleabgebildet. Hier können Sie ein Handle in Form eines IntPtr übergeben. Auch die Angabedes gewünschten Datentyps ist möglich. Normalerweise ist dies LlFieldType. Drawing_hBitmap.Hinweis: Diese Methode sollte nur in Sonderfällen zur Anbindung an die Win32 APIgenutzt werden, beispielsweise wenn eine Komponente mit unmanaged code ein derartigesHandle liefert. In anderen Fällen können Sie direkt das jeweilige Bitmap anmelden.Die abstrakte Basisklasse Image unterstützt indes auch eine statische MethodeFromHbitmap, mithilfe derer sich eine Instanz der Klasse Bitmap auf Basis eines Handlesanlegen lässt.6.1.5.8. Beliebige andere DatentypenDie <strong>List</strong> & <strong>Label</strong> Komponente erlaubt die Übergabe von beliebigen Daten. Hierzu stehtdie Methode AddFromObject zur Verfügung. Die Methode nutzt Reflections um dieöffentlichen Felder und Eigenschaften des übergebenen Objekts abzufragen und alsVariablen bei <strong>List</strong> & <strong>Label</strong> anzumelden. Als Name wird der Name des entsprechendenKlassenmitglieds verwendet, wobei mittels Überladung auch die Übergabe eines Namenpräfixmöglich ist.Die folgende Zeile zeigt die Übergabe eines Cookies innerhalb eines Webreporting-Projekts:LL.Variables.AddFromObject("MeinCookie", Request.Cookies["test"]);Folgende Variablen wurden durch diesen Aufruf automatisch angemeldet:79


Arbeiten mit den Komponenten• MeinCookie.Domain• MeinCookie.Expires (LL_DATE)• MeinCookie.HasKeys (LL_BOOL)• MeinCookie.Name• MeinCookie.Path• MeinCookie.Secure (LL_BOOL)• MeinCookie.Value• MeinCookie.Values6.1.5.9. Möglichkeiten der CollectionDie Klassen VariablesCollection und FieldsCollection leiten sich von der abstrakten BasisklasseElementBaseCollection ab. Diese implementiert die Schnittstelle IDictionaryund somit indirekt ICollection und IEnumerable. Folgerichtig können Sie die üblichenMethoden und Techniken anwenden. Hierzu gehören insbesondere folgende:• Über die Items-Eigenschaft beziehungsweise den Indexer können Sie den Inhalteiner Variable erhalten, indem Sie deren Namen übergeben. Sie erhalten eine vonder abstrakten Basis Element abgeleitete Klasse zurück.• Sie können alle Variablen mittels einer foreach…in-Schleife durchlaufen. Auch hiererhalten Sie jeweils eine von Element abgeleitete Klasse zurück.• Die Methode Clear setzt die Collection zurück und ruft hierzu intern parallel die API-Funktion LlDefineVariableStart beziehungsweise LlDefineFieldStart auf.• Count liefert die Anzahl der angemeldeten Variablen• Contains fragt ab, ob eine Variable bereits angemeldet wurdeBeim Zugriff auf eine Variable, sei es über den Variablennamen oder eine Enumeration,erhalten Sie eine von der abstrakten Basis Element abgeleitete Klasse zurück. Dieseerlaubt über die Eigenschaften Name und Value Zugriff auf Namen und aktuell zugewiesenenWert der Variable. Über die Methode IsUsed können Sie ermitteln, ob die Variableim aktuellen Druckprojekt verwendet wird. Intern realisiert dies die API-Funktion LlPrintIsVariableUsedbeziehungsweise LlPrintIsFieldUsed.Der folgende Quellcode-Ausschnitt zeigt die Enumeration aller angemeldeten Variablen.Es wird jeweils eine MessageBox mit dem Namen und dem Inhalt ausgegebenforeach(Variable var in list<strong>Label</strong>1.Variables){MessageBox.Show(string.Format("{0} -> {1}",var.Name, var.Value));}80


Arbeiten mit der .NET Komponente6.1.6. Auswahl der SpracheDer <strong>List</strong> & <strong>Label</strong> Designer liegt in zahlreichen Sprachen vor. Die Komponente unterstütztSie somit intensiv bei der Realisierung von mehrsprachigen Desktop- und Web-Applikationen. Es gibt mehrere Möglichkeiten, <strong>List</strong> & <strong>Label</strong> die zu verwendende Sprachemitzuteilen.1. Weisen Sie der Eigenschaft Language die entsprechende Sprache zu:LL.Language = LlLanguage.German;2. Übergeben Sie die Sprache dem Konstruktor der Komponente:LL = new <strong>List</strong><strong>Label</strong>(LlLanguage.German);3. Übergeben Sie dem Konstruktor der Komponente die zu verwendende Culture,beispielsweise aus dem aktuellen Thread:LL = new <strong>combit</strong>.<strong>List</strong><strong>Label</strong>13.<strong>List</strong><strong>Label</strong>(CultureInfo.CurrentUICulture);Die Sprache wird nun in Abhängigkeit von der UI-Sprache des aktuellen Threadsgewählt und von <strong>List</strong> & <strong>Label</strong> automatisch entsprechend eingestellt.4. Sie können die Sprache auch flexibel über die Konfigurationsdatei der Applikation(.config) steuern. Hierzu ist es erforderlich, dass Sie programmseitig die Default-Sprachewählen (LlLanguage.Default).Ändern Sie die Sprache in der Konfiguration, wird diese beim nächsten Start derApplikation automatisch verwendet. Als Angabe sind alle Werte der EnumerationLlLanguage erlaubt.81


Arbeiten mit den KomponentenHinweis: Bitte beachten Sie, dass Sie zur Anzeige der jeweiligen Sprache das entsprechendeLanguage Kit benötigen. Welche Kits wir derzeit anbieten und was diese kosten,erfahren Sie in unserem Online-Shop unter www.<strong>combit</strong>.net.6.1.7. Arbeiten mit Ereignissen<strong>List</strong> & <strong>Label</strong> bietet eine Vielzahl von Callbacks an, die bei der <strong>List</strong> & <strong>Label</strong> .NET Komponenteals Ereignisse implementiert wurden. Die von <strong>List</strong> & <strong>Label</strong> verwendeten Strukturenwerden in üblicher .NET Notation als Ereignisargumente übergeben. Es handelt sichjeweils um eine von EventArgs abgeleitete Klasse. Sofern von einem Callback eineStruktur mit weiteren Daten geliefert wird, stehen diese Informationen über entsprechendeEigenschaften mit korrespondierenden .NET Datentypen zur Verfügung. Dieursprüngliche Struktur wird jeweils über die Eigenschaft CallbackData angeboten.Eine Umfangreiche Beschreibung der zur Verfügung stehenden Events finden Sie in dermitgelieferten Onlinehilfe zur .NET-Komponente.6.1.8. Individuelle Evaluierung von Ausdrücken<strong>List</strong> & <strong>Label</strong> bietet einen umfangreichen Formelparser an, den Sie auch sehr einfach ineigenen Applikationen nutzen können. Auf diese Weise können Sie Ihren Kunden einleistungsfähiges Werkzeug zur Anpassung an die Hand geben.Der Parser wird von der Klasse ExpressionEvaluator angeboten. Sie können dem Konstruktorentweder die Instanz einer Klasse übergeben, die die Schnittstelle IDictionaryimplementiert oder die gewünschten Variablen über die gleichnamigen Eigenschaftübergeben. Es stehen Ihnen hier die üblichen Möglichkeiten der VariableCollection zurVerfügung.Der Methode Evaluate wird die zu evaluierende Formel übergeben, die das Ergebnis alsobject zurückliefert. Je nach Datentyp können Sie nun eine einfache Typenkonvertierungvornehmen.Das Beispiel zeigt den Einsatz der Klasse. Das aktuelle Datum wird als Variable übergeben.Mithilfe der <strong>List</strong> & <strong>Label</strong> Designer-Funktion AddWeeks werden zu diesem Datumzwei Wochen addiert. Das Ergebnis wird in einer MessageBox ausgegeben.ExpressionEvaluator eval = new ExpressionEvaluator();eval.Variables.Add("datum", DateTime.Now);DateTime newDate = (DateTime) eval.Evaluate("AddWeeks(datum, 2)");MessageBox.Show(newDate.ToString());Möchten Sie eine Evaluierung auf Basis einer bestehenden Instanz der Komponente<strong>List</strong><strong>Label</strong> durchführen, verwenden Sie einfach deren Methode EvaluateExpression. Übereinen booleschen Parameter können Sie hier angeben ob nur die angemeldeten Variablenoder zusätzlich auch die Felder ausgewertet werden sollen.82


Arbeiten mit der .NET Komponente6.1.9. Zusammenarbeit mit den .NET Druck-KlassenDas .NET Framework bietet eine Reihe von Klassen, Komponenten und Controls für denDruck und die Anzeige von Vorschaufenstern an. In diesem Zusammenhang zu nennensind insbesondere die Komponente PrintDocument und das Control PrintPreviewControl,das zur Anzeige einer Vorschau in einem Formular verwendet werden kann.<strong>List</strong> & <strong>Label</strong> kann mit den angebotenen Klassen zusammenarbeiten. Einerseits wird eineAbleitung der Klasse PrintDocument angeboten, die Klasse <strong>List</strong><strong>Label</strong>Document. Dieserepräsentiert ein erzeugtes Druckprojekt. Intern basiert die Klasse auf einer Vorschau-Datei im LL-Format.6.1.9.1. Anzeige einer Vorschaudatei in einem PrintPreviewControlUm eine bestehende <strong>List</strong> & <strong>Label</strong> Vorschau-Datei (Endung .LL) in einem .NET PrintPreviewControlanzuzeigen, platzieren Sie zunächst die <strong>List</strong><strong>Label</strong>Document-Komponenteauf Ihrem Formular. Über die Eigenschaft PreviewFilename können Sie nun den Dateinamender anzuzeigenden Datei angeben.Im zweiten Schritt platzieren Sie das PrintPreviewControl oder auch einen PrintPreview-Dialog auf Ihrem Formular. Über dieses Control kann die Vorschau direkt im Formularangezeigt werden. Sie müssen lediglich über die Eigenschaft Document das anzuzeigendeDokument zuweisen.83


Arbeiten mit den KomponentenDie Abbildung zeigt das Control in Verbindung mit der <strong>List</strong><strong>Label</strong>Document-Komponenteim Einsatz.6.1.9.2. Druck in ein PrintPreviewControlAuch beim Druck werden die vorgestellten .NET-Klassen unterstützt. Sie können <strong>List</strong> &<strong>Label</strong> ein vorhandenes PrintPreviewControl über die Eigenschaft PreviewControl zuweisen.Als Druckziel geben Sie ebenfalls PreviewControl an. Dies ist auch beim datengebundenenEinsatz über die Eigenschaft AutoDestination möglich. Im Anschluss an dieErzeugung wird nun automatisch eine Vorschau-Datei im gewählten Control angezeigt.Wesentlich mächtiger als das .NET-Vorschaucontrol ist allerdings das ebenfalls mitgelieferte,spezialisierte <strong>List</strong> & <strong>Label</strong> Vorschaucontrol (Klasse <strong>List</strong><strong>Label</strong>PreviewControl).Auch dieses könnten Sie als PrintPreviewControl auswählen. Das Control erlaubt z.B.auch einen direkten Export in diverse Formate.6.1.10. Arbeiten mit Vorschau-DateienDie <strong>List</strong> & <strong>Label</strong> Storage-API erlaubt den Zugriff auf die LL-Vorschaudateien. Sie könnenallgemeine Informationen oder die einzelnen Seiten abfragen, mehrere Dateien zusammenfügenund Benutzerdaten abspeichern. Die Möglichkeiten der API werden bei der.NET Komponente über zwei Klassen PreviewFile und PreviewPage abgebildet, die jeweilseine gesamte Vorschaudatei beziehungsweise eine einzelne Seite aus einer Dateirepräsentieren.6.1.10.1. Aufruf einer VorschaudateiSie können dem Konstruktor der Klasse PreviewFile den Dateinamen der zu öffnendenVorschaudatei übergeben. Über eine ganze Reihe von Eigenschaften stehen nun allgemeineInformationen über die Datei zur Verfügung.Eigenschaft Datentyp BeschreibungHandle IntPtr Handle auf die VorschaudateiFileVersion int Version der DateiAPIVersion Int Version der APIUnits LlUnits Bei der Erstellung verwendete MaßeinheitEmfResolution int Auflösung der internen MetafilesPrinterCount int Anzahl der hinterlegten DruckerBoxType int Typ des anzuzeigenden FortschrittdialogsFilename string DateinameCount int Anzahl der Seiten84


Arbeiten mit der .NET KomponenteBeispiel:PreviewFile sf = new PreviewFile("c:\\test.ll");int PageCount = sf.Count;...Über die Methode Close kann eine geöffnete Datei geschlossen werden. Soll diesegelöscht werden, verwenden Sie die Methode DeleteFiles. Selbstverständlich könnenSie die Datei auch auf dem Drucker ausgeben. Einige Überladungen der Methode Printerlauben die Angabe eines oder mehrerer Drucker sowie eines Seitenbereichs, der gedrucktwerden soll.6.1.10.2. Zusammenführen mehrer VorschaudateienSie können mehrere Vorschaudateien zusammenführen. Hierzu müssen Sie zunächst dieZieldatei öffnen. Da ein schreibender Zugriff notwendig ist, müssen Sie für den zweitenParameter ReadOnly false übergeben. Anschließend können Sie den Dateinamen deranzuhängenden Datei der Methode Append übergeben. Alternativ können Sie auch einHandle auf eine Vorschaudatei im Speicher oder eine andere Instanz der PreviewFilezuweisen.PreviewFile sf = new PreviewFile("c:\\test.ll", false);sf.Append(new PreviewFile("c:\\test2.ll"));sf.Close();6.1.10.3. Zugriff auf die Seiten einer VorschaudateiDer Indexer der Klasse erlaubt den Zugriff auf die einzelnen Seiten der Vorschaudatei.Diese werden jeweils von der Klasse PreviewPage repräsentiert. Alternativ unterstütztdie Klasse die Schnittstelle IEnumerable, sodass Sie die Seiten mittels einer foreach…in-Schleife durchlaufen können.PreviewFile sf = new PreviewFile("c:\\test.ll");foreach(PreviewPage pp in sf){Metafile mf = pp.GetMetafile();...}Jede Seite bietet ihrerseits einige Informationen wie den Namen des Druckjobs, denNamen des Druckers, die eingestellte Kopienanzahl und vieles mehr zur Verfügung. Esist zudem möglich, die Seiteneinstellungen abzufragen. Die Eigenschaft PageSettingsliefert hierzu eine Instanz der gleichnamigen Klasse aus dem .NET Framework zurück.85


Arbeiten mit den KomponentenÜber die Methode GetMetafile ist es möglich, das intern verwendete Metafile abzufragen.Dies erlaubt einen direkten Zugriff auf den Inhalt der Seite. Die weiter oben beschriebeneKlasse <strong>List</strong><strong>Label</strong>Document verwendet diese Möglichkeit zur Anbindung derVorschaudatei an das PrintPreviewControl. Benötigen Sie statt des Metafiles ein Bitmap,verwendet Sie alternativ die Methode GetBitmap.6.1.11. Verwendung von <strong>List</strong> & <strong>Label</strong> zum WebreportingEine interessante Möglichkeit der <strong>List</strong> & <strong>Label</strong> .NET Komponente ist unter dem StichwortWebreporting zusammengefasst. In Verbindung mit ASP.NET können Sie online und onthe fly Reports auf dem Server erstellen und diese den Benutzern Ihrer Web-Applikationen zur Verfügung stellen.6.1.11.1. Vorbereitungen für Webreporting/ServereinsatzWebreporting setzt einige Vorbereitungen voraus, die nachfolgend beschrieben sind.Diese sind sowohl für das mitgelieferte Beispiel als auch eigene Web-Applikationennotwendig. Die Beschreibung geht davon aus, dass Sie eine Applikation bereits in einemVerzeichnis auf Ihrem Webserver abgelegt haben.1. Bitte legen Sie zunächst einen Alias für das physikalische Verzeichnis in der Konfigurationder Internet Information Services an. Nun können Sie über den vergebenenAlias auf die Applikation zugreifen: http://localhost//2. Vergeben Sie für den Benutzer-Account "ASPNET" explizit volle Zugriffsrechte (FullControl) auf dieses Verzeichnis auf Ebene der Windows ACL (Access Control <strong>List</strong>).Die Rechte sind notwendig, da während der Ausführung des Beispiels Dateien gelesenund neu angelegt werden müssen.3. Sofern Sie die <strong>List</strong> & <strong>Label</strong> DLLs (zum Beispiel cmll13.dll) im Windows-System32-Verzeichnis abgelegt haben (Standardfall), benötigt der genannte Benutzer-Accountzumindest Leserechte auf dieses Verzeichnis. Alternativ können Sie auch die in derDatei redist.txt genannten DLLs in das bin-Verzeichnis der Web-Applikation kopieren.Beachten Sie bitte, dass diese Dateien zusätzlich (!) zu der .NET Komponente<strong>List</strong><strong>Label</strong>13.dll benötigt werden, die prinzipiell im bin-Verzeichnis oder im Global AssemblyCache abgelegt werden muss.4. Kopieren Sie die Webserverlizenzdatei in das gleiche Verzeichnis, in dem auch diecmll13.dll liegt. Sie können diese Datei mit Hilfe der Anwendung ll13web.exe erzeugen,die sich ebenfalls im Lieferumfang befindet. Sie benötigen hierfür die Seriennummerund den Productkey Ihrer Server-/Webserverlizenz. Informationen darüber,für welche Anwendungen Sie Server-/Webserverlizenzen benötigen, finden Sie imLizenzvertrag von <strong>List</strong> & <strong>Label</strong>.Um die korrekte Umgebung sicherzustellen, können Sie Ihre Installation mit Hilfe desmitgelieferten Tools ll13webcheck.exe analysieren. Diese Anwendung überprüft unteranderem die Zugriffsrechte und die installierten Drucker und hilft somit bei der Rechtevergabe.Im Verzeichnis "\llwebcheck" befinden sich alle benötigten Dateien. Eine de-86


Arbeiten mit der .NET Komponentetaillierte Beschreibung zur Funktionsweise ist ebenfalls in diesem Verzeichnis zu finden.6.1.11.2. Druckertreiber und WebserverDer Benutzer-Account "ASPNET" läuft im Kontext eines Windows Service. In der Regelhaben diese keinen Zugriff auf die am System eingerichteten Drucker. Dies ist jedochnotwendig, da <strong>List</strong> & <strong>Label</strong> auch bei Erzeugung von Export- und Vorschaudateien einenDruckertreiber als <strong>Referenz</strong> benötigt. Ist kein Zugriff möglich, erhalten Sie den Fehlercode–11 beziehungsweise mit .NET eine entsprechende Ausnahme.Die Microsoft Knowledgebase hält unter der Nummer Q184291 einen englischsprachigenArtikel bereit, wie zur Einrichtung von Druckern für den SYSTEM Account vorzugehenist. Sie erreichen den Artikel über den angegebenen Link. Nach erfolgreicher Übernahmeder Konfiguration sollte der Druck innerhalb des Services möglich sein.http://support.microsoft.com/support/kb/articles/Q184/2/91.ASP6.1.11.3. DebuggingAufgrund der Systemarchitektur ist ein Debugging von Web-Applikationen mithilfe desDebuggers DebWin 2 nicht möglich. <strong>List</strong> & <strong>Label</strong> bietet daher die alternative Erzeugungeines Log-Files. Die folgende Zeile aktiviert dieses Modus:LL.Debug = LlDebug.Enabled | LlDebug.LogToFile;Es wird nun eine Datei <strong>combit</strong>.log im %APPDATA%-Verzeichnis angelegt. Hier sind alleAufrufe an die <strong>List</strong> & <strong>Label</strong> API sowie deren Parameter protokolliert. Soll ein andererDateiname verwendet werden, so übergeben Sie diesen einfach im Konstruktor derKomponente:<strong>List</strong><strong>Label</strong> LL = new <strong>List</strong><strong>Label</strong>(LlLanguage.Default, true, "c:\\debug.log");Hinweis: Beachten Sie, dass der Benutzer-Account "ASPNET" zur Erzeugung der Protokolldateivolle Rechte (Full control) auf das entsprechende Verzeichnis benötigt. SofernSie keinen anderen Pfad ausgewählt haben, werden daher zum Debugging der Web-Applikation volle Rechte auf das Windows-Verzeichnis vorausgesetzt.Möchten Sie das Debugging nachträglich einschalten, so können Sie dies über die Konfigurationsdateider aufrufenden Applikation nachholen. Sie können also eine reguläreRelease-Version nachträglich mit Debug-Ausgaben versehen.87


Arbeiten mit den KomponentenAuf diese Weise können Sie das Debugging sowohl in der machine.config/ web.configbei Web-Applikationen als auch in der .config bei Desktop-Applikationen aktivieren.6.1.12. Erweiterung des Designers<strong>List</strong> & <strong>Label</strong> bietet vielfältige Möglichkeiten, den Designer zu erweitern. Hierzu zählenunter anderem die verschiedenen Ereignisse der Komponente die beispielsweise einenEingriff in das Menü und die angebotenen Funktionen erlauben. Doch die Möglichkeitengehen noch weiter…6.1.12.1. Hinzufügen von Designer-FunktionenEine der wichtigsten und mächtigsten Möglichkeiten des Designers sind der Formelassistentund die dort angebotenen Funktionen. Mithilfe der External$-Funktion und demEvaluate-Ereignis der Komponente können Sie dem Benutzer eine individuell von IhremProgramm behandelte Funktion anbieten. Auf Basis der .NET-Komponente ist es zudemmöglich, ganz individuelle Funktionen in den Designer einzubinden.Zum Hinzufügen einer neuen Funktion öffnen Sie zur Designzeit das Eigenschaftsfensterder Komponente. Wählen Sie die Eigenschaft DesignerFunctions aus und öffnen Sie denEditor mithilfe des Buttons "…". Die Abbildung zeigt den nun angezeigten Collection-Editor.88


Arbeiten mit der .NET KomponenteIm Dialog können Sie über den Button "Add" eine neue Designerfunktion hinzufügen. Eswird automatisch eine neue Komponente angelegt und im Tray Ihres Formulars sichtbar.Über das Eigenschaftsfenster auf der rechten Seite können Sie das Verhalten der neuenFunktion im Designer festlegen. Die Tabelle zeigt die zur Verfügung stehenden Eigenschaften.Eigenschaft Datentyp BeschreibungFunctionName string Der eindeutige Name der DesignerfunktionDescription string Eine zusätzliche Beschreibung der Funktion fürden FormelassistentenGroupName string Die Gruppe in der die Funktion im Formelassistentenangezeigt wirdVisible bool Gibt an, ob die Funktion im Assistenten angezeigtwird oder nichtMinimalParameters int Die minimale Anzahl von Parametern. Gültig sindWerte zwischen 0 und 4.MaximumParameters intDie maximale Anzahl von Parametern. Gültigsind auch hier Werte zwischen 0 und 4. DerWert muss gleich oder größer der minimalenAnzahl sein. Eine größere Anzahl ergibt optionaleParameter.89


Arbeiten mit den KomponentenParameter1 – 4DesignerFunctionParameterJeder der bis zu vier Parameter kann individuellkonfiguriert werden.Type LlParamType Der Datentyp des ParametersDescription string Eine Beschreibung des Parameters für die Tooltip-Hilfeim DesignerResultType LlParamType Der Datentyp des RückgabewertsMithilfe der Eigenschaften können Sie die neue Designerfunktion individuell einstellen.Um die Funktion schließlich zum Leben zu erwecken, müssen Sie das Ereignis Evaluate-Function behandeln. Über die Ereignisargumente erhalten Sie Zugriff auf die vom Benutzereingegebenen Parameter. Um beispielsweise die Summe der beiden Parameterzurück zu liefern, verwenden Sie folgende Zeilen:private void designerFunction1_EvaluateFunction(object sender,EvaluateFunctionEventArgs e){e.ResultValue = (int.Parse(e.Parameter1.ToString()) +int.Parse(e.Parameter2.ToString()));}Die Abbildung zeigt die Verwendung einer individuellen Funktion Add im Formelassistentendes Designers.90


Arbeiten mit der .NET KomponenteZwei weitere Ereignisse erlauben Ihnen optional eine weitergehende Anpassung derFunktion. Über CheckFunctionSyntax können Sie eine Syntaxprüfung vornehmen. Hierkönnen Sie die Datentypen der Parameter überprüfen und beispielsweise sicherstellen,dass die Parameter in einem bestimmten Bereich liegen. Über ParameterAutoCompleteist es möglich, verschiedene Vorschlagswerte für das AutoComplete-Feature des Formelassistentenvorzugeben. Das sieht beispielsweise so aus:private void designerFunction1_ParameterAutoComplete(object sender,ParameterAutoCompleteEventArgs e){for(int i = 1; i


Arbeiten mit den KomponentenNach der Anlage können Sie die Eigenschaften des neuen Objekts festlegen. Die Tabellezeigt eine Übersicht.Eigenschaft Datentyp BeschreibungObjectname String Der eindeutige Name des Objekts. Dieser wirdintern als ID verwendet, dem Benutzer jedochnicht angezeigt.Description String Diese Beschreibung wird im Designer angezeigt.Sie darf Leerzeichen enthalten, sollte jedochnicht länger als 30 Zeichen lang sein.Icon Icon Das Icon des Objekts, das im Designer in derSymbolleiste und im Menü angezeigt wird. Essollte sich um ein 16x16 Pixel großes Icon mit 16Farben handeln.Die Komponente bietet Ihnen drei Ereignisse an. Zunächst wird bei der Anlage einesneuen Objekts durch den Benutzer das Ereignis CreateDesignerObject ausgelöst. Fallsgewünscht können Sie dem Benutzer hier einen Einstiegsdialog anzeigen. Dies kannbeispielsweise ein Assistent sein, der dem Benutzer die Konfiguration des neuen Objektsvereinfacht. Bietet sich die Verwendung im konkreten Fall nicht an, verzichten Sieeinfach auf die Behandlung des Ereignisses.Die folgenden Zeilen zeigen die Anzeige einer MessageBox sobald das neue Objekterstmals auf dem Arbeitsbereich platziert wird. Über die Ereignisargument erhalten SieZugriff auf das Fenster des Designers. Die übergebene Klasse unterstützt die SchnittstelleIWin32Window und kann somit als Parent für eine MessageBox oder ein anderesFenster verwendet werden.private void designerObject1_CreateDesignerObject(object sender,CreateDesignerObjectEventArgs e){MessageBox.Show(e.DesignerWindow, "Das neue Objekt wird nun angelegt.");}Das Ereignis EditDesignerObject wird ausgelöst, wenn der Benutzer doppelt auf das neueingefügte Objekt klickt oder aber den Eintrag "Eigenschaften" aus dem Kontextmenüwählt. Sie erhalten auch hier über die Ereignisargumente Zugriff auf das Designerfensterund können "über" diesem einen eigenen Dialog anzeigen.Im <strong>List</strong>ing sehen Sie die Anzeige eines Dateiauswahl-Dialoges. Hier kann eine Grafikausgesucht werden, die im Designer im Rahmen des neuen Objekttyps angezeigt werdensoll. Ein Doppelklick auf das Objekt zeigt den Dialog an.92


Arbeiten mit der .NET Komponenteprivate void designerObject1_EditDesignerObject(object sender,EditDesignerObjectEventArgs e){DesignerObject desobj = (DesignerObject) sender;OpenFileDialog dialog = new OpenFileDialog();dialog.Filter = "JPEG files (*.jpg)|*.jpg|All files (*.*)|*.*";if(desobj.ObjectProperties.Contains("imagefile"))dialog.FileName = desobj.ObjectProperties["imagefile"].ToString();if(dialog.ShowDialog(e.DesignerWindow) == DialogResult.OK){desobj.ObjectProperties["imagefile"] = dialog.FileName;e.HasChanged = true;}}Wählt der Benutzer eine Datei aus, so wird der Dateiname in einem Dictionary abgelegt.Dieses Dictionary (IDictionary) wird von der Komponente über die Eigenschaft ObjectPropertiesangeboten. Es ist wichtig, die Daten hier und nicht an anderer Stelle abzulegen,da diese innerhalb der Projektdatei abgespeichert werden (müssen). Hierzu wirddas Dictionary beim Speichern des Projekts im Designer serialisiert und beim Öffnenwieder deserialisiert. Es ist erforderlich, dass alle im Dictionary abgelegten Daten serialisierbarsind. Hierzu müssen diese zumindest mit dem Attribut Serializable versehenwerden. Die Standard-Wertetypen der Common Language Runtime (string, int und soweiter) sind bereits von Haus aus serialisierbar und können somit ohne weiteres verwendetwerden. Intern wird ein BinaryFormatter verwendet, dessen Ergebnis MIMEkodiertin der Projektdatei abgelegt wird.Haben Sie beziehungsweise der Benutzer innerhalb des EditDesignerObject-EreignissesÄnderungen am Objekt oder dessen Eigenschaften vorgenommen, müssen Sie <strong>List</strong> &<strong>Label</strong> dies mitteilen. Dies ist notwendig, damit gegebenenfalls beim Beenden des Designerseine Speichern-Abfrage angezeigt wird. Setzen Sie im Falle einer Änderung einfachdie Eigenschaft HasChanged der Ereignisargumente auf true.Nachdem der Benutzer das Objekt editiert hat, werden Sie von <strong>List</strong> & <strong>Label</strong> aufgefordert,das Objekt darzustellen. Es wird hierzu das Ereignis DrawDesignerObject ausgelöst.Über die Ereignisargumente erhalten Sie ein Graphics-Objekt sowie das Rechteck desObjekts. Sie können nun mit den bekannten Methoden der GDI+ im Arbeitsbereichzeichnen. Hierbei ist selbstverständlich auch der Zugriff auf die hinterlegten Objekteigenschaftenmöglich beziehungsweise sinnvoll. Das Beispiel zeigt die Darstellung derweiter oben ausgewählten Grafikdatei.private void designerObject1_DrawDesignerObject(object sender,DrawDesignerObjectEventArgs e){93


Arbeiten mit den KomponentenDesignerObject desobj = (DesignerObject) sender;if(desobj.ObjectProperties.Contains("imagefile")){string imagefile = desobj.ObjectProperties["imagefile"].ToString();e.Graphics.DrawImage(new Bitmap(imagefile), e.ClipRectangle);}}Hinweis: Anscheinend auf Grund einer unklaren Definition im .NET Framework müssenSie bei der Ausgabe von Text mittels Graphics.DrawString gegebenenfalls eine manuelleUmrechnungen der Schriftgröße durchführen. Das .NET Framework scheint intern in1/10 Inch zu rechnen. Sofern Sie in <strong>List</strong> & <strong>Label</strong> als metrische Einheit 1/10 Millimeterangegeben haben (Eigenschaft Units), müssen Sie die Größe manuell mit 2,54 multiplizieren:e.Graphics.DrawString("Hallo Welt", new Font("Arial", 20F * 2.54F),new SolidBrush(Color.Black), e.ClipRectangle);6.1.13. Weitere UnterschiedeDie folgenden Abschnitte zeigen eine Reihe von weiteren Unterschieden zwischen der<strong>List</strong> & <strong>Label</strong> .NET Komponente und den OCX- und VCL-Controls.6.1.13.1. Zugriff auf die <strong>List</strong> & <strong>Label</strong> API-Funktionen<strong>List</strong> & <strong>Label</strong> besteht im Kern aus einer ANSI-DLL mit einer API. Das Handbuch beschreibtdie verschiedenen zur Verfügung stehenden Möglichkeiten, die zu einem großen Teildurch korrespondierende Techniken der .NET Komponente umgesetzt werden. SofernSie jedoch einen weitergehenden Eingriff wünschen und beispielsweise eine eigeneDruckschleife realisieren wollen, benötigen Sie den vollen Umfang der <strong>List</strong> & <strong>Label</strong> API.Über die Eigenschaft Core der Komponente erhalten Sie Zugriff auf die Instanz einerspeziellen API-Klasse. Diese bietet die genannten Funktionen als Methoden an. DerAufruf erfolgt ohne Job-Handle und auf Basis der Standard .NET Datentypen. Davonabgesehen entsprechen die Aufrufe mehrheitlich der jeweiligen Beschreibung im Handbuch.Beispiel:LL.Core.LlPrintResetProjectState()6.1.13.2. LlSetPrinterInPrinterFileDie Methode LlSetPrinterInPrinterFile wird dazu benutzt, den zu verwendenden Druckerfür ein Projekt programmatisch festzulegen. Es kann hierzu eine DEVMODE-Struktur mit94


Arbeiten mit der VCL Komponenteden benötigten Informationen übergeben werden. Dank mehrerer Überladungen ist esbei der .NET Komponente zudem möglich, eine Instanz der Klasse PrinterSettings ausdem .NET Framework zuzuweisen.PrinterSettings settings = new PrinterSettings();settings.PrinterName = PrinterSettings.InstalledPrinters[0];LL.Core.LlSetPrinterInPrinterFile(LlProject.<strong>List</strong>,"c:\\test.lst", settings);6.2. Arbeiten mit der VCL KomponenteParallel zu der OCX-Komponente und dem .NET Assembly erhalten Sie mit <strong>List</strong> & <strong>Label</strong>die VCL-Komponente(n) für die Integration in die IDE von CodeGear. Das folgende Kapitelbezieht sich ausschließlich auf die Arbeit mit dieser Komponente. Wenn Sie nicht mitder VCL-Komponente arbeiten, können Sie diesen Abschnitt überspringen.6.2.1. Einbindung der KomponenteDie Einbindung erfolgt mit Hilfe eines Packages. Sollten Sie die mit einer Delphi Version< 6 arbeiten so verwenden Sie das Package <strong>combit</strong>13.dpk und bei einer Delphi-Version>= 6 verwenden Sie das Package l13delp6.dpk. Sie finden beide Dateien in Ihrem <strong>List</strong> &<strong>Label</strong> Installationsverzeichnis unterhalb von „..\Programmierbarae Beispiele und Deklarationen\Delphi“.Weitere Informationen zur Installation des Packages in Ihre IDE findenSie in der Onlinehilfe Ihrer Entwicklungsumgebung.Im Anschluss an die Installation des Packages werden automatisch mehrere Symbole imKomponentenbereich der Werkzeugleiste angelegt.Sie können nun beginnen, <strong>List</strong> & <strong>Label</strong> durch die angebotenen Eigenschaften individuellan Ihre Bedürfnisse anzupassen und die benötigte Programmlogik zu implementieren.Hierzu bieten sich drei unterschiedliche Ansätze an:• Datenbindung• Die einfachen Print- und Design-Methoden• Eine eigene, iterative DruckschleifeDie beiden erstgenannten Möglichkeiten werden nachfolgend vorgestellt. Der iterativeAnsatz entspricht weitgehend der direkten Verwendung der DLL und ist somit durch dieallgemeine Beschreibung der <strong>List</strong> & <strong>Label</strong> API abgedeckt.6.2.2. DatenbindungFür die Datenbindung mit Hilfe der <strong>List</strong> & <strong>Label</strong> VCL-Komponente existiert ein extra Control.Dieses erbt von der „normalen“ Komponente alle Eigenschaften und erweitert diese95


Arbeiten mit den Komponentenum die Möglichkeiten zur direkten Datenbindung. Über die Eigenschaft DataSource kannnun eine Datenquelle vom Typ TDataSource angegeben werden.6.2.2.1. Bindung von <strong>List</strong> & <strong>Label</strong> an eine DatenquelleDie Datenbindung erfolgt über die Eigenschaft DataSource. Sie können diese programmatischzuweisen oder aber alternativ über das Eigenschaftsfenster in Ihrer IDE. HabenSie hier bereits eine DataSource in Ihrem Formular angelegt, so können Sie dies überdas Eigenschaftsfenster auswählen. Die notwendige Verknüpfung wird automatischerzeugt.Sie können nun den Programmcode zum Start des Designs und Drucks implementieren.Nehmen Sie hierzu beispielsweise im Click-Ereignis eines neuen Buttons den MethodenaufrufPrint bzw. Design ohne zusätzliche Parameter auf. Die Daten der zugewiesenenQuelle werden automatisch zur Verfügung gestellt.// Designer anzeigenDBL13_1.AutoDesign('Invoice');// Druck durchführenDBL!13_1.AutoPrint('Invoice','');Sofern Sie den Standardablauf des datengebundenen Drucks modifizieren wollen, stehenIhnen eine Reihe von Eigenschaften zur Verfügung. Diese beginnen mit Auto… undsind im Daten-Bereich des Eigenschaftsfensters zu finden.EigenschaftAutoDesignerFileAutoDestinationAutoProjectTypeAutoFileAlsoNewAutoShowPrintOptionsAutoShowSelectFileAutoBoxTypeBeschreibungDateiname des zu verwendenden DruckprojektsDruckformat, zum Beispiel Drucker, Vorschau, PDF, HTMLund so weiterTyp des Druck-Projekts (<strong>List</strong>e, Karteikarte, Etikett)Projektneuanlage bei Designeraufruf möglichAnzeige der Druckoptionen beim DruckstartAnzeige des Dateiauswahl-Dialoges bei Druck und DesignerArt der Fortschrittsbox96


Arbeiten mit der VCL Komponente6.2.2.2. Arbeiten mit Master-Detail-DatensätzenIn Verbindung mit der Datenbindung und <strong>List</strong>enprojekten kann <strong>List</strong> & <strong>Label</strong> automatischvorhandene Relationen zwischen mehreren Tabellen auswerten und übernehmen.Die Art der Datenübergabe wird mithilfe der Eigenschaft AutoMasterMode festgelegt.Die zugrundeliegende Enumeration stellt folgende Werte zur Verfügung:• None: Es werden keine Master-Detail-Relationen ausgewertet• AsFields: Master- und Detaildaten werden parallel als Felder angemeldet. Es lassensich dadurch Gruppierungen, Statistiken und Übersichten realisieren.• AsVariables: Die Masterdaten werden als Variablen, die Detaildaten als Felder angemeldet.Nach jedem Masterdatensatz wird das Projekt intern mittels LlPrintResetProjectStatezurückgesetzt. Auf diese Weise lassen sich mehrere identische Reportsmit unterschiedlichen Daten hintereinander in einem Job drucken, zum Beispielmehrere Rechnungen.Bitte beachten Sie auch die mitgelieferten Beispiele zur Datenbindung.6.2.2.3. Weitere Möglichkeiten der DatenbindungDie Datenbindung der Komponente stellt Ihnen vier unterschiedliche Ereignisse zurVerfügung, mithilfe derer Sie den Ablauf beeinflussen können. Die Tabelle zeigt eineÜbersicht.EreignisAutoDefineNewPageAutoDefineNewLineAutoDefineVariableAutoDefineFieldAutoDefineTableBeschreibungDas Ereignis wird für jede neue Seite aufgerufen und erlaubtdie Anmeldung von zusätzlichen Variablen für diese Seite.Die Eigenschaft IsDesignMode der Ereignisargumente gibtan, ob es sich um den Design-Modus handelt.Dieses Ereignis wird für jede neue Zeile vor der automatischenAnmeldung der datengebundenen Felder aufgerufen.Analog zu AutoDefineNewPage können Sie hier zusätzlicheFelder anmelden.Für jede automatisch mittels Datenbindung angelegte Variablewird dieses Ereignis aufgerufen. Über die EigenschaftenName und Value der Ereignisargumente können Sie denNamen sowie den Inhalt jeder einzelnen Variable individuellvor der Übergabe an die Druckengine manipulieren.Analog zu AutoDefineVariable für FelderDieses Ereignis wird für jede Tabelle aufgerufen, die überLlDbAddTable() angemeldet wird. Sie können z.B. den Na-97


Arbeiten mit den KomponentenAutoDefineTableSortOrdermen ändern oder die Übergabe unterdrücken.Dieses Ereignis wird für jede Sortierung aufgerufen, die überLlDbAddTableSortOrder() angemeldet wird. Sie können z.B.den Namen ändern oder die Übergabe unterdrücken.AutoDefineTableRelation Dieses Ereignis wird für jede DataRelation aufgerufen, dieüber LlDbAddTableRelation() angemeldet wird. Sie könnenz.B. den Namen ändern oder die Übergabe unterdrücken.6.2.3. Einfache Print- und Design-MethodenDie Print- und Design-Methoden der VCL- Komponente wurden analog zu den korrespondierendenOCX- und .NET-Controls realisiert. Die Methoden implementieren einestandardisierte Druckschleife, die für den Großteil der einfacheren Anwendungen direktverwendbar ist, wenn Sie die Daten nicht per DataBinding übergeben. Die Daten werdenbei diesem Ansatz innerhalb der Ereignisse DefineVariables und DefineFields an <strong>List</strong> &<strong>Label</strong> übergeben. Auf diese Weise können beliebige Datenquellen individuell angebundenwerden. Die Ereignisargumente erlauben den Zugriff auf nützliche Informationenwie die übergebenen Benutzerdaten, den Design-Mode und so weiter. Über die EigenschaftIsLastRecord wird der Druckschleife mitgeteilt, dass der letzte Datensatz erreichtwurde. Solange dies nicht der Fall ist, wird das jeweilige Ereignis wiederholt aufgerufen,um die Daten abzufragen.Zusätzliche Optionen lassen sich im Ereignis LLSetPrintOptions festlegen. Intern wirddieses Ereignis nach dem Aufruf von LlPrintWithBoxStart aber vor dem eigentlichenDruck ausgelöst.Eine sehr einfache Verwendung der Methode Print sieht wie folgt aus:procedure TForm1.LLDefineVariables(Sender: TObject; UserData: Integer;IsDesignMode: Boolean; var Percentage: Integer;var IsLastRecord: Boolean; var EventResult: Integer);vari: integer;beginFor i:= 0 to (DataSource.FieldCount-1) dobeginLL.LlDefineVariableFromTField(DataSource.Fields[i]);end;if not IsDesignMode thenbeginPercentage:=Round(DataSource.RecNo/DataSource.RecordCount*100);DataSource.Next;if DataSource.EOF=True then IsLastRecord:=true;end;end;98


Arbeiten mit der VCL Komponente6.2.3.1. Verwendung des UserData-ParametersDie Methoden Print und Design erlauben die Übergabe eines Parameters UserData vomTyp integer. Mithilfe dieses Parameters können Sie in den Ereignis verschiedene Datenfür <strong>List</strong> & <strong>Label</strong> bereitstellen. So wäre es z.B. möglich in den Events anhand des Parameterssowohl Daten für den Rechnungsdruck als auch für eine Kundenliste bereit zu stellen.6.2.4. Übergabe von ungebundenen Variablen und FeldernDie Übergabe von Variablen und Feldern entspricht dem regulären Prinzip von <strong>List</strong> &<strong>Label</strong>. Für die Anmeldung stehen drei „API-Varianten“ zur Verfügung.APILlDefineVariable()LlDefineVariableExt()BeschreibungDefiniert eine Variable vom Typ LL_TEXT und derenInhalt.Wie oben und zusätzlich kann der <strong>List</strong> & <strong>Label</strong> Datentypmit übergeben werden.LlDefineVariableExtHandle() Wie oben, wobei der Inhalt nun ein Handle sein muss.Ein Beispiel für die Anmeldung einer Variable vom Typ Text sieht folgendermaßen aus:LL.LlDefineVariableExt(´MeineVariable’, ´Inhalt’, LL_TEXT);Sie finden die Konstanten für die <strong>List</strong> & <strong>Label</strong> Datentypen in der Unit cmbtll13.pas inIhrem <strong>List</strong> & <strong>Label</strong> Installationsverzeichnis wieder.6.2.4.1. BilderUm Bilder zu übergeben, die als Datei auf dem System vorhanden sind, verwenden SieLL.LlDefineVariableExt ('Picture', , LL_DRAWING);Die Übergabe von Grafiken im Speicher (nur für BMP, EMF) erfolgt mittels der API LlDefineVariableExtHandle().Um beispielsweise die Grafik als Bitmap oder Metafile darzustellen,verwenden Sie folgenden Aufruf:99


Arbeiten mit den KomponentenLL.LlDefineVariableExtHandle('Picture', BufferImage.picture.bitmap.handle,LL_DRAWING_HBITMAP);oderLL.LlDefineVariableExtHandle('Picture', BufferImage.picture.metafile.handle,LL_DRAWING_HEMETA);6.2.4.2. BarcodesDie Übergabe von Barcodes wird durch die Verwendung der Konstante LL_BARCODE...erreicht. Ein Beispiel für die Anmeldung einer Barcodevariable vom Typ EAN_13 siehtwie folgt aus:LL.LlDefineVariableExt('EAN13', '123456789012',LL_BARCODE_EAN13);6.2.5. Auswahl der SpracheDer <strong>List</strong> & <strong>Label</strong> Designer liegt in zahlreichen Sprachen vor. Die Komponente unterstütztSie somit intensiv bei der Realisierung von mehrsprachigen Desktop-Applikationen. Esgibt zwei Möglichkeiten, <strong>List</strong> & <strong>Label</strong> die zu verwendende Sprache mitzuteilen.5. Weisen Sie der Eigenschaft Language die entsprechende Sprache zu:LL.Language = ltDeutsch;6. Stellen Sie die Sprache direkt an der Komponente einHinweis: Bitte beachten Sie, dass Sie zur Anzeige der jeweiligen Sprache das entsprechendeLanguage Kit benötigen. Welche Kits wir derzeit anbieten und was diese kosten,erfahren Sie in unserem Online-Shop unter www.<strong>combit</strong>.net.6.2.6. Arbeiten mit Ereignissen<strong>List</strong> & <strong>Label</strong> bietet eine Vielzahl von Callbacks an, die bei der <strong>List</strong> & <strong>Label</strong> VCL Komponenteals Ereignisse implementiert wurden.Eine Umfangreiche Beschreibung der zur Verfügung stehenden Events finden Sie in dermitgelieferten Onlinehilfe zur VCL-Komponente.100


Arbeiten mit der VCL Komponente6.2.7. Anzeigen einer VorschaudateiFür die VCL existiert ein VCL-Vorschaucontrol. Dieses bietet spezialisierte Möglichkeitenzur Verwendung des <strong>List</strong> & <strong>Label</strong> Vorschauformates. Es ist z.B. möglich aus dem Controlheraus einen PDF-Export zu starten. Zusätzlich kann das Control an die eigenen Bedürfnisseangepasst werden, indem Toolbar-Buttons über Eigenschaften des Controls ausbzw.eingeblendet werden können. Es ist auch möglich auf die Click-Ereignisse derButtons zu reagieren und evtl. eigene Behandlungsroutinen zu hinterlegen.Die Abbildung zeigt das Control im Einsatz.6.2.8. Arbeiten mit Vorschau-DateienDie <strong>List</strong> & <strong>Label</strong> Storage-API erlaubt den Zugriff auf die LL-Vorschaudateien. Sie könnenallgemeine Informationen oder die einzelnen Seiten abfragen, mehrere Dateien zusammenfügenund Benutzerdaten abspeichern. Zur Verwendung der Storage-API müssenSie die Unit cmbtls13.pas in Ihr Projekt einbinden.6.2.8.1. Öffnen einer VorschaudateiSie können die Vorschaudatei mit Hilfe der Funktion LlStgsysStorageOpen() öffnen. Übereine ganze Reihe von weiteren Funktionen stehen nun allgemeine Informationen überdie Datei zur Verfügung.101


Arbeiten mit den KomponentenBeispiel:varhStg: HLLSTG;beginhStg := LlStgsysStorageOpen('c:\test.ll','',False, False)end;6.2.8.2. Zusammenführen mehrer VorschaudateienSie können mehrere Vorschaudateien zusammenführen. Hierzu müssen Sie zunächst dieZieldatei öffnen. Da ein schreibender Zugriff notwendig ist, müssen Sie für den zweitenParameter ReadOnly "False" übergeben. Anschließend können Sie mit Hilfe der FunktionLlStgSysAppend() die Dateien zusammen führen.varhStgOrg, hStgAppend: HLLSTG;beginhStgOrg := LlStgsysStorageOpen('c:\test1.ll','',False, True);hStgAppend := LlStgsysStorageOpen('c:\test2.ll','',False, True);LlStgsysAppend(hStgOrg, hStgAppend);LlStgsysStorageClose(hStgOrg);LlStgsysStorageClose(hStgAppend);end;6.2.8.3. DebuggingDas Debugging der VCL-Komponente können Sie entweder direkt an der Komponenteaktivieren, indem Sie die Eigenschaft DebugMode auf „1“ setzen, oder aber im Quellcodeüber z.B.:LL.DebugMode := 1;Weitere Informationen über das Debugtool Debwin2 finden Sie im entsprechendenKapitel.6.2.9. Erweiterung des Designers<strong>List</strong> & <strong>Label</strong> bietet vielfältige Möglichkeiten, den Designer zu erweitern. Hierzu zählenunter anderem die verschiedenen Ereignisse der Komponente die beispielsweise einenEingriff in das Menü und die angebotenen Funktionen erlauben. Doch die Möglichkeitengehen noch weiter.102


Arbeiten mit der VCL Komponente6.2.9.1. Hinzufügen von Designer-FunktionenEine der wichtigsten und mächtigsten Möglichkeiten des Designers sind der Formelassistentund die dort angebotenen Funktionen. Mit Hilfe einer speziellen <strong>List</strong> & <strong>Label</strong>Komponente für die VCL ist es zudem möglich, ganz individuelle Funktionen in den Designereinzubinden.Zum Hinzufügen einer neuen Funktion fügen Sie zur Designzeit diese Komponente aufeinem Formular ein. Im Eigenschaftsfenster dieser Komponente können Sie nun dienotwendigen Parameter einstellen.EigenschaftNameDescriptionGroupNameVisibleBeschreibungDer eindeutige Name der DesignerfunktionEine zusätzliche Beschreibung der Funktion für den FormelassistentenDie Gruppe in der die Funktion im Formelassistenten angezeigtwirdGibt an, ob die Funktion im Assistenten angezeigt wird odernichtMinimumParameters Die minimale Anzahl von Parametern. Gültig sind Werte zwischen0 und 4.MaximumParameters Die maximale Anzahl von Parametern. Gültig sind auch hierWerte zwischen 0 und 4. Der Wert muss gleich oder größer der103


Arbeiten mit den Komponentenminimalen Anzahl sein. Eine größere Anzahl ergibt optionaleParameter.Parameter1 – 4TypeDescriptionResultTypeJeder der bis zu vier Parameter kann individuell konfiguriertwerden.Der Datentyp des ParametersEine Beschreibung des Parameters für die Tooltip-Hilfe im DesignerDer Datentyp des RückgabewertsMithilfe der Eigenschaften können Sie die neue Designerfunktion individuell einstellen.Um die Funktion schließlich zum Leben zu erwecken, müssen Sie das Ereignis OnEvaluateFunctionbehandeln. Über die Ereignisargumente erhalten Sie Zugriff auf die vomBenutzer eingegebenen Parameter. Um beispielsweise die römische Ziffer zurück zuliefern, verwenden Sie folgende Zeilen:procedure TDesExtForm.RomanNumberEvaluateFunction(Sender: TObject;var ResultType: TLl13XFunctionParameterType; var ResultValue: OleVariant;var DecimalPositions: Integer; const ParameterCount: Integer;const Parameter1, Parameter2, Parameter3, Parameter4: OleVariant);beginResultValue:=ToRoman(Parameter1);end;Die Abbildung zeigt die Verwendung einer individuellen Funktion RomanNumber imFormelassistenten des Designers.104


Arbeiten mit der VCL KomponenteZwei weitere Ereignisse erlauben Ihnen optional eine weitergehende Anpassung derFunktion. Über OnCheckFunctionSyntax können Sie eine Syntaxprüfung vornehmen.Hier können Sie die Datentypen der Parameter überprüfen und beispielsweise sicherstellen,dass die Parameter in einem bestimmten Bereich liegen. Über OnParameterAuto-Complete ist es möglich, verschiedene Vorschlagswerte für das AutoComplete-Featuredes Formelassistenten vorzugeben.6.2.9.2. Hinzufügen von Designer-ObjektenAnalog zur Erweiterung der Designer-Funktionen können Sie auch eigene Objektartendefinieren und an <strong>List</strong> & <strong>Label</strong> anmelden. Die neuen Objekte stehen dem Benutzer anschließendin gewohnter Weise über die Symbolleiste links und das Menü zur Verfügung.Zum Hinzufügen steht Ihnen auch hier eine spezielle Komponente zur Verfügung.105


Arbeiten mit den KomponentenNach dem Hinzufügen dieser Komponente zu Ihrem Formular können Sie die Eigenschaftendes neuen Objekts im Eigenschaftsfenster der Komponente festlegen. DieTabelle zeigt eine Übersicht.EigenschaftNameDescriptionIconBeschreibungDer eindeutige Name des ObjektsDiese Beschreibung wird im Designer angezeigt. Sie darf Leerzeichenenthalten, sollte jedoch nicht länger als 30 Zeichenlang sein.Das Icon des Objekts, das im Designer in der Symbolleisteund im Menü angezeigt wird. Es sollte sich um ein 16x16 Pixelgroßes Icon handeln.Die Komponente bietet Ihnen drei Ereignisse an. Zunächst wird bei der Anlage einesneuen Objekts durch den Benutzer das Ereignis OnInitialCreation ausgelöst. Falls gewünschtkönnen Sie dem Benutzer hier einen Einstiegsdialog anzeigen. Dies kann beispielsweiseein Assistent sein, der dem Benutzer die Konfiguration des neuen Objektsvereinfacht. Bietet sich die Verwendung im konkreten Fall nicht an, verzichten Sie einfachauf die Behandlung des Ereignisses.106


Arbeiten mit der OCX KomponenteDie folgenden Zeilen initialisieren das Objekt sobald das neue Objekt erstmals auf demArbeitsbereich platziert wird.procedure TDesExtForm.GradientFillObjectInitialCreation(Sender: TObject;ParentHandle: Cardinal);beginwith Sender as TLl13XObject dobeginProperties.AddProperty('Color1', '255');Properties.AddProperty('Color2', '65280');end;end;Das Ereignis OnEdit wird ausgelöst, wenn der Benutzer doppelt auf das neu eingefügteObjekt klickt oder aber den Eintrag "Eigenschaften" aus dem Kontextmenü wählt.Nachdem der Benutzer das Objekt editiert hat, werden Sie von <strong>List</strong> & <strong>Label</strong> aufgefordert,das Objekt darzustellen. Es wird hierzu das Ereignis OnDraw ausgelöst. Über die Ereignisargumenteerhalten Sie einen TCanvas sowie ein TRect des Objekts. Sie können nunmit den bekannten Methoden im Arbeitsbereich zeichnen. Hierbei ist selbstverständlichauch der Zugriff auf die hinterlegten Objekteigenschaften möglich beziehungsweisesinnvoll.6.3. Arbeiten mit der OCX KomponenteParallel zu der VCL-Komponente und dem .NET Assembly erhalten Sie mit <strong>List</strong> & <strong>Label</strong>die OCX-Komponente(n) für die Integration in Ihre IDE. Das folgende Kapitel bezieht sichausschließlich auf die Arbeit mit dieser Komponente. Wenn Sie nicht mit der OCX-Komponente arbeiten, können Sie diesen Abschnitt überspringen.6.3.1. Einbindung der KomponenteDie Einbindung erfolgt mit Hilfe der Datei cmll13o.ocx, die das Control beinhaltet. DieseDatei finden Sie im Verzeichnis "Redistributierbare Dateien". Weitere Informationen zurInstallation des OCX in Ihre IDE finden Sie in der Onlinehilfe Ihrer Entwicklungsumgebung.Im Anschluss an die Einbindung des Controls sollte automatisch ein Symbol im Komponentenbereichder Werkzeugleiste bzw. Toolbox Ihrer IDE angelegt sein.107


Arbeiten mit den KomponentenSie können nun beginnen, <strong>List</strong> & <strong>Label</strong> durch die angebotenen Eigenschaften individuellan Ihre Bedürfnisse anzupassen und die benötigte Programmlogik zu implementieren.Hierzu bieten sich zwei unterschiedliche Ansätze an:• Die einfachen Print- und Design-Methoden• Eine eigene, iterative DruckschleifeDie erstgenannte Möglichkeit wird nachfolgend vorgestellt. Der iterative Ansatz entsprichtweitgehend der direkten Verwendung der DLL und ist somit durch die allgemeineBeschreibung der <strong>List</strong> & <strong>Label</strong> API abgedeckt.6.3.2. Einfache Print- und Design-MethodenDie Print- und Design-Methoden des OCX-Controls wurden analog zu den korrespondierendenVCL- und .NET-Controls realisiert. Die Methoden implementieren eine standardisierteDruckschleife, die für den Großteil der einfacheren Anwendungen direkt verwendbarist, wenn Sie die Daten nicht per DataBinding übergeben. Die Daten werden beidiesem Ansatz innerhalb der Ereignisse CmndDefineVariables und CmndDefineFields an<strong>List</strong> & <strong>Label</strong> übergeben. Auf diese Weise können beliebige Datenquellen individuell angebundenwerden. Die Ereignisargumente erlauben den Zugriff auf nützliche Informationenwie die übergebenen Benutzerdaten, den Design-Mode und so weiter. Über dieEigenschaft pbLastRecord wird der Druckschleife mitgeteilt, dass der letzte Datensatzerreicht wurde. Solange dies nicht der Fall ist, wird das jeweilige Ereignis wiederholtaufgerufen, um die Daten abzufragen.Zusätzliche Optionen lassen sich im Ereignis CmndSetPrintOptions festlegen. Internwird dieses Ereignis nach dem Aufruf von LlPrintWithBoxStart aber vor dem eigentlichenDruck ausgelöst.Eine sehr einfache Verwendung der Methode Print sieht wie folgt aus:Private Sub <strong>List</strong><strong>Label</strong>1_CmndDefineVariables(ByVal nUserData As Long, ByVal bDummyAs Long, pnProgressInPerc As Long, pbLastRecord As Long)Dim i As IntegerFor i = 0 To Recordset.Fields.Count - 1108Select Recordset.Fields(i).TypeCase 3, 4, 6, 7: para = LL_NUMERIC: content$ = Recordset.Fields(i)Case 8: para = LL_DATE_MS: a! = CDate(Recordset.Fields(i)): content$ = a!:Case 1: para = LL_BOOLEAN: content$ = Recordset.Fields(i)Case Else: para = LL_TEXT: content$ = Recordset.Fields(i)End SelectnRet = LL.LlDefineVariableExt(Recordset.Fields(i).Name, content$, para)Next iIf bDummy = 0 Then


Arbeiten mit der OCX KomponentepnProgressInPerc = Form1.Data1.Recordset.PercentPositionRecordset.MoveNextEnd IfEnd Sub6.3.2.1. Verwendung des UserData-ParametersDie Methoden Print und Design erlauben die Übergabe eines Parameters UserData vomTyp integer. Mithilfe dieses Parameters können Sie in den Ereignis verschiedene Datenfür <strong>List</strong> & <strong>Label</strong> bereitstellen. So wäre es z.B. möglich in den Events anhand des Parameterssowohl Daten für den Rechnungsdruck als auch für eine Kundenliste bereit zu stellen.6.3.3. Übergabe von ungebundenen Variablen und FeldernDie Übergabe von Variablen und Feldern entspricht dem regulären Prinzip von <strong>List</strong> &<strong>Label</strong>. Für die Anmeldung stehen drei „API-Varianten“ zur Verfügung.APILlDefineVariableLlDefineVariableExtLlDefineVariableExtHandleBeschreibungDefiniert eine Variable vom Typ LL_TEXT und derenInhalt.Wie oben und zusätzlich kann der <strong>List</strong> & <strong>Label</strong> Datentypmit übergeben werden.Wie oben, wobei der Inhalt nun ein Handle sein muss.Ein Beispiel für die Anmeldung einer Variable vom Typ Text sieht folgendermaßen aus:LL.LlDefineVariableExt("MeineVariable", "Inhalt", LL_TEXT)Sie finden die Konstanten für die <strong>List</strong> & <strong>Label</strong> Datentypen in der Unit cmll13.bas (VB) inIhrem <strong>List</strong> & <strong>Label</strong> Installationsverzeichnis wieder.6.3.3.1. BilderUm Bilder zu übergeben, die als Datei auf dem System vorhanden sind, verwenden SieLL.LlDefineVariableExt ("Picture", , LL_DRAWING)Die Übergabe von Grafiken erfolgt mittels der „API-Variante“ LlDefineVariableExtHandle().Weitere Informationen zu dieser Funktion finden Sie im Kapitel „Beschreibung derAPI-Funktionen“.109


Arbeiten mit den Komponenten6.3.3.2. BarcodesDie Übergabe von Barcodes wird durch die Verwendung der Konstante LL_BARCODE...erreicht. Ein Beispiel für die Anmeldung einer Barcodevariable vom Typ EAN_13 siehtwie folgt aus:LL.LlDefineVariableExt('EAN13', '123456789012',LL_BARCODE_EAN13);6.3.4. Auswahl der SpracheDer <strong>List</strong> & <strong>Label</strong> Designer liegt in zahlreichen Sprachen vor. Die Komponente unterstütztSie somit intensiv bei der Realisierung von mehrsprachigen Desktop-Applikationen. Esgibt zwei Möglichkeiten, <strong>List</strong> & <strong>Label</strong> die zu verwendende Sprache mitzuteilen.• Weisen Sie der Eigenschaft Language die entsprechende Sprache zu:LL.Language = CMBTLANG_GERMAN• Stellen Sie die Sprache direkt an der Komponente einHinweis: Bitte beachten Sie, dass Sie zur Anzeige der jeweiligen Sprache das entsprechendeLanguage Kit benötigen. Welche Kits wir derzeit anbieten und was diese kosten,erfahren Sie in unserem Online-Shop unter www.<strong>combit</strong>.net.6.3.5. Arbeiten mit Ereignissen<strong>List</strong> & <strong>Label</strong> bietet eine Vielzahl von Callbacks an, die bei der <strong>List</strong> & <strong>Label</strong> OCX-Komponente als Events implementiert wurden.Eine Umfangreiche Beschreibung der zur Verfügung stehenden Events finden Sie in dermitgelieferten Onlinehilfe zur OCX-Komponente.6.3.6. Anzeigen einer VorschaudateiFür das OCX existiert ein Vorschaucontrol. Um dieses Control nutzen zu können, müssenSie die Datei cmll13v.ocx in Ihre Die einbinden. Es bietet spezialisierte Möglichkeitenzur Verwendung des <strong>List</strong> & <strong>Label</strong> Vorschauformates. Es ist z.B. möglich aus demControl heraus einen PDF-Export zu starten. Zusätzlich kann das Control an die eigenenBedürfnisse angepasst werden, indem Toolbar-Buttons über Eigenschaften des Controlsaus- bzw. eingeblendet werden können. Es ist auch möglich auf die Click-Ereignisse derButtons zu reagieren und evtl. eigene Behandlungsroutinen zu hinterlegen.110


Arbeiten mit der OCX KomponenteDie Abbildung zeigt das Control im Einsatz.6.3.7. Arbeiten mit Vorschau-DateienDie <strong>List</strong> & <strong>Label</strong> Storage-API erlaubt den Zugriff auf die LL-Vorschaudateien. Sie könnenallgemeine Informationen oder die einzelnen Seiten abfragen, mehrere Dateien zusammenfügenund Benutzerdaten abspeichern. Zur Verwendung der Storage-API müssenSie die Unit cmls13.bas in Ihr Projekt aufnehmen.6.3.7.1. Öffnen einer VorschaudateiSie können die Vorschaudatei mit Hilfe der Funktion LlStgsysStorageOpen() öffnen. Übereine ganze Reihe von weiteren Funktionen stehen nun allgemeine Informationen überdie Datei zur Verfügung.Beispiel:Dim hStgOrg As LonghStgOrg = LL.LlStgsysStorageOpen("C:\Test.ll", "", False, True)6.3.7.2. Zusammenführen mehrer VorschaudateienSie können mehrere Vorschaudateien zusammenführen. Hierzu müssen Sie zunächst dieZieldatei öffnen. Da ein schreibender Zugriff notwendig ist, müssen Sie für den zweiten111


Arbeiten mit den KomponentenParameter ReadOnly false übergeben. Anschließend können Sie mit Hilfe der FunktionLlStgSysAppend() die Dateien zusammen führen.Dim hStgOrg As LongDim hStgAppend As LonghStgOrg = LL.LlStgsysStorageOpen("C:\Test1.ll", "", False, True)hStgAppend = LL.LlStgsysStorageOpen("C:\Test2.ll", "", False, True)LL.LlStgsysAppend hStgOrg, hStgAppendLL.LlStgsysStorageClose hStgOrgLL.LlStgsysStorageClose hStgAppend6.3.7.3. DebuggingDas Debugging der OCX-Komponente können Sie aktivieren, indem Sie die EigenschaftDebugMode im Quellcode auf „1“ setzen, z.B.:LL.LlSetDebug = 1Weitere Informationen über das Debugtool Debwin2 finden Sie im entsprechendenKapitel.6.3.8. Erweiterung des Designers<strong>List</strong> & <strong>Label</strong> bietet vielfältige Möglichkeiten, den Designer zu erweitern. Hierzu zählenunter anderem die verschiedenen Ereignisse der Komponente die beispielsweise einenEingriff in das Menü und die angebotenen Funktionen erlauben. Doch die Möglichkeitengehen noch weiter…6.3.8.1. Hinzufügen von Designer-FunktionenEine der wichtigsten und mächtigsten Möglichkeiten des Designers sind der Formelassistentund die dort angebotenen Funktionen. Mit Hilfe einer speziellen <strong>List</strong> & <strong>Label</strong>Komponente für das OCX ist es zudem möglich, ganz individuelle Funktionen in denDesigner einzubinden. Um das Control verwenden zu können, müssen Sie die Dateicmll13fx.ocx in Ihre IDE einbinden.Zum Hinzufügen einer neuen Funktion fügen Sie zur Designzeit diese Komponente aufeinem Formular ein. Im Eigenschaftsfenster dieser Komponente können Sie nun dienotwendigen Parameter einstellen.112


Arbeiten mit der OCX KomponenteEigenschaftNameDescriptionGroupNameVisibleBeschreibungDer eindeutige Name der DesignerfunktionEine zusätzliche Beschreibung der Funktion für den FormelassistentenDie Gruppe in der die Funktion im Formelassistenten angezeigtwirdGibt an, ob die Funktion im Assistenten angezeigt wird odernichtMinimumParameters Die minimale Anzahl von Parametern. Gültig sind Werte zwischen0 und 4.MaximumParameters Die maximale Anzahl von Parametern. Gültig sind auch hierWerte zwischen 0 und 4. Der Wert muss gleich oder größer derminimalen Anzahl sein. Eine größere Anzahl ergibt optionaleParameter.ResultTypeDer Datentyp des RückgabewertsMithilfe der Eigenschaften können Sie die neue Designerfunktion individuell einstellen.Die Parameter für die Designerfunktionen werden im Quellcode festgelegt. Dies kannwie folgt aussehen:113


Arbeiten mit den KomponentenPrivate Sub InitializeDesFunction()Dim param1 As DesignerFunctionsParameterDim param2 As DesignerFunctionsParameterSet param1 = DesFunc_Add.Parameter1param1.Description = "First Value"param1.Type = LlParamType.ParamType_DoubleSet param2 = DesFunc_Add.Parameter2param2.Description = "Second Value"param2.Type = LlParamType.ParamType_DoubleDesFunc_Add.ParentComponent = <strong>List</strong><strong>Label</strong>1End SubUm die Funktion schließlich zum Leben zu erwecken, müssen Sie das Ereignis Des-Func_Add_EvaluateFunction behandeln. Über die Ereignisargumente erhalten Sie Zugriffauf die vom Benutzer eingegebenen Parameter. Um beispielsweise die Summe derbeiden Parameter zurück zu liefern, verwenden Sie folgende Zeilen:Private Sub DesFunc_Add_EvaluateFunction(ResultValue As Variant, ResultType AsCMLL13FXLibCtl.LlParamType, DecimalPositions As Long, ByVal Parameters As Long,ByVal Parameter1 As Variant, ByVal Parameter2 As Variant, ByVal Parameter3 AsVariant, ByVal Parameter4 As Variant)ResultValue = CDbl(Parameter1) + CDbl(Parameter2)ResultType = ParamType_DoubleEnd SubDie Abbildung zeigt die Verwendung einer individuellen Funktion Add im Formelassistentendes Designers.114


Arbeiten mit der OCX KomponenteZwei weitere Ereignisse erlauben Ihnen optional eine weitergehende Anpassung derFunktion. Über DesFunc_Add_CheckFunctionSyntax können Sie eine Syntaxprüfungvornehmen. Hier können Sie die Datentypen der Parameter überprüfen und beispielsweisesicherstellen, dass die Parameter in einem bestimmten Bereich liegen. Über Des-Func_Add_ParameterAutoComplete ist es möglich, verschiedene Vorschlagswerte fürdas AutoComplete-Feature des Formelassistenten vorzugeben.6.3.8.2. Hinzufügen von Designer-ObjektenAnalog zur Erweiterung der Designer-Funktionen können Sie auch eigene Objektartendefinieren und an <strong>List</strong> & <strong>Label</strong> anmelden. Die neuen Objekte stehen dem Benutzer anschließendin gewohnter Weise über die Symbolleiste links und das Menü zur Verfügung.Zum Hinzufügen steht Ihnen auch hier eine spezielle Komponente zur Verfügung. Umdiese nutzen zu können, müssen Sie die Datei cmll13ox.ocx in Ihre IDE einbinden.115


Arbeiten mit den KomponentenNach dem Hinzufügen dieser Komponente zu Ihrem Formular können Sie die Eigenschaftendes neuen Objekts im Eigenschaftsfenster der Komponente festlegen. DieTabelle zeigt eine Übersicht.EigenschaftNameDescriptionIconBeschreibungDer eindeutige Name des ObjektsDiese Beschreibung wird im Designer angezeigt. Sie darf Leerzeichenenthalten, sollte jedoch nicht länger als 30 Zeichenlang sein.Das Icon des Objekts, das im Designer in der Symbolleisteund im Menü angezeigt wird. Es sollte sich um ein 16x16 Pixelgroßes Icon handeln.Die Komponente bietet Ihnen drei Ereignisse an. Zunächst wird bei der Anlage einesneuen Objekts durch den Benutzer das Ereignis DesObj_Picture_CreateDesignerObjectausgelöst. Falls gewünscht können Sie dem Benutzer hier einen Einstiegsdialog anzeigen.Dies kann beispielsweise ein Assistent sein, der dem Benutzer die Konfigurationdes neuen Objekts vereinfacht. Bietet sich die Verwendung im konkreten Fall nicht an,verzichten Sie einfach auf die Behandlung des Ereignisses.116


Arbeiten mit der OCX KomponenteDas Ereignis DesObj_Picture_EditDesignerObject wird ausgelöst, wenn der Benutzerdoppelt auf das neu eingefügte Objekt klickt oder aber den Eintrag "Eigenschaften" ausdem Kontextmenü wählt.Nachdem der Benutzer das Objekt editiert hat, werden Sie von <strong>List</strong> & <strong>Label</strong> aufgefordert,das Objekt darzustellen. Es wird hierzu das Ereignis DesObj_Picture_DrawDesignerObjectausgelöst. Sie können nun mit den bekannten Methodenim Arbeitsbereich zeichnen. Hierbei ist selbstverständlich auch der Zugriff auf diehinterlegten Objekteigenschaften möglich beziehungsweise sinnvoll.117


Programmierschnittstelle7. Programmierschnittstelle7.1. Dynamic Link Libraries7.1.1. FunktionsprinzipEine DLL (Dynamic Link Library, auch Dynamic Library oder Dynalink Library) ist eineFunktionsbibliothek, d.h. eine Ansammlung von Routinen in einer Datei, von der beiBedarf Teile durch den Windows-Kernel nachgeladen werden. Der Großteil aller Windows-API-Funktionenbefindet sich in DLLs, wie beispielsweise KERNEL32.DLL,USER32.DLL, GDI32.DLL und viele mehr (DLLs müssen nicht die Dateiendung ´DLL´besitzen!) - auch die Spracherweiterung von <strong>List</strong> & <strong>Label</strong> basiert auf solchen DLLs mitder Endung ".LNG".Das DLL-Prinzip ermöglicht es, dass mehrere Programme auf die in der DLL enthaltenenFunktionen zurückgreifen können, die DLL aber nur einmal im Speicher vorhanden ist.Dieses spart Speicherplatz, der eine der wichtigsten Systemressourcen ist. Ein weitererVorteil ist die einfache Update-Möglichkeit: wenn es eine verbesserte DLL gibt, wird diealte Version durch die neue ersetzt, und alle darauf zugreifenden Programme arbeitendann automatisch mit der neuen, ohne neu übersetzt werden zu müssen.Natürlich können DLLs auch auf die Funktionen anderer DLLs zurückgreifen, wie das inWindows ständig geschieht.<strong>List</strong> & <strong>Label</strong> verwendet wiederum mehrere DLLs, die für spezifische Aufgaben verwendetwerden.7.1.2. Installation einer DLLInfolge dieser Art der Einbindung muss Windows in der Lage sein, die DLL selbsttätigzu finden und zu laden. Hierzu muss sie im Windows-Pfad, Windows-System-Pfad,dem Programmpfad oder auf einem beliebigen Pfad, der sich in dem Systemsuchpfadbefindet, vorhanden sein.Das gleiche gilt natürlich für die von <strong>List</strong> & <strong>Label</strong> verwendeten DLLs.Auf jedem Rechner, auf dem die Endapplikation installiert wird, muss auch die DLL ineinem der oben angesprochenen Verzeichnisse vorhanden sein!Die <strong>List</strong> & <strong>Label</strong>-DLL und ihre benutzen Module können unter Windows zur Side-by-Side-Benutzung bei Ihrer Applikation installiert werden (unterstützte Windows-Versionensiehe 1.3.1. Systemvoraussetzung).118


Dynamic Link Libraries7.1.3. Einbindung der DLL-RoutinenRoutinen aus DLLs können einfach aus vielen Programmiersprachen heraus aufgerufenwerden, sei es nun aus C, C++, Delphi, Visual Basic, VBA, Gupta SQL-Windows undanderen mehr.Damit diese Aufrufe in einem Programm nicht zu einer Fehlermeldung des Linkers führen,müssen diese Funktionen dem Linker, Compiler oder Interpreter bekannt gemacht,d.h. deklariert werden.Hier unterscheiden sich prinzipbedingt die verschiedenen Sprachen wie C, Delphi undVisual Basic. Extremfälle sind Makrosprachen wie Excel, in denen die Deklaration relativkompliziert ist.Grundsätzlich stehen Ihnen verschiedene Komponenten zur Verfügung, die aber ihrerseitsstets nur Wrapper um die eigentlichen DLL-Funktionen sind. Daher ist der Funktionsumfangauch – unabhängig von der verwendeten Komponente – im Wesentlichenidentlisch.7.1.4. Einbindung in C/C++ über Import-LibrariesUnter den mitgelieferten Programmen befindet sich eine Import-Library, CMLL13.LIBbzw. CULL13.LIB für die Unicode-Version. Diese muss dem Linker als Library angebotenwerden. Sie sorgt dafür, dass der Linker die Verbindung zur DLL und deren Funktioneneinbaut.Um dem C-Compiler die Prototyp-Deklaration der Funktionen zu übergeben, sollte mandas Headerfile CMBTLL13.H einbinden, und zwar nach dem "#include "-Statement, da Windows-Variablentypen in den Deklarationen verwendet werden. Bittebeachten Sie die ´#ifdef´-Statements, um die für Ihre Windows-Version richtigen Deklarationenzu wählen. Wir empfehlen zusätzlich die Deklaration von STRICT, um eine striktereParameterprüfung durch den Compiler zu veranlassen.119


ProgrammierschnittstelleSie können die Importbibliothek auch mit dem Programm IMPLIB, das bei Ihrem SDKoder möglicherweise auch dem Compiler beiliegt, erstellen. Manche Compilerhersteller(z.B. Watcom/Sybase oder Borland) liefern ein solches Tool mit aus, ein entsprechendesTool liegt dem Microsoft-Compiler leider nicht bei.Auch ein dynamisches Laden der DLLs ist möglich – eine Beschreibung hierfür findenSie in der Online-Knowledgebase unter http://support.<strong>combit</strong>.net.7.1.5. Einbindung in DelphiBeachten Sie für die Einbindung in Delphi die Onlinehilfe zur VCL-Komponente.7.1.6. Einbindung in C++BuilderBeachten Sie für die Einbindung in den C++Builder die Onlinehilfe zur VCL-Komponente.7.1.7. Einbindung in Visual BasicZur Einbindung des OCX Controls fügen Sie dieses bitte wie gewohnt Ihrem Visual BasicProjekt hinzu. Anschließend steht dieses in der Toolbar zur Verfügung. Sofern Sie dasVisual Basic 6 DataBinding Control nutzen wollen, fügen Sie zusätzlich die Dateicmll13vb.ctl hinzu; es erscheint ein weiteres Control in der Toolbar. Lesen Sie dazuunbedingt die OCX Online-Hilfe.Wenn Sie auf das OCX Control verzichten und lieber direkt auf die DLL zugreifen wollen,fügen Sie Ihrem Projekt die Datei cmll13.bas hinzu. Darin enthalten sind die Deklarationender von Visual Basic verwendbaren DLL-Funktionen.7.1.8. Einbindung in die .NET-UmgebungBitte lesen Sie zu diesem Thema die Dokumentation aus dem .NET-UnterverzeichnisIhrer <strong>List</strong> & <strong>Label</strong> – Installation bzw. das entsprechende Kapitel in diesem Handbuch.Eine umfangreiche Onlinehilfe beschreibt darüber hinaus die Besonderheiten der Komponente.7.1.9. Einbindung in andere ProgrammiersprachenFür viele Programmiersprachen sind im Lieferumfang von <strong>List</strong> & <strong>Label</strong> bereits entsprechendeDeklarationsdateien sowie teilweise auch Beispiele enthalten. Diese Dateienfinden Sie im entsprechenden Unterverzeichnis Ihrer <strong>List</strong> & <strong>Label</strong>-Installation. Folgen SieIhrer Programmiersprachendokumentation, um DLLs oder OCX-Controls einzubinden.Sollte Ihre Programmiersprache nicht enthalten sein, können Sie meist anhand der Tabelleim Kapitel "Datentypen" Ihr eigenes Deklarationsfile zusammen mit der DokumentationIhrer Programmiersprache erstellen. Sofern Ihre Programmiersprache OCXe unterstützt,können Sie dies meist direkt einbinden. Im Zweifellsfall können Sie sich auch anunseren Support wenden.120


Dynamic Link Libraries7.1.10. Wichtiges zu den Funktions-ParameternDie Übergabe von Zeichenketten von der DLL an das Anwenderprogramm ist immerdurch die Übergabe eines Zeigers auf einen Speicherbereich und als weiteren Parametereinen Integer-Wert für dessen Länge (in Bytes, bei der Unicode-API in Zeichen) definiert.Es werden grundsätzlich nur so viele Zeichen kopiert, dass es keinen Überlauf in diesemBereich gibt, die Zeichenketten sind immer ´\0´-terminiert. Bei Bedarf (wenn der Pufferzu klein ist) wird der übergebene String also gekürzt und unvollständig zurückgegeben.Dies kann an einem zurückgegebenen Fehlercode geprüft werden.Bei Delphi ist zu beachten, dass die Routinen null-terminierte (ANSIZ)-Zeichenkettenbenötigen und zurückgeben, wie es bei Windows-Funktionen üblich ist. Im Bedarfsfallmüssen die Pascal-String zu C-String Konvertierungsroutinen benutzt werden.Bei Visual Basic sollte beim DLL-Zugriff das '\0' Zeichen zur Weiterverarbeitung entferntwerden (normalerweise beim OCX nicht nötig). Parameter werden überall ByVal übergeben.Es empfiehlt sich, Zeichenketten/Puffer vor Gebrauch durchDim lpszBuffer As String * 255auf eine gewisse Größe (hier 255 Bytes) zu initialisieren. Dies ist auch durch eine ZuweisungwielpszBuffer$ = space$(255)möglich, das aber mehr Zeit und Code benötigt. Wichtig ist nur, dass der Platz reserviertwird, so dass die DLL nicht in unbenutzte Bereiche schreibt, ansonsten wäre ein GPF dieFolge.Ansonsten ist zu Visual Basic anmerken, dass manche Funktionen prinzipiell nicht unterstütztwerden können; im Normalfall werden diese aber auch nicht benötigt. Sofern indiesem Handbuch als Übergabewert NULL oder nil verwendet wird, sollte (je nach Datentyp)in Visual Basic "" (Leerstring) oder 0 übergeben werden.Dies alles gilt nur für die Verwendung der DLL-Schnittstelle, dies ist bei Verwendung desOCX-Controls kein Problem.7.1.11. Datentypen bei C/C++, Delphi und VBNachfolgend finden Sie die in diesem Handbuch benutzten Entsprechungen der Datentypender o.g. Entwicklungssystemen.C/C++ Delphi Visual BasicVOID oid -PVOID pChar String, As AnyBOOL bool IntegerCHAR8 char IntegerCHAR16 WCHAR Integer121


ProgrammierschnittstelleUCHAR8 byte IntegerTCHAR TCHAR IntegerINT8 shortint IntegerUINT8 byte IntegerINT16 smallint IntegerUINT16 word IntegerINT32 longint LongUINT32 longint LongINT integer LongUINT cardinal LongLONG longint LongULONG longint LongDLGPROC tFarProc -FARPROC tFarProc -HWND HWND LongHDC HDC LongHCRS hCursor LongHANDLE tHandle LongHMENU tHandle LongHFONT tHandle LongPCHAR pCHAR StringTCHAR TCHAR -PCHAR8 pCHAR StringPCHAR16 pWCHAR -PTCHAR pTCHAR String/-POINT tPoint POINTRECT tRect RECTCOLORREF tColorref COLORREFMSG tMsg MSGFLOAT4 single singleBSTRBSTR+String(ByVal)String(ByRef)122


Hinweise zu den Parametern7.1.12. Hexadezimal-ZahlenHexadezimalzahlen sind Zahlen in dem 16er-System. In den folgenden Beschreibungenbeginnen diese Zahlen mit einem '0x', der C-typischen Syntax. Für Delphi ersetzt mandies durch '$', in Visual Basic durch '&H':C: 0x1a2b3c4dDelphi: $1a2b3c4dVisual Basic: &H1a2b3c4dGelegentlich kommen auch Zeichen vor wie ´\xaa´. Das ist die C/C++-Schreibweise fürein Zeichen mit dem Hexadezimalcode aa, also 170 dezimal. In Delphi ist das chr($aa), inVisual Basic chr$(&Haa).7.2. Hinweise zu den Parametern• Zeichenketten sind alle im ANSI-Code, Null-terminiert zu übergeben (evtl. WIN-API-Funktion OemToAnsi verwenden), im folgenden ANSIZ genannt.• Beachten Sie bei C oder C++ die C-Konvention, dass Sie in Quelltexten für '\' ,z.B. in Pfadangaben, dieses doppelt eingeben müssen: "c:\\temp.lbl" statt"c:\temp.lbl".• Bei Puffern muss die dem übergebenen Längenparameter entsprechende Anzahlan Bytes (Unicode-API: in Zeichen) reserviert sein, ansonsten lässt sich wie immerein ´Unbehebbarer Anwendungsfehler´ nicht vermeiden, oder das Programmläuft nicht korrekt, oder es werden zu wenig Zeichen kopiert. Achten Sieauf den Fehlercode LL_ERR_BUFFERTOOSMALL.• Die Parameter werden soweit möglich, auf Korrektheit überprüft. Während derProgrammentwicklung lohnt es sich also, den Debug-Modus einzuschalten (sieheLlSetDebug()) und die Rückgabewerte zu überprüfen. Später können Sie dann dieParameterüberprüfung explizit ausschalten (LL_OPTION_NOPARAMETERCHECK).7.3. Allgemeines zum Rückgabewert• Null (oder bei manchen Funktionen positive Rückgabewerte) bedeutet im allgemeinen,dass die Funktion erfolgreich war.• Ein negativer Rückgabewert signalisiert bis auf Ausnahmefälle einen Fehler, derüber die entsprechenden Fehlerkonstanten den Grund bezeichnet.7.4. Variablen/Felder und deren WerteDie unten angegebenen Hinweise gelten sowohl für Variablen wie auch für Felder, beiletzteren muss man also "Variable" einfach sinngemäß durch "Feld" ersetzen.123


Funktionen und Operatoren im Designer7.4.1. Im Variablennamen verwendbare ZeichenIm Variablennamen dürfen nur alphanumerische Zeichen, also 'a'..'z', 'A'..'Z', '0'..'9', '.' und'_' sowie Umlaute verwendet werden. Zahlen dürfen nicht an erster Stelle stehen. Allenicht-erlaubten Zeichen werden zu einem Unterstrich ('_') umgesetzt. Der Punkt ist einHierarchietrenner für die Variablenhierarchie.Die Namen verschiedener Variablen müssen sich unterscheiden, auch wenn der Typunterschiedlich ist (z.B. LL_NUMERIC und LL_TEXT). Auch dürfen Felder und Variablennicht den gleichen Namen haben.Bei Multibyte-Variablennamen (z.B. japanisch) müssen Sie die LL_OPTION_XLATVAR-NAMES auf FALSE setzen.Vorsicht: Man kann per Option LL_OPTION_VARSCASESENSITIVE ein- oder ausstellen,dass zwischen Groß- und Kleinschreibung der Variablennamen unterschieden wird.Dennoch dürfen auch dann Variablen sich nicht nur in der Großschreibung unterscheiden!7.4.2. Im Inhalt verwendbare ZeichenAlle druckbaren ANSI-Codes inklusive der unten genannten Steuerzeichen.Vorsicht ist allerdings geboten, wenn der alte Expression-Modus verwendet wird und• wenn der Inhalt aussieht wie eine Felddefinition:* Bei LlDefineVariableExt(´Test´, ´´, LL_TEXT, NULL) würde ´´wiederum - wenn möglich- ersetzt werden durch den Inhalt des entsprechendenFeldes,* Bei LlDefineVariableExt(´Test´, ´´, LL_TEXT, NULL) entsteht eine Endlosschleife,siehe Hinweis bei LlDefineVariable()), oder• wenn der Inhalt eine Bedingungsstruktur enthält.7.5. RundungBitte beachten Sie folgenden wichtigen Hinweis zur Rundung bei <strong>List</strong> & <strong>Label</strong>, damit Siekeine Inkonsistenzen zu Ihren Daten aus der Datenbank bekommen: Summenvariablenwerden nicht gerundet, d.h. bei Verwendung von Nachkommastellen (z.B. bei Rechnungen)empfehlen wir die Verwendung einer Rundungsfunktion, oder am Besten solltenkeine Multiplikationen für die Erstellung von Summenvariablen verwendet werden.8. Funktionen und Operatoren im DesignerEine Erläuterung der im Designer verwendbaren Funktionen finden Sie in der DesignerOnlinehilfe.124


Westliche Codepages (SBCS0F )9. Verwendung in internationaler UmgebungDie Entwicklung für internationale Umgebungen ist sehr unterschiedlich komplex, wieSie – wenn Sie Ihre Applikation international einsetzen wollen – sicher wissen. SolltenSie bisher noch keine Erfahrung in diesem Bereich haben, empfehlen wir Ihnen dasgenauere Studium von weiterführender Literatur, z.B.: Nadine Kano: "Developing InternationalSoftware" erschienen in der MS Press, ISBN 1-55615-840-8.Die meisten westlichen Sprachen haben die gleiche Codepage (1252), auf die <strong>List</strong> &<strong>Label</strong> als Voreinstellung zugeschnitten ist. Bei dieser Codepage ist in Hinsicht auf Zeichensätzenormalerweise nichts zu berücksichtigen.Bitte beachten Sie, dass die folgende Betrachtung für die Funktionalität von <strong>List</strong> & <strong>Label</strong>gilt, nicht für die Benutzeroberfläche. Sie können mit einer englischen Benutzeroberflächeein japanisches Projekt bearbeiten (vorausgesetzt, auf Ihrem System ist die Unterstützungfür die japanische Codepage (Stichwort NLS) vorhanden) oder umgekehrt. Diefolgenden Abschnitte behandeln das Projekt mit seinen Formeln und Ausgaben an sich.Die Sprache der Benutzeroberfläche ist wie bisher unabhängig davon, und es werdenständig neue Länder-Interfaces hinzugefügt.9.1. Westliche Codepages (SBCS 1 )Wenn <strong>List</strong> & <strong>Label</strong> für Zeichensätze aus anderen SBCS-Codepages als 1252 (also z.B.baltisch (1257), kyrillisch/slawisch (1251), griechisch (1253), türkisch (Latin 5: 1254), Latin2 (1250)) verwendet wird, kann dies Änderungen in diversen Einstellungen voraussetzen.<strong>List</strong> & <strong>Label</strong> verwendet normalerweise ungenutzte Zeichen aus der Codepage 1252 fürmanche Sonderfunktionen:• LL_OPTION_TABREPRESENTATIONCODE / LL_CHAR_TAB: Das Zeichen, das als "Tabulatorzeichen"in Ausdrücken und Texten Verwendung findet. Voreinstellung: "÷"(Zeichencode 247).• LL_OPTION_RETREPRESENTATIONCODE / LL_CHAR_NEWLINE: Das Zeichen, das als"Umbruchzeichen" in Ausdrücken und Texten Verwendung findet, um einen Umbruchzu erzwingen. Voreinstellung: "" (Zeichencode 182)• LL_OPTION_EXPRSEPREPRESENTATIONCODE / LL_CHAR_EXPRSEP: Trennt die einzelnenZeilen einer Formel im Funktionsassistenten, wird aber normalerweise nichtangezeigt. Voreinstellung: "¤" (Zeichencode 164).Je nach Codepage sind manche dieser Zeichen "sinnvolle" Textzeichen, so dass dieRepresentationscodes geändert werden müssen. Dies muss vor der Erstellung oderVeränderung der Druck-Projekte geschehen. Hauptsache ist, es ist konsistent.Für den Einsatz unter der Codepage 1253 (griechisch) muss LL_CHAR_TAB auf alleFälle geändert werden.1 SBCS=Single Byte Character Set125


Verwendung in internationaler UmgebungSchon geändert wurden ab Version 7 folgende Codes:• LL_OPTION_TEXTQUOTEREPRESENTATIONCODE / LL_CHAR_TEXTQUOTE: Schließt inder Projektdatei Texte ein. Wird und darf nie angezeigt werden, daher sollte hier einZeichen verwendet werden, das nie in Texten vorkommen kann. Voreinstellung istseit <strong>List</strong> & <strong>Label</strong> 7 Zeichencode 1. Alte Projektdateien mit dem alten Wert 168 werdenaber trotzdem korrekt eingelesen.• LL_OPTION_PHANTOMSPACEREPRESENTATIONCODE / LL_CHAR_PHANTOM-SPACE: Wird für optionale Worttrennung in Variablen/Feldinhalten verwendet, wirdaber nie angezeigt. Voreinstellung ist seit <strong>List</strong> & <strong>Label</strong> 7 Zeichencode 2.• LL_OPTION_LOCKNEXTCHARREPRESENTATIONCODE / LL_CHAR_LOCK: Wird zurTrennungsunterdrückung in Variablen/Feldinhalten verwendet, Voreinstellung ist seit<strong>List</strong> & <strong>Label</strong> 7 Zeichencode 3. Anstelle dessen können Sie meist auch Code 160 (NOBREAK SPACE) verwenden.Die Codes von 1 bis 19 sind intern für <strong>List</strong> & <strong>Label</strong> reserviert.9.2. Fernöstliche Codepages (MBCS 2 /DBCS 3 )Bei fernöstlichen Sprachen können die Zeichen nicht in den üblichen 255 Zeichen untergebrachtwerden. Eine Erweiterung des Zeichensatzes war nötig, es entstanden dieMultibyte-Zeichensätze (MBCS), unter Windows speziell die Zweibyte-Zeichensätze(DBCS). Manche Zeichen, z.B. die üblichen ASCII/ANSI-Zeichen A-Z, a-z usw. sind hierdurch ein Byte repräsentiert, fernöstliche Symbole meist durch zwei (ein "Lead Byte", ein"Trail Byte"). Dies bewirkt auch, dass beispielsweise 10 japanische Zeichen zwischen 10und 20 Bytes beanspruchen können. Das muss natürlich berücksichtigt werden, wennman beispielsweise Puffergrößen an <strong>List</strong> & <strong>Label</strong> übergibt: für 10 Zeichen Text müssen(maximal) 20 Bytes reserviert werden.Hier muss unbedingt sichergestellt werden, dass die Representationcodes in keinem"Lead Byte Range" vorkommen, also niemals das erste Zeichen einer Zweibytekombinationsein dürfen. Es müssen also meist alle drei Representation-Codes für LL_CHAR_-TAB, LL_CHAR_NEWLINE, LL_CHAR_EXPRSEP geändert werden:Codepage RET 4 TAB 5 EXPRSEP 6936 (simplified Chinese) X X X2 MBCS=Multibyte Character Set3 DBCS = Double Byte Character Set4 empfohlen: 205 empfohlen: 216 empfohlen: 22126


Unicode950 (traditional Chinese) o.k. o.k. X932 (Japanese) X X X949 (Korean Wansung) X X X(X=muss geändert werden)Außerdem muss in einer DBCS-Umgebung sichergestellt sein, dass LL_OPTION_XLAT-VARNAMES auf FALSE gestellt ist.In der DBCS-Version arbeiten Funktionen wie left$(), mid$(), right$() und len() zeichenorientiert,in der SBCS-Version Byte-orientiert.9.3. UnicodeUm der Komplexität der DBCS-Hilfskonstruktion zu umgehen, wurde ein Zeichensatzentworfen, in dem jedes Zeichen fest durch 2 Bytes repräsentiert wird. Hierin könnendie wichtigsten Zeichen aller Sprachen eindeutig identifiziert werden. Der unter Windowsverwendete Zeichensatz entspricht dem "Unicode"-Standard.Der Nachteil dieses Zeichensatzes ist, dass die Programmiersprachen über diese neueZeichengröße Bescheid wissen müssen, was aber nicht immer der Fall ist. Außerdemmuss eine andere DLL von <strong>List</strong> & <strong>Label</strong> verwendet werden. Die Vorteile würden dieNachteile trotzdem überwiegen, wenn der Windows 9x-Zweig der Microsoft-Betriebssysteme diesen Zeichensatz voll unterstützen würden.Beachten Sie, dass das PDF-Exportmodul keine volle Unicode-Unterstützung bietet. Hierist es u.U. notwendig, das Charset für die verwendeten Schriftarten explizit zu wählen(z.B. "Japanisch"). Nicht alle Unicode-Zeichen können vom PDF-Export dargestellt werden,da die Zeichendarstellung nicht über CID-Fonts sondern über die von Adobe bereitgestelltenFont-Pakete erfolgt.Die Unicode Version unterstützt das RTF Control ab Version 2.9.4. Implementierung in <strong>List</strong> & <strong>Label</strong><strong>List</strong> & <strong>Label</strong> und die verwendeten Haupt-DLLs werden zweifach angeboten: einmal alsSBCS-Version (optional erweiterbar auf DBCS-Tauglichkeit) und einmal als Unicode-Version. Die ersteren erkennt man an dem Dateinamen beginnend mit "cm", letztere an"cu". Die SBCS/DBCS-Version ist lauffähig ab Windows 98SE, wohingegen die Unicode-Version NT 4 oder neuer benötigt.Bei Verwendung der .NET-Komponente muss lediglich die <strong>Referenz</strong> auf z.B. listlabel13.dllgegen eine <strong>Referenz</strong> auf listlabel13unicode.dll ausgetauscht werden, dannwerden die Dateien der Unicodeversion verwendet.127


Verwendung in internationaler UmgebungBei Verwendung der VCL-Komponente definieren Sie die beiden Konstanten "UNICODE"und "USE_UNICODE_DLLS".Das OCX liegt ebenfalls in einer Unicodeversion vor (cull13o.ocx).Alle API-Funktionen, die Zeichenketten bekommen oder zurückgeben, sind in beidenDLLs in der Windows-üblichen Weise doppelt vorhanden: einerseits als "A"-Version fürSBCS/DBCS, andererseits als "W"-Version für Unicode. Durch Makros oder die Deklarationsdateiwird dies vor der Entwicklungsumgebung normalerweise verborgen. Dies bedeutetaber auch, dass ein SBCS-Programm einfach die Unicode-DLL verwenden kann.Auch Windows-typisch ist hier, dass die jeweils typfremden API-Aufrufe (d.h. die "A"-APIs bei der SBCS/DBCS-DLL und die "W"-Aufrufe bei der Unicode-DLL) die Zeichenkettenvor Übergabe oder Rückgabe konvertieren müssen. Ab Windows NT hat aber dieUnicode-Version den Vorteil, dass die von <strong>List</strong> & <strong>Label</strong> aufgerufene Windows-API keineKonvertierungen durchführen muss – ein Laufzeitvorteil gegenüber der SBCS/DBCS-Version.Zu beachten sind:• Alle Puffergrößen, die an <strong>List</strong> & <strong>Label</strong> übergeben werden, sind die Puffergröße inBytes bei der SBCS/DBCS-API und in WCHARs bei der Unicode-API.• Wenn das Unicode-Interface der SBCS/DBCS-Version verwendet wird oder dasSBCS/DBCS-Interface der Unicode-Version, müssen Zeichenketten-Parameter umgewandeltwerden. Als Voreinstellung verwendet <strong>List</strong> & <strong>Label</strong> hier die CP_ACP. Daskann aber über die LL_OPTION_CODEPAGE bei Bedarf umgestellt werden.• Jede DLL schreibt die Projekt-Dateien "native", d.h. im eigenen Zeichensatz (dieUnicode-Version schreibt also Unicode-Projektdateien). Dies muss beachtet werden,wenn Sie die Projekt-Dateien für eigene Zwecke modifizieren. <strong>List</strong> & <strong>Label</strong> kann aberauch die jeweils "artfremde" Projektdatei lesen, wobei zur Umwandlung die obigeCodepage benutzt wird.• Die Druckerdaten ("P-Files") sind identisch, genauso die Skizzendateien ("V-Files").• In einer MBCS-Umgebung sollte nur der neue Ausdruckmodus verwendet werden.9.5. Projektaustausch bei unterschiedlichen ZeichensystemenEin Austausch ist nur dann wirklich problemlos, wenn die Applikationen beider Systemedie Representationcodes auf den gleichen Wert setzen. Dies kann allerdings dazu führen,dass Zeichen manchmal nicht unterschieden werden können (alle Zeichencodes


WortumbruchZu beachten sind ebenfalls die Chevrons («»), die im RTF-Objekt zur Kennzeichnung vonFormeln verwendet werden. In Multibyte-Systemen sind diese so nicht benutzbar, da sieoft ein Schrift-Zeichen darstellen.Daher hat die DBCS-Version von <strong>List</strong> & <strong>Label</strong> eine Automatik eingebaut, um eine möglichstgroße Kompatibilität zu gewährleisten.Wenn die DBCS-Version in einer DBCS-Umgebung läuft, stellt sie die Codes auf Code 4bzw. Code 6 als Voreinstellung. Wenn hiermit ein Projekt neu erstellt wird, werden dieEinstellungen mit dem Projekt gespeichert, so dass dann auch in einer anderen Umgebungdas Projekt benutzt werden kann (es sind in diesem Falle dann keine Chevrons,sondern Blöcke – ein kleiner Nachteil zugunsten der Kompatibilität). Wenn ein vorhandenesProjekt geladen wird, werden die dazu korrekten Werte genommen, da sie in derProjektdatei gespeichert sind – oder wenn nicht, ist es eine alte Projektdatei, und eswerden die dazu passenden Werte für Chevrons genommen.Daraus folgt ebenfalls, dass ein Projekt, welches für Fernostsprachen eingesetzt werdensoll, auf alle Fälle per LL_OPTION_CODEPAGE auf diese eingestellt werden sollte, bevordie Projekte erstellt werden, um die Formelmarker auf die Codes 4 und 6 zu setzen.Dazu muss auf diesem Rechner der dazugehörige NLS (National Language Support)installiert sein. 79.6. Wortumbruch<strong>List</strong> & <strong>Label</strong> berechnet den Wortumbruch anhand des verwendeten Zeichensatzes desauszugebenden Texts. Eingebaut sind neben der einfachen westlichen Wort-Trennungsregel die Trennregeln für Symbole (zeichenorientiert), chinesisch (traditionalund simplified), japanisch (kinsoku) und koreanisch (Wansung, geumchik-Umbruch).9.7. Lokalisierung von Datumswerten, Währungen undZahlenEinige Funktionen, die in <strong>List</strong> & <strong>Label</strong>-Formeln vorkommen können, sind lokalisiert oderlokalisierbar: Date$(), LocCurr$(), LocCurrL$(), LocNumber$(), LocDate$(), LocTime$()haben einen optionalen Parameter, der die Lokalisierung der Ausgabe bestimmt – wenner nicht angegeben ist, wird die die über LL_OPTION_LCID eingestellte Locale (Voreinstellungist die Benutzer-Locale) verwendet.Über Locale$() kann man, beispielsweise für Bedingungen, Einstellungen für ein bestimmtesLand abfragen.7 Tip für Win9x: die NLS-Dateien sind beispielsweise in diversen CAB-Files vom Internet Explorerenthalten, einfach nach dem Auspacken auf das entsprechende INF-File klicken und "Installieren"wählen. Bei NT sind die NLS- und die INF-Dateien auf der Installations-CD.129


Verwendung in internationaler UmgebungAußerdem sind für die FStr$()-Funktion die Werte für Tausendertrennzeichen und Dezimalpunktper Option einstellbar, wenn sie von der locale-abhängigen Voreinstellung oderder mit LL_OPTION_LCID eingestellten Locale abweichen soll.130


Aufgabe10. Callbacks und NotificationsDieses Kapitel ist nur für Anwendungen interessant, die nicht über OCX- oder VCL-Controls auf <strong>List</strong> & <strong>Label</strong> zugreifen. Entwickler, die das OCX- oder VCL-Control verwenden,können dieses Kapitel überspringen.10.1. AufgabeFolgendes Prinzip steckt hinter den Begriffen "Callbacks und Notifications": wenn <strong>List</strong> &<strong>Label</strong> etwas nicht weiß, fragt es einfach Ihr Programm. Sie müssen nicht alle Antwortenvorprogrammieren, sondern nur die, zu denen Sie Anfragen ausdrücklich wünschen.Beispielsweise gibt es programmdefinierbare Objekte sog. User-Objekte, die von <strong>List</strong> &<strong>Label</strong> wie eine "black box" behandelt werden. Wenn <strong>List</strong> & <strong>Label</strong> solch ein Objekt ausgebenmuss, wendet es sich an Ihr Programm mit der Bitte, diese Aufgabe durchzuführen.Diese Art "Objekt-Container" kann verwendet werden, um Sonderwünsche nach speziellenObjekten, beispielsweise extern erstellte Charts, erfüllen zu können. Sie müssen hierkeine komplette Schnittstelle, sondern nur eine einzige Routine zur Verfügung stellen.Aber auch bei der Datenausgabe kann etwas gezaubert werden - über die Callbackmöglichkeitkann man Daten auf eine Seite hinzufügen, die vom Programm gesteuertsind (und somit vom Benutzer auch nicht im Designer entfernbar), man kann Objektekurzerhand verstecken (das kann man aber auch über LlPrintEnableObject() oder dieDarstellungsbedingung eines Objekts) oder objektspezifische Bemalung ausgeben.10.1.1. Implementierung über OCX- oder VCL-ControlSofern Sie das OCX- oder VCL-Control verwenden, stehen Ihnen die meisten Callbacksals Event zur Verfügung. Einzelheiten finden Sie in der jeweiligen Online-Hilfe.10.1.2. Implementierung mit der DLLUm Callbacks/Events zu nutzen, muss eine der folgenden Möglichkeiten implementiertwerden:• man definiert eine Callbackroutine, deren Adresse man <strong>List</strong> & <strong>Label</strong> über LlSetNotificationCallback()mitteilt, oder• man reagiert auf von <strong>List</strong> & <strong>Label</strong> gesendete Nachrichten. Diese werden von <strong>List</strong>& <strong>Label</strong> an das Fenster, das bei LlDefineLayout() und LlPrintWithBoxStart() angegebenwird, geschickt.In beiden Fällen bekommt man dann ausführlichere Informationen über die durchzuführendeAufgabe.Warnung: Callbacks sind eine sehr mächtige Methode, um die Aufgaben zu bewältigen.Dementsprechend leicht sind sie zu missbrauchen, und für unerfahrene Windows-131


Callbacks und Notifications<strong>Programmierer</strong> können sie bis zur richtigen Implementierung ein Stolperstein sein.Aber lassen Sie sich nicht entmutigen: wenn Sie spezielle Anforderungen an das Programmhaben, könnte die Lösung hier zu finden sein.10.2. User-ObjekteDa <strong>List</strong> & <strong>Label</strong> nicht alle möglichen Objekte berücksichtigen kann - seien es Spline-Objekte, Statistik-Graphen, Charts oder Zeichnungen mit unbekanntem Grafikformat -wurden in <strong>List</strong> & <strong>Label</strong> die sog. User-Objekte eingebaut, da auch Metafile-Variablen nichtalle Bereiche sinnvoll abdecken können.Wenn Sie diese mit der .NET Komponente verwenden wollen, beachten Sie bitte dieHinweise im Kapitel "6.1. Arbeiten mit der .NET Komponente".Wenn Sie in Ihrem Programm eine Variable überLlDefineVariableExt(hJob, , , LL_DRAWING_USEROBJ, NULL);definiert haben, kann der Benutzer im Designer ein Objekt definieren, das mit dieserVariablen zusammenhängt. Dies geschieht analog zu normalen LL_DRAWING-Variablen.Wenn <strong>List</strong> & <strong>Label</strong> dieses Objekt im Preview oder beim Druck ausgeben soll, ruft es überden Callback LL_CMND_DRAW_USEROBJ Ihr Programm auf, um diese Aufgabe an IhrProgramm weiterzugeben.Dasselbe können Sie auch für Tabellenfelder durchführen, damit der Benutzer die Möglichkeithat, sich ein User-Objekt in die Tabelle einzubauen:LlDefineFieldExt(hJob, , , LL_DRAWING_USEROBJ, NULL);Für Variablen, besteht zusätzlich die Möglichkeit, User-Objekte zu definieren, derenParameter der Benutzer im Designer ändern kann. Die Objekte werden mit dem LL_-DRAWING_USEROBJ_DLG-Typ definiert:LlDefineVariableExt(hJob, , , LL_DRAWING_USEROBJ_DLG,NULL);Bearbeitbare User-Objekte können nicht in Tabellen eingefügt werden.Wenn der Benutzer nun den 'Bearbeiten'-Button im Zeichnungs-Dialog drückt, werdenSie über den LL_EDIT_USEROBJ-Callback aufgefordert, einen dazugehörigen Dialogaufzubauen, in dem die Parameter, die zu dem Objekt gehören, geändert werden können.Diese Parameter werden mit den anderen Objekt-Informationen automatisch in derProjektdefinitionsdatei gespeichert und zur Auswertung beim LL_DRAW_USEROBJ-Callback übergeben, so dass Ihr Programm sich nicht weiter um die Speicherung derParameter kümmern muss.Bitte beachten Sie die Hinweise des Artikels Q99109 in der Microsoft Developer NetworkKnowledge Base, wenn Sie in Callback-Objekten DDBs (device dependent bitmaps)drucken wollen: Wandeln Sie die DDB erst in eine DIB (device independent bitmap),wenn sie nicht kompatibel mit dem Drucker-DC ist, ansonsten ist ein irreguläresVerhalten des Druckertreibers vorprogrammiert.132


Definition einer Callbackroutine10.3. Definition einer CallbackroutineEine Callbackroutine wird wie ein normaler Windows-Callback definiert. Zu speziellenFragen wie Compiler-Switches bedienen Sie sich bitte des Handbuchs zu Ihrem Compiler.Die allgemeine Form des Callbacks ist in C-NotationLRESULT CALLBACK _extern LLCallback(INT nMsg, LONG lParam,DWORD lUser-Param);bzw. in Delphi-Notation:function LLCallback(nMsg: integer; lParam: longint, lUserParam: longint):longint; external;Die Funktion kann direkt übergeben werden:LlSetNotificationCallback(hJob,(FARPROC)LLCallback);Ab jetzt kann Ihre Routine von <strong>List</strong> & <strong>Label</strong> aufgerufen werden, wenn dies nötig ist.Wichtig ist, am Programmende den Callback wieder auf NULL zu setzen, ansonstenverabschiedet sich Ihr System mit einem GPF:LlSetNotificationCallback(hJob,(FARPROC)NULL);10.4. Datenübergabe an die CallbackroutineDer Wert des nMsg-Parameters unterscheidet die verschiedenen Aufgaben. Die Wertesind die Konstanten, die mit LL_CMND_xxxx beginnen, z.B. LL_CMND_TABLEFIELD zumZeichnen des Hintergrunds eines Tabellenfeldes, oder LL_INFO_xxx sowie LL_NTFY_xxx-Nachrichten.Abhängig von der Aufgabe, die Ihr Programm erledigen muss (darf?), hat der ParameterlParam unterschiedliche Bedeutungen. Die einzelnen Bedeutungen stehen weiter untenbei den Aufgaben beschrieben. Es sind meist Strukturen (Records), auf die lParam zeigt,der Wert muss also über eine Typkonvertierung in einen Strukturzeiger verwandelt werden:LRESULT CALLBACK _extern LLCallback(INT wParam, LONG lParam, LONG lUser-Param){PSCLLTABLEFIELD pSCF;}switch (wParam){case LL_CMND_TABLEFIELD:pSCF = (PSCLLTABLEFIELD)lParam;// do something using pSCF;break;}return(0);133


Callbacks und NotificationsDie Funktion muss immer einen definierten Wert zurückgeben. Wenn nicht anders gefordert,muss dieser Wert Null sein.lUserParam ist der überLlSetOption(hJob, LL_OPTION_CALLBACKPARAMETER, );übergebene Wert.10.5. Datenübergabe per NachrichtZu einer Nachricht gehören drei Parameter: nMsg, wParam und lParam in der folgendenDefinition Ihres Nachrichten-Callbacks (nennt sich hier Fensterroutine, ist aber nichtsanderes als ein Callback!)LRESULT WINAPI MyWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam);Der Nachrichtenwert, den <strong>List</strong> & <strong>Label</strong> benutzt, kann über LlGetNotificationMessage()abgefragt werden. Alternativ könnte man über LlSetNotificationMessage() einen anderenaussuchen.wParam ist hier unsere Aufgaben-Konstante und lParam zeigt auf eine Struktur des TypscLlCallback:struct scLlCallback{int _nSize;LPARAM _lParam;LRESULT _lResult;LPARAM _lUserParameter;}In dieser Struktur stecken nun die erforderlichen _lParam (als Parameterwert) und_lResult (als Rückgabewert).nLLMessage = LlGetNotificationMessage(hJob);//....// ...in the window procedure...if (wMsg == nLLMessage){PSCLLCALLBACK pSC;PSCLLTABLEFIELD pSCF;pSC = (PSCCALLBACK)lParam;switch (wParam){case LL_CMND_TABLEFIELD:pSCF = (PSCLLTABLEFIELD)pSC->_lParam;// do something;pSC._lResult = 0;break;}}_lUserParam ist der überLlSetOption(hJob, LL_OPTION_CALLBACKPARAMETER, );übergebene Wert.134


Zwei Device Contexte?Wenn kein Rückgabewert gefordert wird, braucht das _lResult-Feld nicht verändert zuwerden, es steht als Voreinstellung auf Null.10.6. Zwei Device Contexte?Ja. Leider. Manchmal.Dies ist historisch bedingt, da <strong>List</strong> & <strong>Label</strong> in seiner 16bit-Version dieses benötigte.Beide DCs haben seit Version 7 den gleichen Wert, aus Kompatibilitätsgründen habenwir aber die Strukturen nicht geändert.Hinweise zur Benutzung von GDI-ObjektenWenn Sie irgendein GDI-Objekt in diesen DC selektieren oder andere Änderungen vornehmen,z.B. des Mapping-Modes, sollten Sie die Änderungen vor der Beendigung derRoutine wieder rückgängig machen. Tip: die API-Funktionen SaveDC(), RestoreDC() könnenbei komplexen Veränderungen sehr helfen. (Die hier verwendeten Funktionen sindWindows-API-Funktionen).10.7. ÜbersichtLL_CMND_DRAW_USEROBJAufgabe:Fordert das Programm auf, das benutzerdefinierte Objekt zu zeichnen.Aktivierung:LlDefineVariableExt(hJob, , , LL_DRAWING_USEROBJ,);LlDefineFieldExt(hJob, , , LL_DRAWING_USEROBJ,);oderLlDefineVariableExt(hJob, , ,LL_DRAWING_USEROBJ_DLG,);Parameter:lParam zeigt auf eine scLlDrawUserObj-Struktur:_nSize: Größe der Struktur, sizeof(scLlDrawUserObj)_lpszName: Name der Variablen, die dem Objekt zugeordnet ist_lpszContents: Text-Inhalt der Variablen, die dem Objekt zugeordnet ist. DieserWert ist nur gültig, wenn die Variable über LlDefineVariableExt() definiert wurde,ansonsten ist der _hPara-Wert gültig.135


Callbacks und Notifications_lPara: lPara der Variablen, die dem Objekt zugeordnet ist (LL_DRAWING_-USEROBJ oder LL_DRAWING_USEROBJ_DLG). Entspricht dem 4. Parameter desLlDefineVariableExt()-Aufrufs._lpPtr: lpPtr der Variablen, die dem Objekt zugeordnet ist. Entspricht einem Zeigerauf die Struktur, die mit dem 5. Parameter des LlDefineVariableExt()-Aufrufsübergeben wurde._hPara: Handle-Inhalt der Variablen, die dem Objekt zugeordnet ist. Dieser Wertist nur gültig, wenn die Variable über LlDefineVariableExtHandle() definiert wurde,ansonsten ist der _lpszContents-Wert gültig._bIsotropic: TRUE: Das Objekt soll unverzerrt gezeichnet werden, FALSE: DieZeichnung soll in das Rechteck eingepasst werden_lpszParameters: bei benutzerdefinierten Objekten als Tabellenfeld: NULL, beiLL_DRAWING_USEROBJ: Zeiger auf einen leeren ANSIZ-String, bei LL_-DRAWING_USEROBJ_DLG: Zeiger auf die Parameter-Zeichenkette, die bei LL_-CMND_EDIT_USEROBJ zurückgegeben wurde._hPaintDC: Device Context für die Ausgaben_hRefDC: Device Context für <strong>Referenz</strong>en_rcPaint: Rechteck, in dem das Objekt gezeichnet werden soll. Der Mapping-Mode ist in den üblichen Zeichnungs-Einheiten, also mm/10, inch/100 oderinch/1000._nPaintMode: 1: auf Designer-Preview, 0: auf Drucker/EchtdatenpreviewRückgabewert (_lResult):0Hinweise:In diesem Callback darf keine <strong>List</strong> & <strong>Label</strong>-Funktion aufgerufen werden, die Ausgabenzur Folge hat (LlPrint(), etc.)! Funktionen wie LlPrintGetCurrentPage() oderLlPrintGetOption() oder auch LlPrintEnableObject() sind erlaubt.Siehe: Hinweise zur Benutzung von GDI-ObjektenBeispiel:case LL_CMND_DRAW_USEROBJ:pSCD = (PSCLLDRAWUSEROBJ)pSC->_lParam;FillRect(pSCD->_hPaintDC,pSCD->_rcPaint,GetStockObject(atoi(lpszContents)));break;136


ÜbersichtLL_CMND_EDIT_USEROBJAufgabe:Aktivierung:Parameter:Fordert das Programm auf, einen objektspezifischen Dialog zu starten, über dender Benutzer die zugehörigen Darstellungsparameter eingeben und ändern kann.LlDefineVariableExt(hJob, , , LL_DRAWING_USEROBJ_DLG,);lParam zeigt auf eine scLlEditUserObj-Struktur:_nSize: Größe der Struktur, sizeof(scLlEditUserObj)_lpszName: Name der Variablen, die dem Objekt zugeordnet ist_lPara: lPara der Variablen, die dem Objekt zugeordnet ist (LL_DRAWING_-USEROBJ oder LL_DRAWING_USEROBJ_DLG). Entspricht dem 4. Parameter desLlDefineVariableExt()-Aufrufs._lpPtr: lpPtr der Variablen, die dem Objekt zugeordnet ist. Entspricht dem 5. Parameterdes LlDefineVariableExt()-Aufrufs._hPara: Handle-Inhalt der Variablen, die dem Objekt zugeordnet ist. Dieser Wertist nur gültig, wenn die Variable über LlDefineVariableExtHandle() definiert wurde,ansonsten ist der _lpszContents-Wert gültig._bIsotropic: TRUE: Das Objekt soll unverzerrt gezeichnet werdenFALSE: Die Zeichnung soll in das Rechteck optimal eingepasst werden_hWnd: Fenster-Handle des Dialogs. Dieses sollte als Parent-Handle Ihres Dialogsgenommen werden._lpszParameters: Zeiger auf einen Puffer mit der maximalen Größe_nParaBufSize._nParaBufSize: Größe des internen Puffers.Rückgabewert (_lResult):0Hinweise:Dieser Callback kommt nur bei Objekten mit dem Variablentyp LL_DRAWING_-USEROBJ_DLG!In diesem Callback darf keine <strong>List</strong> & <strong>Label</strong>-Funktion aufgerufen werden, die Ausgabenzur Folge hat (LlPrint(), etc.)! Funktionen wie LlPrintGetCurrentPage(),LlPrintGetOption() oder LlPrintEnableObject() sind erlaubt.Siehe: Hinweise zur Benutzung von GDI-Objekten.137


Callbacks und NotificationsDie Bearbeitung des _bIsotropic-Flags ist optional, da dieses schon vom aufrufendenDialog eingestellt werden kann. Wenn Sie dieses Flag in der Struktur verändern,wird die Veränderung von <strong>List</strong> & <strong>Label</strong> übernommen._lpszParameters zeigt auf einen ANSIZ-String, in dem die beim letzten Aufruf desDialogs eingegebenen Werte stehen. Dieser Puffer ist 1024+1 Bytes groß, sodass ein Parameterstring, der von Ihrem Dialog erstellt wird, in diesen Puffer geschriebenwerden kann, wenn er kürzer ist als der Wert in _nParaBufSize. Ansonstenmüssen Sie diesen Zeiger mit einem Zeiger auf Ihre gewünschten Daten ü-berschreiben. Die Problematik eines längeren Parameterstrings ist, dass dieservon <strong>List</strong> & <strong>Label</strong> nicht freigegeben werden kann, falls es ein allozierter Speicherbereichist.Die in der Parameter-Zeichenkette erlaubten Zeichen sind alle druckbaren Zeichen,also Zeichen mit Codes >= 32 (' ').Beispiel:case LL_CMND_EDIT_USEROBJ:pSCE = (PSCLLEDITUSEROBJ)pSC->_lParam;lpszNewParas = MyDialog(pSCE->_hWnd,...,);if (strlen(lpszNewParams) < pSCE->_lpszParameters)strcpy(pSCE->_lpszParameters, lpszNewParas);elsepSCE->_lpszParameters = lpszNewParas;break;LL_CMND_ENABLEMENUAufgabe:Callback, bei dem bestimmt werden kann, welche Menü-Einträge im Designer erlaubtsind etc.Aktivierung:Immer aktiviertParameter:lParam: menu handleHinweise:Diese Funktion wird aufgerufen, wenn <strong>List</strong> & <strong>Label</strong> das Menü ändert bzw. anpasst.Hier können z.B. die über LL_CMND_MODIFYMENU eingefügten Menüpunkteenabled oder disabled werden.Beispiel:case LL_CMND_ENABLEMENU:if ()EnableMenuItem(hMenu,IDM_MYMENU,138


ÜbersichtMF_ENABLED|MF_BYCOMMAND);elseEnableMenuItem(hMenu,IDM_MYMENU,MF_DISABLED|MF_GRAYED|MF_BYCOMMAND);break;LL_CMND_EVALUATEAufgabe:Fragt das Benutzerprogramm nach der Interpretation des Inhalts der External$()-Funktion im Expression-Modus.Aktivierung:Eingabe einer External$() -Funktion in einen AusdruckParameters:lParam zeigt auf eine scLlExtFct-Struktur:_nSize: Größe der Struktur, sizeof(scLlExtFct)_lpszContents: Parameter der Funktion External$()_bEvaluate: TRUE, wenn der Inhalt ausgewertet werden soll, FALSE, wenn nurein Syntax-Test durchgeführt werden soll._szNewValue: Array, worin das Ergebnis als Null-terminierte Zeichenkette abgelegtwird. Voreinstellung: leer._bError: TRUE: Fehler aufgetreten, FALSE: kein Fehler aufgetreten (Voreinstellung)._szError: Array, worin eine eventuelle Fehlerbeschreibung abgelegt werden kann,die später mit LlExprError() abgefragt werden kann. Dieser Text wird auch imDesigner dem Benutzer von der automatischen Syntaxprüfung angezeigt.Rückgabewert (_lResult):0Hinweise:Wenn also der Ausdruck in einer Formel z. B.Name + ", " + External$(Name + "," + Vorname)lautet, dann ist der Parameter der evaluierte Ausdruck der Formel 'Name+","+Vorname', also beispielsweise 'Normalverbraucher, Otto'.Wichtig: die Rückgabe-Felder müssen NULL-terminiert sein und dürfen die maximaleLänge (16 KBytes inkl. Terminierung bei dem Rückgabewert, 128 Bytesinkl. Nullterminierung bei der Fehlerbeschreibung) nicht überschreiten.139


Callbacks und NotificationsLL_CMND_GETVIEWERBUTTONSTATEAufgabe:Aktivierung:Parameter:Über diesen Callback fragt <strong>List</strong> & <strong>Label</strong>, welchen Status der entsprechende Toolbar-Buttondes Echtdatenpreviews haben kann.Immer aktiviertHIWORD(lParam): Toolbutton IDLOWORD(lParam): Vom Viewer errechneter StatusRückgabewert (_lResult):Neuer StatusBedeutung0 keine Änderung1 enabled2 disabled-1 unsichtbarHinweise:Dieser Callback wird vom Echtdatenpreview aufgerufen.Menü-ID des Buttons Bedeutung1. Seite 102Vorige Seite 104Nächste Seite 105Letzte Seite 103Faktor 2 100Letzte Ansicht 101Ganze Seite 108Seite drucken 112Alle drucken 113Exit 114Senden An 115Beispiel:case LL_CMND_GETVIEWERBUTTONSTATE:switch (HIWORD(lParam)){140


Übersichtcase 112:// don't allow one-page printreturn(-1);}break;LL_CMND_HELPAufgabe:Ermöglicht es, ein externes Hilfesystem statt dem <strong>List</strong> & <strong>Label</strong>-eigenen einzubinden.Aktivierung:LlSetOption(hJob, LL_OPTION_CALLBACKMASK, | LL_CB_HELP);Parameter:HIWORD(lParam):WertBedeutungHELP_CONTEXT LOWORD(lParam) ist dann die Kontext-Nummer desHilfe-ThemasHELP_INDEX Index der Hilfedatei wurde angefordertHELP_HELPONHELP Der Benutzer will die Hilfe-ÜbersichtRückgabewert (_lResult):WertBedeutung0 Aufforderung an <strong>List</strong> & <strong>Label</strong>, seine Hilfe anzuzeigen1 Gibt an, dass <strong>List</strong> & <strong>Label</strong> nichts tun sollBeispiel:case LL_CMND_HELP:WinHelp(hWnd, "my.hlp", HIWORD(lPara), LOWORD(lPara));pSC._lResult = 1;break;Siehe auch:LlExprErrorLL_CMND_HOSTPRINTERAufgabe:Erlaubt es dem Benutzer, einen/zwei Device Kontexte von außen vorzugeben, die<strong>List</strong> & <strong>Label</strong> für den Designer und den Ausdruck verwendet.141


Callbacks und NotificationsAktivierung:Parameter:142LlSetOption(hJob, LL_OPTION_USEHOSTPRINTER, 1);lParam zeigt auf eine scLlPrinter-Struktur:_nSize: Größe der Struktur, sizeof(scLlPrinter)_bFirst: BOOL, gibt an, ob es sich um den Drucker für die erste Seite oder dieFolgeseiten handelt_nCmd: Unterkommando, s.u._hWnd: Fenster-Handle des Parent-Fensters, benötigt für LL_PRN_EDIT_hDC: DC-Speicher für die Funktionen LL_PRN_CREATE_DC, LL_PRN_DELETE_-DC und LL_PRN_RESET_DC_nOrientation: Speicher für die Druckseitenorientierung, verwendet für LL_PRN_-SET_ORIENTATION und LL_PRN_GET_ORIENTATION_bPhysPage: BOOL, gibt an, ob die physikalische Seite oder der bedruckbare Bereichgilt_nBufSize, _pszBuffer: Zeigt auf Speicher, in den die gewünschten Texte zu kopierensind. Benötigt für LL_PRN_GET_DEVICENAME, LL_PRN_GET_-DRIVERNAME und LL_PRN_GET_PORTNAME_nUniqueNumber: Einzigartige Nummer, die den Drucker kennzeichnet. Da <strong>List</strong>& <strong>Label</strong> im Verlauf seiner Arbeit eventuell mehrere DC's anfordert, kann über diesenWert bestimmt werden, für welchen Drucker das Kommando kommt._nUniqueNumberCompare: Die _nUniqueNummer des Druckers, der mit demgegenwärtigen (durch nUniqueNumber definierten) Drucker zu vergleichen ist._nPaperFormat: Papierformat (siehe DEVMODE.dmPaperSize)_xPaperSize: Papiergröße in mm/10 (horizontal)_yPaperSize: Papiergröße in mm/10 (vertikal)Rückgabewert (_lResult):abhängig von dem Unterkommando in _nCmd:WertLL_PRN_CREATE_DCLL_PRN_DELETE_DCBedeutungDrucker-DC soll erzeugt und in _hDC gespeichertwerden. Keine Änderung des Rückgabewerts.Der Drucker-DC (in _hDC) kann wieder zerstörtwerden. Keine Änderung des Rückgabewerts.LL_PRN_SET_ORIENTATION Der Drucker muss die gewünschte Ausrichtung in_nOrientation erhalten. Der Drucker-DC ist in _hDC


ÜbersichtWertBedeutunggespeichert. Keine Änderung des Rückgabewerts.LL_PRN_GET_ORIENTATION Die eingestellte Ausrichtung wird abgefragt undsoll in _nOrientation (DMORIENT_PORTRAIT oderDMORIENT_LANDSCAPE) zurückgegeben werden.Keine Änderung des Rückgabewerts.LL_PRN_EDITreserviert, nicht benutztLL_PRN_GET_-DEVICENAMEDer Name des Druckerdevices soll zurückgegebenwerden (optional). Keine Änderung des Rückgabewerts.Der Name des Druckertreibers soll zurückgegebenwerden (optional). Keine Änderung des Rückgabewerts.Der Name des Druckerports soll zurückgegebenwerden (optional). Keine Änderung des Rückgabewerts.Der Drucker-DC (in _hDC) soll zurückgesetzt werden(siehe API-Funktion ResetDC()). Der evtl. neueDC-Wert kann in _hDC wieder übergeben werden.Keine Änderung des Rückgabewerts.<strong>List</strong> & <strong>Label</strong> braucht diese Funktion, um zu entscheiden,ob der Erstseitendrucker mit dem Folgeseitendruckerübereinstimmt. Dazu müssen Siedie Drucker mit den IDs nUniqueNumber undnUniqueNumberCompare vergleichen. Rückgabewert1 für gleich, 0 für nicht gleich.Abfrage oder Setzen der Papiergröße in(_nPaperFormat, _xPaperSize und _yPaperSize)LL_PRN_GET_-DRIVERNAMELL_PRN_GET_PORTNAMELL_PRN_RESET_DCLL_PRN_COMPARE_-PRINTERLL_PRN_GET_-PAPERFORMAT,LL_PRN_SET_-PAPERFORMATHinweise:Dieser Callback wird nur in sehr seltenen Spezialfällen benötigt.Beispiel:case LL_CMND_HOSTPRINTER:{scLlPrinter* pPrn = scLlPrinter*)sc._lParam;if (pPrn->_nSize == sizeof(scLlPrinter)){switch (pPrn->_nCmd){case LL_PRN_CREATE_DC:UtilDebug("LL_PRN_CREATE_DC(%d)\n", pPrn->_bFirst);143


Callbacks und NotificationspPrn->_hDC = CreateDC("PSCRIPT.DRV", "SoftDev.PS","\\\\SRVCHK\\Softdev.PS", NULL);break;case LL_PRN_DELETE_DC:UtilDebug("LL_PRN_DELETE_DC(%d)\n", pPrn->_bFirst);DeleteDC(pPrn->_hDC);break;case LL_PRN_SET_ORIENTATION:UtilDebug("LL_PRN_SET_ORIENTATION(%d,%d)\n", pPrn->_bFirst,pPrn->_nOrientation);// ist in diesem einfachen Bsp.// nicht möglich...break;case LL_PRN_GET_ORIENTATION:UtilDebug("LL_PRN_GET_ORIENTATION(%d)\n", pPrn->_bFirst);// ist in diesem einfachen Bsp.// nicht möglich...break;case LL_PRN_GET_DEVICENAME:UtilDebug("LL_PRN_GET_DEVICENAME""(%d)\n", pPrn->_bFirst);chk_strncpy(pPrn->_pszBuffer,"TestDevice", pPrn->_nBufSize);break;case LL_PRN_GET_DRIVERNAME:UtilDebug("LL_PRN_GET_DRIVERNAME(%d)\n", pPrn->_bFirst);chk_strncpy(pPrn->_pszBuffer, "TestDriver", pPrn->_nBufSize);break;case LL_PRN_GET_PORTNAME:UtilDebug("LL_PRN_GET_PORTNAME(%d)\n", pPrn->_bFirst);chk_strncpy(pPrn->_pszBuffer, "TestPort", pPrn->_nBufSize);break;case LL_PRN_RESET_DC:UtilDebug("LL_PRN_RESET_DC (%d)\n", pPrn->_bFirst);// ist in diesem einfachen Bsp.// nicht möglich...break;case LL_PRN_COMPARE_PRINTER:// the same printer for first and// other pagessc._lReply = 1;// We would need a vector of printers// (using _nUniqueNumber) for// different printersbreak;}}}break;// chk_strncpy() ist hier eine "korrekte" strncpy-// Funktion, die den Zielstring immer '\0'-terminiertLL_CMND_CHANGE_DCPROPERTIES_CREATEAufgabe:Ermöglicht dem Wirtsprogramm, Eigenschaften des DCs zu verändern144


ÜbersichtParameter:lParam zeigt auf eine scLlPrinter-Struktur. Folgende Felder sind ausgefüllt:_nSize: Größe der Struktur, sizeof(scLlPrinter)_hDC: Drucker-DCRückgabewert (_lResult):Hinweise:Wird ignoriertDieser Callback wird nur in sehr seltenen Spezialfällen benötigt.Er wird aufgerufen, wenn <strong>List</strong> & <strong>Label</strong> einen Drucker-DC erzeugt hat (nach CreateDC()).LL_CMND_CHANGE_DCPROPERTIES_DOCAufgabe:Ermöglicht dem Wirtsprogramm, Eigenschaften des DCs zu verändern.Auch der Wert des Device Contexts selbst kann geändert werden (<strong>List</strong> & <strong>Label</strong>verwendet den Wert, der nach dem Aufruf in der Struktur steht).Parameter:lParam zeigt auf eine scLlPrinter-Struktur. Folgende Felder sind ausgefüllt:_nSize: Größe der Struktur, sizeof(scLlPrinter)_hDC: Drucker-DCRückgabewert (_lResult):Wird ignoriertHinweise:Dieser Callback wird nur in sehr seltenen Spezialfällen benötigt.Er wird aufgerufen, wenn <strong>List</strong> & <strong>Label</strong> StartDoc() aufgerufen hat.In _nPaperFormat steht die Job-ID, anhand derer man über den Druckspooler denFortschritt überprüfen kann. Siehe auch MSDN Artikel Q160129.LL_CMND_CHANGE_DCPROPERTIES_PAGEAufgabe:Ermöglicht dem Wirtsprogramm, Eigenschaften des DCs zu verändern.145


Callbacks und NotificationsParameter:Auch der Wert des Device Contexts selbst kann geändert werden (<strong>List</strong> & <strong>Label</strong>verwendet den Wert, der nach dem Aufruf in der Struktur steht).lParam zeigt auf eine scLlPrinter-Struktur. Folgende Felder sind ausgefüllt:_nSize: Größe der Struktur, sizeof(scLlPrinter)_hDC: Drucker-DCRückgabewert (_lResult):Hinweise:Wird ignoriertDieser Callback wird nur in sehr seltenen Spezialfällen benötigt.Er wird aufgerufen, wenn <strong>List</strong> & <strong>Label</strong> StartPage() aufgerufen hat.LL_CMND_MODIFYMENUAufgabe:146Callback, über den das Menü das <strong>List</strong> & <strong>Label</strong> anzeigt, verändert werden kann.Dieser Callback ist nur aus Kompatibilitätsgründen noch enthalten, um den Designerzu erweitern verwenden Sie bevorzugt LlDesignerAddAction.Aktivierung:Immer aktiviertParameter:lParam: menu handleHinweise:Diese Funktion wird aufgerufen, wenn <strong>List</strong> & <strong>Label</strong> das Menü anlegt, so dass dieMenüstruktur anpasst werden kann, um neue, eigene Funktionen hinzuzufügen,andere zu löschen etc.Die entsprechenden IDs finden Sie in der Datei MENUID.TXT in Ihrer <strong>List</strong> & <strong>Label</strong>Installation. Benutzerdefinierte Menü-IDs sollten im Bereich über 10100 angesiedeltwerden.Dieser Callback ist nur aus Kompatibilitätsgründen noch enthalten, um den Designerzu erweitern verwenden Sie bevorzugt LlDesignerAddAction.Beispiel:case LL_CMND_MODIFYMENU:DeleteMenu(_hMenu, IDM_HELP_CONTENTS, MF_BYCOMMAND);DeleteMenu(_hMenu, IDM_HELP_INDEX, MF_BYCOMMAND);DeleteMenu(_hMenu, IDM_HELP_HELPONHELP, MF_BYCOMMAND);break;


ÜbersichtLL_CMND_OBJECTAufgabe:Ermöglicht es, etwas vor und nach <strong>List</strong> & <strong>Label</strong> in oder neben das Objekt-Rechteck zu zeichnen, oder das Objekt während des Drucks zu verstecken.Diese Funktion ermöglicht viele Modifikationen an Objekten und ist sozusagendie "eierlegende Wollmilchsau" der Objektdarstellung.Aktivierung:LlSetOption(hJob, LL_OPTION_CALLBACKMASK, | LL_CB_OBJECT);Parameter:lParam zeigt auf eine scLlObject-Struktur:_nSize: Größe der Struktur, sizeof(scLlObject)_nType: Art des Objekts:WertLL_OBJ_TEXTLL_OBJ_RECTLL_OBJ_LINELL_OBJ_BARCODELL_OBJ_DRAWINGLL_OBJ_TABLELL_OBJ_RTFLL_OBJ_TEMPLATELL_OBJ_ELLIPSEObjektTextobjektRechteckLinienobjektBarcode-ObjektZeichnungTabelleRTF-ObjektVorlagen-BitmapEllipse/Kreis_lpszName: Bezeichner für das Objekt. Der im Designer vergegebene Name, alsoder Text, der in der Statuszeile des Designers für dieses Objekt ausgegebenwird, wenn es markiert ist._bPreDraw: TRUE bei Aufruf, vor dem Zeichnen des Objekts, FALSE bei Aufrufnach dem Zeichnen des Objekts_hPaintDC: Device Context für die Ausgaben_hRefDC: Device Context für <strong>Referenz</strong>en_rcPaint: Rechteck, in dem das Objekt gezeichnet wird. Der Mapping-Mode ist inden üblichen Zeichnungs-Einheiten, also mm/10, inch/100 oder inch/1000.Rückgabewert (_lResult):Wert von _bPreDraw_lResult147


Callbacks und NotificationsWert von _bPreDraw_lResultTRUE0: okay1: Objekt soll nicht gezeichnet/versteckt werdenFALSE immer 0Hinweise:In diesem Callback darf keine <strong>List</strong> & <strong>Label</strong>-Funktion aufgerufen werden, die Ausgabenzur Folge hat (LlPrint(), etc.)! Funktionen wie LlPrintGetCurrentPage() oderLlPrintGetOption() sind erlaubt.Siehe: Hinweise zur Benutzung von GDI-Objekten.Diese Funktion wird pro Objekt zwei Mal aufgerufen, einmal mit _bPreDraw =TRUE, dann mit _bPreDraw = FALSE._bPreDraw = TRUE:Verwendung: Man kann z.B. einen eigenen Hintergrund zeichnen oder das Objektverstecken.Beachten Sie, dass die Objekte von <strong>List</strong> & <strong>Label</strong> möglicherweise kleiner gezeichnetwerden als das Rechteck angibt, z.B. bei <strong>List</strong>enobjekten, die keine fixe Größebesitzen. Wenn Sie beim Aufruf _rcPaint verändern, hat dies Auswirkungen aufdie Größe des Objekts, denn das Objekt wird von <strong>List</strong> & <strong>Label</strong> in das hier angegebeneRechteck gezeichnet._bPreDraw = FALSE:Verwendung: Man kann z.B. einen eigenen Hintergrund und/oder Schatten zeichnen,denn erst dann ist die wahre Größe des Objekts bekannt. Das Rechteck _-rcPaint ist hier das korrekte Objekt-Rechteck. Wenn Sie beim Aufruf _rcPaint verändern,hat dies Auswirkungen auf angehängte Objekte, denn die Daten von _-rcPaint werden als Objektrechteck verwendet, das wiederum die Koordinatenräumlich angehängter Objekte beeinflusst!Beispiel:case LL_CMND_OBJECT:pSCO = (PSCLLOBJECT)pSC->_lParam;if (pSCO->_nType == LL_OBJ_RECT && !pSCO->_bPreDraw){FillRect(pSCO->_hPaintDC, pSCF->_rcPaint,GetStockObject(LTGRAY_BRUSH);}break;148


ÜbersichtLL_CMND_PAGEAufgabe:Ermöglicht es, zusätzliche Zeichnungen auf der Seite unterzubringen. Interessantist dies beispielsweise bei Etikettendruck, da man so zusätzliche Informationenauf eine Seite malen kann.Aktivierung:LlSetOption(hJob, LL_OPTION_CALLBACKMASK, | LL_CB_PAGE);Parameter:lParam zeigt auf eine scLlPage-Struktur:_nSize: Größe der Struktur, sizeof(scLlPage)_bPreDraw: TRUE bei Aufruf, bevor <strong>List</strong> & <strong>Label</strong> die Seite zeichnet. FALSE beiAufruf, nachdem <strong>List</strong> & <strong>Label</strong> die Seite gezeichnet hat._hPaintDC: Device Context für die Ausgaben_hRefDC: Device Context für <strong>Referenz</strong>enRückgabewert (_lResult):0Hinweise:In diesem Callback darf keine <strong>List</strong> & <strong>Label</strong>-Funktion aufgerufen werden, die Ausgabenzur Folge hat (LlPrint(), etc.)! Funktionen wie LlPrintGetCurrentPage() oderLlPrintGetOption() oder auch LlPrintEnableObject() sind erlaubt.Siehe: Hinweise zur Benutzung von GDI-Objekten.Diese Funktion wird pro Seite zwei Mal aufgerufen, einmal mit _bPreDraw =TRUE, dann mit _bPreDraw = FALSE.Die Seitengröße kann über die GetWindowExt()-Funktion bestimmt werden. BenutzenSie hier _hRefDC!Wenn Sie bei _bPreDraw=TRUE den Fenster-Origin des _hRefDC mit SetWindowOrg()verändern, wirkt sich das auf die gesamte Seite aus. Damit kann manz.B. einen Bundsteg für gerade/ungerade Seiten definieren. Diese Ausgabeverschiebungwirkt sich nur auf Echtdatenpreview oder -Druck aus, nicht jedoch fürden Designer-Preview.Beispiel:case LL_CMND_PAGE:pSCP = (PSCLLPAGE)pSC->_lParam;if (pSCP->_bPreDraw && (LlPrintGetCurrentPage(hJob) % 2) == 1)SetWindowOrg(pSCP->_hPaintDC,-100,0);break;149


Callbacks und NotificationsLL_CMND_PROJECTAufgabe:Ermöglicht es, zusätzliche Zeichnungen im Etiketten- oder Karteikarten-Projektunterzubringen.Dieser Callback tritt nur bei Etiketten- und Karteikartenprojekten auf. Bei <strong>List</strong>enobjektenwäre er mit LL_CMND_PAGE identisch.Aktivierung:LlSetOption(hJob, LL_OPTION_CALLBACKMASK, | LL_CB_-PROJECT);Parameter:lParam zeigt auf eine scLlProject-Struktur:_nSize: Größe der Struktur, sizeof(scLlProbject)150_bPreDraw: TRUE bei Aufruf, bevor <strong>List</strong> & <strong>Label</strong> die Seite zeichnet, FALSE beiAufruf, nachdem <strong>List</strong> & <strong>Label</strong> die Seite gezeichnet hat._bDesignerPreview: TRUE, wenn der Aufruf vom Designer-Preview stattfindet,FALSE, wenn der Aufruf während des Echtdaten-Preview oder des Drucks stattfindet._hPaintDC: Device Context für die Ausgaben_hRefDC: Device Context für <strong>Referenz</strong>en_rcPaint: Rechteck, in dem das Projekt gezeichnet werden soll. Der Mapping-Mode ist in den üblichen Zeichnungs-Einheiten, also mm/10, inch/100 oderinch/1000.Rückgabewert (_lResult):0Hinweise:In diesem Callback darf keine <strong>List</strong> & <strong>Label</strong>-Funktion aufgerufen werden, die Ausgabenzur Folge hat (LlPrint(), etc.)! Funktionen wie LlPrintGetCurrentPage() oderLlPrintGetOption() oder auch LlPrintEnableObject() sind erlaubt.Siehe: Hinweise zur Benutzung von GDI-Objekten.Diese Funktion wird pro Seite zwei Mal aufgerufen, einmal mit _bPreDraw =TRUE, dann mit _bPreDraw = FALSE.Beispiel:case LL_CMND_PROJECT:pSCP = (PSCLLPROJECT)pSC->_lParam;if (pSCP->_bPreDraw){FillRect(pSCL->_hPaintDC, pSCL->_rcPaint,


ÜbersichtGetStockObject(LTGRAY_BRUSH));}break;LL_CMND_SAVEFILENAMEAufgabe:Informiert die Anwendung darüber, dass der Benutzer das Projekt im Designergespeichert hat und liefert den Dateinamen.Parameter:lParam zeigt auf den nullterminierten Dateinamen.Rückgabewert (_lResult):0Beispiel:case LL_CMND_SAVEFILENAME:pszLastFilename = (LPCTSTR)lParam;LL_CMND_SELECTMENUAufgabe:Benachrichtigung, dass ein Menüpunkt/Toolbarbutton angewählt wurde.Aktivierung:Immer aktiviertParameter:lParam ist die Menü-ID des Menüpunkts (negative ID, wenn es ein Toolbar-Buttonist)Rückgabewert (_lResult):TRUE, wenn der Menüeintrag bearbeitet wurde, FALSE sonstBeispiel:case LL_CMND_SELECTMENU:if (lParam == IDM_MYMENU){// execute custom codereturn (TRUE);}break;LL_CMND_TABLEFIELDAufgabe:Ermöglicht es, die Farbgebung einzelner Tabellenfelder zu modifizieren.151


Callbacks und NotificationsAktivierung:LlSetOption(hJob, LL_OPTION_TABLE_COLORING, LL_COLORING_PROGRAM);Dadurch wird die alleinige Kontrolle der Farbgebung in Tabellen Ihrem Programmüberlassen (die entsprechenden Einstellungen im Tabellen-Eigenschaften-Dialogdes Designers verschwinden dann).oderLlSetOption(hJob, LL_OPTION_TABLE_COLORING, LL_COLORING_DONTCARE);Mit diesem Befehl lässt <strong>List</strong> & <strong>Label</strong> erst Ihr Programm den Hintergrund zeichnen,dann zeichnet es den Hintergrund bei Bedarf noch einmal mit dem im Designerdefinierten Feldmuster. Dadurch ist eine Art Kooperation zwischen dem <strong>Programmierer</strong>und dem Benutzer möglich.Parameter:lParam zeigt auf eine scLlTableField-Struktur:_nSize: Größe der Struktur, sizeof(scLlTableField)_nType: Art des Feldes:WertLL_TABLE_FIELD_HEADERLL_TABLE_FIELD_BODYLL_TABLE_FIELD_GROUPLL_TABLE_-FIELD_GROUPFOOTERLL_TABLE_FIELD_FILLLL_TABLE_FIELD_FOOTERBedeutungFeld ist in KopfzeileFeld ist in DatenzeileFeld ist in GruppenkopfFeld ist in GruppenfußFeld ist die Füll-Fläche, die entsteht, wenn dieTabelle feste Größe besitzt und unter der letztenDatenzeile noch etwas Freiraum bleibtFeld ist in Fußzeile152_hPaintDC: Device Context für die Ausgaben_hRefDC: Device Context für <strong>Referenz</strong>en_rcPaint: Rechteck, in dem das Feld gezeichnet werden soll. Der Mapping-Modeist in den üblichen Zeichnungs-Einheiten, also mm/10, inch/100 oder inch/1000._nLineDef: Die Nummer der Zeilendefinition, die ausgegeben wird._nIndex: Feldindex, 0-basiert (die erste Spalte hat als Index 0, die zweite 1, etc.)_rcSpacing: Werte der Zellen-AbständeRückgabewert (_lResult):0


ÜbersichtHinweise:In diesem Callback darf keine <strong>List</strong> & <strong>Label</strong>-Funktion aufgerufen werden, die Ausgabenzur Folge hat (LlPrint(), etc.)!Wenn Sie irgendein GDI-Objekt in diesen DC selektieren oder andere Änderungenvornehmen, z.B. des Mapping-Modes, sollten Sie die Änderungen vor der Beendigungder Routine wieder rückgängig machen. Tip: die API-Funktionen SaveDC(),RestoreDC() können bei komplexen Veränderungen sehr helfen (verwendeteFunktionen sind Windows-API-Funktionen).Beispiel:case LL_CMND_TABLEFIELD:pSCF = (PSCLLTABLEFIELD)pSC->_lParam;if (pSCF->_nIndex == 1){FillRect(pSCF->_hPaintDC, pSCF->_rcPaint,GetStockObject(LTGRAY_BRUSH);}pSC._lResult = 0;break;LL_CMND_TABLELINEAufgabe:Ermöglicht es, die Farbgebung einzelner Tabellenzeilen zu modifizieren, z.B. umeinen eigenen Zebramodus (jede zweite Zeile unterlegt) zu erzeugen.Aktivierung:LlSetOption(hJob, LL_OPTION_TABLE_COLORING, LL_COLORING_PROGRAM);Dadurch wird die alleinige Kontrolle der Farbgebung in Tabellen Ihrem Programmüberlassen! (die entsprechenden Einstellungsmöglichkeiten im Designer verschwindendann)oderLlSetOption(hJob, LL_OPTION_TABLE_COLORING, LL_COLORING_DONTCARE);Mit diesem Befehl lässt <strong>List</strong> & <strong>Label</strong> erst Ihr Programm den Hintergrund zeichnen,dann zeichnet es den Hintergrund bei Bedarf noch einmal mit dem im Designerdefinierten Feldhintergrund. Dadurch ist eine Art Kooperation zwischen <strong>Programmierer</strong>und Benutzer möglich.Parameter:lParam zeigt auf eine scLlTableLine-Struktur:_nSize: Größe der Struktur, sizeof(scLlTableLine)_nType: Art des Feldes:WertLL_TABLE_LINE_HEADERBedeutungKopfzeile153


Callbacks und NotificationsWertLL_TABLE_LINE_BODYLL_TABLE_FIELD_GROUPLL_TABLE_-FIELD_GROUPFOOTERLL_TABLE_LINE_FILLLL_TABLE_LINE_FOOTERBedeutungDatenzeileGruppenkopfGruppenfußFüll-Fläche, die entsteht, wenn die Tabelle festeGröße besitzt und unter der letzten Datenzeilenoch etwas Freiraum bleibtFußzeile_hPaintDC: Device Context für die Ausgaben_hRefDC: Device Context für <strong>Referenz</strong>en_rcPaint: Rechteck, in dem die Zeile gezeichnet werden soll. Der Mapping-Modeist in den üblichen Zeichnungs-Einheiten, also mm/10, inch/100 oder inch/1000._nPageLine: Zeilenindex. Bezeichnet die 0-basierte Zeilennummer der Zeile aufdieser Seite._nLine: Zeilenindex. Bezeichnet die 0-basierte Zeilennummer der Zeile im gesamtenAusdruck._bZebra: TRUE, wenn Benutzer Zebra-Modus gewählt hat.Rückgabewert (_lResult):0Hinweise:In diesem Callback darf keine <strong>List</strong> & <strong>Label</strong>-Funktion aufgerufen werden, die Ausgabenzur Folge hat (LlPrint(), etc.)!Siehe: Hinweise zur Benutzung von GDI-ObjektenBeispiel:case LL_CMND_TABLELINE:pSCL = (PSCLLTABLELINE)pSC->_lParam;if ((pSCL->_nPageLine % 2) == 1)FillRect(pSCL->_hPaintDC, pSCL->_rcPaint,GetStockObject(LTGRAY_BRUSH);pSC._lReply = 0;break;154


ÜbersichtLL_CMND_VARHELPTEXTAufgabe:Parameter:Ermöglicht eigene Beschreibungstexte zu Variablen und Feldern zu definieren, dieim Formelassistenten angezeigt werden.lParam zeigt auf den String, der den Namen der Variablen oder des Feldes enthältRückgabewert (_lResult):_lReply muss auf den Erklärungstext zeigenBeispiel:case LL_CMND_VARHELPTEXT:sVariableDescr = (LPCSTR)pscCallback->_lParam;// Checkroutinen für Variablestrcpy(szHelpText, "Variable x für Aufgabe y");pscCallback->_lreply = (LPARAM)szHelpText;break;LL_NTFY_VIEWERBTNCLICKEDAufgabe:Benachrichtigung, dass ein Button im Echtdatenpreview gedrückt wurde.Aktivierung:Immer aktiviertParameter:lParam: Toolbutton IDRückgabewert (_lResult):WertBedeutung1 Button ignorieren0 Default-Funktion ausführenHinweise:Diese Funktion wird vom Echtdatenpreview von <strong>List</strong> & <strong>Label</strong> aufgerufen.ID's siehe LL_CMND_GETVIEWERBUTTONSTATE.Beispiel:switch (wParam){case LL_NTFY_VIEWERBTNCLICKED:switch (lParam){155


Callbacks und Notifications}case 112:// beep on one-page print and don't execute it!MessageBeep(-1);return(1);}break;LL_INFO_METERAufgabe:Benachrichtigung, dass eine möglicherweise länger dauernde Operation mit denObjekten durchgeführt wird.Aktivierung:Immer aktiviertParameter:lParam zeigt auf eine scLlMeterInfo-Struktur:_nSize: Größe der Struktur_hWnd: Handle des <strong>List</strong> & <strong>Label</strong> Hauptfensters_nTotal: Gesamtzahl der Objekte_nCurrent: gegenwärtig bearbeitetes Objekt_nJob: Aufgabe, mit der <strong>List</strong> & <strong>Label</strong> beschäftigt ist:AufgabeLL_METERJOB_SAVELL_METERJOB_LOADLL_METERJOB_-CONSISTENCYCHECKBedeutungSpeichern der ObjekteLaden der ObjekteKonsistenzprüfung der ObjektlisteHinweise:Durch diesen Callback kann z.B. ein Fortschrittsbalken angezeigt werden. DerProzentwert einer Fortschrittsanzeige berechnet sich über MulDiv(100, _nCurrent,_nTotal).Beispiel:// Die Funktionen WaitDlg... müssen durch eigene Funktionen// ersetzt werden156switch (wParam){case LL_INFO_METER:{


Übersicht}scLlMeterInfo* pMI = (scLlMeterInfo*)lParam;static hJob hMeterJob = 0;if (pMI->_nSize == sizeof(scLlMeterInfo)) // is actual version?{// do I have to do something?if (pMI->_nTotal > 0){// get parent window handle for DialogHWND hWndParent = pMI->_hWnd ? pMI->_hWnd : hwndMyFrame;if (pMI->_nCurrent == 0){// open meter bar with 0%!hMeterJob = WaitDlgStart(hWndParent, "wait a moment", 0);}else{// end:if (pMI->_nCurrent == pMI->_nTotal){// end meter bar!WaitDlgEnd(hMeterJob);}else// somewhere in between 0 and 100{// set meter value to MulDiv(100,_ nCurrent, _nTotal)WaitDlgSetText(hMeterJob, "still working...",MulDiv(100, pMI->_nCurrent, pMI->_nTotal));}}}}}break;LL_INFO_PRINTJOBSUPERVISIONAufgabe:Überwachung des DruckjobsParameter:lParam zeigt auf eine scLlPrintJobInfo-Struktur:_nSize: Größe der Struktur_hLlJob: Job-Handle des LL-Jobs, der den Druck auslöste_szDevice: Name des Druckers_dwJobID: Job-ID (nicht die Job-ID des Druckers, sondern eine globale, vergebenvon <strong>List</strong> & <strong>Label</strong>)_dwState: Kombination von Job-Zustand-Flags (JOB_STATUS_-Konstanten vonWINSPOOL.H)157


Callbacks und NotificationsHinweise:Diese Funktion ist nicht unter Windows 98 verfügbar, und auch der Detail-Gradhängt vom Druckerspooler ab. Beachten Sie, dass alle Teile der Übertragungskette(also z.B. Druckserver und Client) NT-basierende Betriebssysteme benötigen(NT4/2000/XP/2003/Vista).Die dwState-Flags sind wie folgt definiert:#define JOB_STATUS_PAUSED0x00000001#define JOB_STATUS_ERROR0x00000002#define JOB_STATUS_DELETING0x00000004#define JOB_STATUS_SPOOLING0x00000008#define JOB_STATUS_PRINTING0x00000010#define JOB_STATUS_OFFLINE0x00000020#define JOB_STATUS_PAPEROUT0x00000040#define JOB_STATUS_PRINTED0x00000080#define JOB_STATUS_DELETED0x00000100#define JOB_STATUS_BLOCKED_DEVQ 0x00000200#define JOB_STATUS_USER_INTERVENTION 0x00000400#define JOB_STATUS_RESTART0x00000800LL_NTFY_EXPRERRORAufgabe:Benachrichtigung der Applikation, dass ein Ausdruck einen Fehler hatte.Aktivierung:Immer aktivParameter:lParam zeigt auf den FehlertextRückgabewert (_lResult):0Hinweise:Da LlExprError() beim Laden eines Projekts (auch für den Druck) nur bedingt zumErfolg führt (da der interne Formelparser evtl. beim Aufruf der Funktion schon einevöllig andere Formel geparst hat und somit evtl. gar keinen Fehler mehr "aktiv"hat), kann man über diesen Callback Fehlermeldungen sammeln und dann nachLlPrintStart() dem Benutzer melden.158


ÜbersichtLL_NTFY_FAILSFILTERAufgabe:Aktivierung:Parameter:Benachrichtigung, dass der Datensatz, der gerade an <strong>List</strong> & <strong>Label</strong> übergebenwurde, nicht ausgedruckt wurde, da er der Filterbedingung nicht entsprach.Immer aktivlParam hat keine Bedeutung.Rückgabewert (_lResult):0Hinweise:In diesem Callback darf keine <strong>List</strong> & <strong>Label</strong>-Funktion aufgerufen werden, die Ausgabenzur Folge hat (LlPrint(), etc.)!Dient zum Setzen einer globalen Variable; kann aber auch über LlPrintDidMatch-Filter() überflüssig gemacht werden.Beispiel:case LL_NTFY_FAILSFILTER:bFails = TRUE;break;LL_QUERY_DESIGNERACTIONSTATEAufgabe:Über diesen Callback fragt <strong>List</strong> & <strong>Label</strong> den Zustand von Benutzerdefinierten Aktionen(vgl. LlDesignerAddAction) ab. Sie können die Aktionen auf diese Weise jenach Notwendigkeit deaktivieren.Aktivierung:Immer aktivParameter:HIWORD(lParam): die (von Ihnen selbst vergebene) ID der AktionLOWORD(lParam): Vom Designer errechneter StatusRückgabewert (_lResult):WertBedeutung1 Aktion ist aktiv2 Aktion ist inaktiv159


Callbacks und NotificationsBeispiel:case LL_QUERY_DESIGNERACTIONSTATE:_lResult = (bEnabled? 1 : 2);break;160


Grundlagen11. Projekt-Parameter<strong>List</strong> & <strong>Label</strong> ermöglicht es, projektspezifische Parameter zu setzen, den Benutzer gegebenenfallseinstellen zu lassen und diese beim Druck wieder abzufragen.Beispielsweise verwendet <strong>List</strong> & <strong>Label</strong> selbst diese Parameter, um die wichtigen Einstellungenfür Fax und eMails zu setzen. Genauso kann aber ein Benutzerprogramm dadurchInformationen in einem Projekt speichern, um diese später wieder abfragen zukönnen – bei Bedarf sogar berechnet.11.1. Grundlagen11.1.1. ParametertypenEs gibt verschiedene Typen von Parametern, die sich durch den ÜbergabeparameternFlags bei LlSetDefaultProjectParameter() unterscheiden. Jeweils eins der drei Flag-Alternativen FORMULA/VALUE, PUBLIC/PRIVATE und GLOBAL/LOCAL muß angegebenwerden:LL_PARAMETERFLAG_FORMULA (default)Der Parameter ist eine Formel, die beim Druck ausgewertet wird. Über LlPrint-GetProjectParameter() bekommt man den berechneten Wert zurück.LL_PARAMETERFLAG_VALUEDer Parameter ist ein fester Wert. Über LlPrintGetProjectParameter() bekommtman diesen Wert unverändert zurück.LL_PARAMETERFLAG_PUBLIC (default)Der Parameter erscheint im Designer im Projekt>Einstellungen-Dialog, in demder Benutzer die Formel bzw. den Wert ändern kann.LL_PARAMETERFLAG_PRIVATEDer Parameter kann durch den Benutzer (d.h. im Projekt-Designer) nicht geändertwerden.LL_PARAMETERFLAG_GLOBAL (default)Der Parameter wird in die Druck-Projekt-Parameterliste übernommen und ggf.in der Vorschaudatei gespeichert und kann daraus wieder abgerufen werden(LlStgsysGetJobOptionStringEx()).LL_PARAMETERFLAG_LOCALDer Parameter wird nicht in die Druck-Projekt-Parameterliste übernommen undin der Vorschaudatei gespeichert, da er nur für den lokalen Benutzer oder Rechnergültig ist. Diese Werte existieren nur in der DefaultProjectParameter-<strong>List</strong>e,161


Projekt-Parametersind also eine Art lokale Variable (die aber auch an die über LlPreviewDisplay()angezeigte Vorschau übergeben werden, da diese als "lokal" angesehen werdenkann).Wenn die Parameter über LlSetDefaultProjectParameter() definiert werden, sind das dieVoreinstellungen, die der Benutzer gegebenenfalls (wenn LL_PARAMETERFLAG_PUBLICgesetzt ist) seinen Bedürfnissen entsprechend einstellen kann.Wird das Projekt dann geladen (LlDefineLayout(), LlPrint[WithBox]Start()), werden dieParameter durch die im Projekt gespeicherten Formeln oder Werte ersetzt, d.h. überschrieben.Um dies zu verdeutlichen, heißt die API "DefaultParameters". UngeänderteParameter werden im Projektlayoutfile nicht gespeichert, so dass spätere Änderungender Default-Parameter für den Druck übernommen werden.Es darf nicht mehrere Parameter mit gleichem Namen, aber verschiedenem Typ geben!Der Typ wird durch LlSetDefaultProjectParameter() festgelegt.11.1.2. Druck des ProjektsNach dem Start des Drucks über LlPrint[WithBox]Start() sind die für den Druck verbindlichenWerte über LlPrintGetProjectParameter() abfragbar – entweder die Formel oder derberechnete Wert.Man kann auch über LlPrintSetProjectParameter() den Wert noch einmal ändern odersogar neue Parameter hinzufügen. Dies macht dann Sinn, wenn man die Werte späternoch braucht, denn sie werden – nach einer eventuellen Formelevaluierung - in der Vorschaudateigespeichert und können über LlStgsysGetJobOptionStringEx() abgefragtwerden. Somit kann man eigene Parameter dauerhaft darin speichern. Dort beginnen dieParameter mit "ProjectParameter." vor dem definierten Namen.11.1.3. Vordefinierte Projektparameter<strong>List</strong> & <strong>Label</strong> verwendet Projektparameter zum Versand per Fax oder eMail. Der Benutzerkann die Parameter übernehmen oder abändern, z.B. den Fax- oder eMail-Empfängerüber eine Formel, die von der Applikation angebotene Variablen enthält, übernehmen.Da <strong>List</strong> & <strong>Label</strong> bei der Übergabe der Fax- bzw. Mail-Parameter eine Formel erwartet,kann es notwendig sein, den übergebenen Wert als Zeichenkette zu maskieren (dann,wenn ein fester Wert übergeben werden soll).Beispiel:LlPrintSetProjectParameter(hJob, "LL.FAX.RecipNumber","""+497531906018""", 0);LL.FAX.QueueLL.FAX.RecipNumberLOCAL, PRIVATEGLOBAL, PUBLIC[LL_OPTIONSTR_FAX_RECIPNUMBER]162


GrundlagenLL.FAX.RecipNameLL.FAX.SenderNameLL.FAX.SenderCompanyLL.FAX.SenderDepartmentLL.FAX.SenderBillingCodeLL.MAIL.ToLL.MAIL.CCLL.MAIL.BCCLL.MAIL.FromLL.MAIL.ReplyToLL.MAIL.SubjectLL.MAIL.ProviderGLOBAL, PUBLIC[LL_OPTIONSTR_FAX_RECIPNAME]GLOBAL, PRIVATE[LL_OPTIONSTR_FAX_SENDERNAME]GLOBAL, PRIVATE[LL_OPTIONSTR_FAX_SENDERCOMPANY]GLOBAL, PRIVATE[LL_OPTIONSTR_FAX_SENDERDEPT]GLOBAL, PRIVATE[LL_OPTIONSTR_FAX_SENDERBILLINGCODE]GLOBAL, PUBLIC [LL_OPTIONSTR_MAILTO]GLOBAL, PUBLIC[LL_OPTIONSTR_MAILTO_CC]GLOBAL, PUBLIC[LL_OPTIONSTR_MAILTO_BCC]GLOBAL, PUBLICGLOBAL, PUBLICGLOBAL, PUBLIC[LL_OPTIONSTR_MAILTO_SUBJECT]benutzerdefinierbar. Mögliche Werte:leer (Versand über internes MAPI)"SMAPI" (über CMMX02.DLL)"XMAPI" (über CMMX02.DLL)"SMTP" (über CMMX02.DLL)LL.MAIL.SMTP.ServerTimeout BenutzerdefinierbarLL.MAIL.SMTP.ServerAddress BenutzerdefinierbarLL.MAIL.SMTP.ServerPortLL.MAIL.SMTP.ServerUserLL.MAIL.SMTP.ServerPasswordLL.MAIL.SMTP.LogonNameLL.MAIL.SMTP.ProxyAddressLL.MAIL.SMTP.ProxyPortBenutzerdefinierbarBenutzerdefinierbarBenutzerdefinierbarBenutzerdefinierbarBenutzerdefinierbarBenutzerdefinierbar163


Projekt-ParameterLL.MAIL.SMTP.ProxyUserLL.MAIL.SMTP.ProxyPasswordLL.MAIL.SMTP.ProxyTypeLL.MAIL.SMTP.LogonDomainBenutzerdefinierbarBenutzerdefinierbarBenutzerdefinierbarBenutzerdefinierbarParameter, die von der Applikation vor LlDefineLayout() nicht definiert werden, oder mitdem LOCAL-Flag definiert wurden, sind nicht vom Benutzer einstellbar.Beispielsweise macht es bei Adressdaten Sinn, wenn die Applikation "LL.MAIL.To" überdie eMail-Adressen-Variable (hier "EMAIL") aus der Datenbank definiert:LlSetDefaultProjectParameter(hJob,"LL.MAIL.To","EMAIL",0);Der Benutzer kann dann über die (für dieses Beispiel angenommenen) Felder"VORNAME" und "NAME" den Empfänger abändern zuVORNAME + " " + NAME + " "um die Adresse zu "verschönern".Das Vorschau-Control übernimmt automatisch die Werte aus LL.FAX.* und LL.MAIL.*.Zudem werden die Werte auch an die Exportmodule weitergegeben, so dass auch diesedie gewählten Einstellungen berücksichtigen.Beachten Sie in diesem Zusammenhang die Verhaltensänderung der Exportmodulegegenüber Versionen bis <strong>List</strong> & <strong>Label</strong> 9: wenn der Benutzer im Einstellungsdialog eineeMailadresse angibt, so erfolgt der Versand des Exportergebnisses an diese Adresse,unabhängig von den per LlXSetParameter() gemachten Einstellungen. Wir empfehlen,die eMailoptionen ausschließlich über die Projekt-Parameter API vorzunehmen. UnveränderteProjekte verhalten sich unter neuen <strong>List</strong> & <strong>Label</strong>-Versionen allerdings genau wiebisher.11.1.4. Automatische FormularspeicherungÜber die Projektparameter ist es auch möglich bei Verwendung von Formularelementeneine automatische Speicherung bei Beenden der Vorschau zu realisieren. Hierzu könnenSie folgende Projektparameter verwenden:SaveAs.FormatSaveAs.FilenameSaveAs.ShowDialogSaveAs.NoSaveQueryGewünschtes Ausgabeformat, z.B. "XML"Ausgabedateiname, z.B. "test.xml"Hierüber kann der Speichern-Dialog ein- ("1") bzw. ausgeschaltetwerden ("0")Unterdrückt die Abfrage, ob die Datei beim Schliessengespeichert werden soll oder nicht164


GrundlagenBeispiel:LlPrintSetProjectParameter(hJob,"SaveAs.Format","XML",LL_PARAMETERFLAG_VALUE);LlPrintSetProjectParameter(hJob,"SaveAs.Filename","test.xml",LL_PARAMETERFLAG_VALUE);LlPrintSetProjectParameter(hJob,"SaveAs.ShowDialog","0",LL_PARAMETERFLAG_VALUE);LlPrintSetProjectParameter(hJob,"SaveAs.NoSaveQuery","1",LL_PARAMETERFLAG_VALUE);165


Beschreibung der API-Funktionen12. Beschreibung der API-FunktionenLlAddCtlSupportSyntax:INT LlAddCtlSupport(HWND hWnd, UINT32 nFlags, LPCTSTR lpszInifile);Aufgabe:Parameter:Übertragen von <strong>combit</strong>-Dialogstilen auf andere Applikationen.hWnd: Window-Handle des ProgrammsnFlags:WertLL_CTL_ADDTOSYSMENULL_CTL_ALSOCHILDRENLL_CTL_-CONVERTCONTROLSBedeutungErweiterung des Systemmenüs des Programmsum eine DialogstilartauswahlAutomatische Übertragung der Dialogstile auf dieChild-FensterDamit auch bei Thunder frame Controls (VB) korrektgezeichnet werden.Bei Bedarf jeweils mit 'oder' verknüpfbar.lpszInifile: Name einer gültigen Ini-Datei oder Registryschlüssel. Empfehlung:nicht verwenden, sondern leer lassen.Rückgabewert:FehlercodeHinweise:Ermöglicht es, auch z.B. die Serverapplikation mit anderen Dialogstilarten zu versorgen.Beispiel:LlAddCtlSupport(hWMain, LL_CTL_ALSOCHILDREN | LL_CTL_CONVERTCONTROLS,"x.ini");Siehe auch:LlSetDlgboxModeLlSetDlgboxModeLlCreateSketchSyntax:INT LlCreateSketch(HLLJOB hJob, UINT nObjType, LPCTSTR lpszObjName);166


GrundlagenAufgabe:Parameter:Erzeugt die Skizzendatei für ein Projekt, die in dem Dateiauswahl-Dialog angezeigtwerden kann.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenObjType:WertLL_PROJECT_LABELLL_PROJECT_CARDLL_PROJECT_LISTBedeutungfür Etikettenfür Karteikartenfür <strong>List</strong>enlpszObjName: Projektdateiname mit PfadangabeHinweise:Dieser Befehl ist dann interessant, wenn die Skizzen-Dateien nicht mit ausgeliefertwerden soll. Diese kann dann online, d.h. z.B. bei der Installation, erstelltwerden.Rückgabewert:FehlercodeSiehe auch:LlSelectFileDlgTitleExLlDbAddTableSyntax:INT LlDbAddTable(HLLJOB hJob, LPCTSTR pszTableID,LPCTSTR pszDisplayName);Aufgabe:Meldet eine Tabelle für das Design und den Druck an. Die Tabelle steht dem Benutzerdann im Designer zur Verfügung und kann zur Druckzeit von <strong>List</strong> & <strong>Label</strong>angefordert werden.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlepszTableID: ID der Tabelle. Diese wird bei LlPrintDbGetCurrentTable zurückgeliefert,wenn die Tabelle gedruckt werden soll. Wenn Sie einen Leerstring oderNULL übergeben, wird der Tabellenpuffer gelöscht.167


Beschreibung der API-FunktionenpszDisplayName: Name der Tabelle wie er im Designer angezeigt werden soll.Wird nur zur Anzeige verwendet und nicht im Projektfile gespeichert.. Kann auchNULL sein, in diesem Falle wird der zweite Parameter auch für die Anzeige imDesigner verwendet.Rückgabewert:FehlercodeHinweise:Beachten Sie die Hinweise im Kapitel "4. Ansteuerung des Berichtscontainer-Objekts".Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);LlDbAddTable(hJob, "", NULL);LlDbAddTable(hJob, "Orders", NULL);LlDbAddTable(hJob, "OrderDetails", NULL);LlJobClose(hJob);Siehe auch:LlDbAddTableSortOrder, LlDbAddTableRelation, LlPrintDbGetCurrentTable,LlPrintDb-GetCurrentTableSortOrder, LlPrintDbGetCurrentTableRelationLlDbAddTableRelationSyntax:INT LlDbAddTableRelation(HLLJOB hJob, LPCTSTR pszTableID,LPCTSTR pszParentTableID, LPCTSTR pszRelationID,LPCTSTR pszRelationDisplayName);Aufgabe:Meldet eine Beziehung zwischen zwei Tabellen für das Design und den Druck an.Die Tabelle steht dem Benutzer dann im Designer als Untertabelle der Elterntabellezur Verfügung und kann zur Druckzeit von <strong>List</strong> & <strong>Label</strong> angefordert werden.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlepszTableID: ID der Kindtabelle. Diese muss mit der bei LlDbAddTable übergebenenID übereinstimmen.pszParentTableID: ID der Elterntabelle. Diese muss mit der bei LlDbAddTableübergebenen ID übereinstimmen.pszRelationID: ID der Relation. Diese wird bei LlPrintDbGetCurrentTableRelationzurückgeliefert, wenn die Kindtabelle gedruckt werden soll.168


GrundlagenpszRelationDisplayName: Name der Relation wie er im Designer angezeigt wird.Wird nur zur Anzeige verwendet und nicht im Projektfile gespeichert.. Kann auchNULL sein, in diesem Falle wird der zweite Parameter auch für die Anzeige imDesigner verwendet.Rückgabewert:FehlercodeHinweise:Beachten Sie die Hinweise im Kapitel "4. Ansteuerung des Berichtscontainer-Objekts". Zum Aufrufzeitpunkt müssen die Eltern- und Kindtabelle bereits mitLlDbAddTable angemeldet worden sein.Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);LlDbAddTable(hJob, "Orders", NULL);LlDbAddTable(hJob, "OrderDetails", NULL);LlDbAddTableRelation(hJob, "OrderDetails", "Orders","Orders2OrderDetails", NULL);LlJobClose(hJob);Siehe auch:LlDbAddTable, LlDbAddTableSortOrder, LlPrintDbGetCurrentTable, LlPrintDbGet-CurentTableSortOrder, LlPrintDbGetCurrentTableRelationLlDbAddTableSortOrderSyntax:INT LlDbAddTableSortOrder(HLLJOB hJob, LPCTSTR pszTableID,LPCTSTR pszSortOrderID, LPCTSTR pszSortOrderDisplayName);Aufgabe:Meldet eine Sortierung einer Tabelle für das Design und den Druck an. Die Sortierungsteht dem Benutzer dann im Designer zur Verfügung und kann zur Druckzeitvon <strong>List</strong> & <strong>Label</strong> angefordert werden.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlepszTableID: ID der Tabelle, für die die Sortierung bereitgestellt wird. Diese mussmit der bei LlDbAddTable übergebenen ID übereinstimmen.pszSortOrderID: ID der Sortierung. Diese wird bei LlPrintDbGetCurrentTableSortOrderzurückgeliefert, wenn die Tabelle mit der entsprechenden Sortierung gedrucktwerden soll.169


Beschreibung der API-FunktionenpszRelationDisplayName: Name der Sortierung wie er im Designer angezeigtwerden soll. Wird nur zur Anzeige verwendet und nicht im Projektfile gespeichert..Kann auch NULL sein, in diesem Falle wird der zweite Parameter auch fürdie Anzeige im Designer verwendet.Rückgabewert:Hinweise:FehlercodeBeachten Sie die Hinweise im Kapitel "4. Ansteuerung des Berichtscontainer-Objekts". Zum Aufrufzeitpunkt muss die Tabelle bereits mit LlDbAddTable angemeldetworden sein.Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);LlDbAddTable(hJob, "Orders", NULL);LlDbAddTableSortOrder(hJob, "Orders", "Name ASC", "Name [+]");LlJobClose(hJob);Siehe auch:LlDbAddTable, LlDbAddTableRelation, LlPrintDbGetCurrentTable, LlPrintDbGet-Current-TableSortOrder, LlPrintDbGetCurrentTableRelationLlDbSetMasterTableSyntax:INT LlDbSetMasterTable(HLLJOB hJob, LPCTSTR pszTableID);Aufgabe:Meldet eine Tabelle als Master-Tabelle an. Findet Verwendung, wenn die Master-Daten (z.B. der Adressat einer Rechnung) als Variablen definiert werden. Damitdie passenden Unterdaten (z.B. die Rechnungsposten) auch direkt im Tabellenobjekteingefügt werden können, ohne die Rechnungs-Tabelle als Elterntabelle zuverwenden.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlepszTableID: ID der Tabelle, die als Mastertabelle verwendet werden soll. Diesemuss mit der bei LlDbAddTable übergebenen ID übereinstimmen.Rückgabewert:Fehlercode170


GrundlagenHinweise:Beachten Sie die Hinweise im Kapitel "4. Ansteuerung des Berichtscontainer-Objekts". Zum Aufrufzeitpunkt muss die Tabelle bereits mit LlDbAddTable angemeldetworden sein.Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);LlDbAddTable(hJob, "Orders", NULL);LlDbSetMasterTable(hJob, "Orders");LlJobClose(hJob);Siehe auch:LlDbAddTable, LlDbAddTableRelation, LlPrintDbGetCurrentTable, LlPrintDbGet-Current-TableSortOrder, LlPrintDbGetCurrentTableRelationLlDebugOutputSyntax:void LlDebugOutput(INT nIndent, LPCTSTR pszText);Aufgabe:Gibt den angegebenen Text auf DEBWIN2 aus.Parameter:nIndent: Einrückung für FolgezeilenpszText: auszugebender TextHinweise:Der Parameter nIndent ist für die Einrückung der Folgezeilen zuständig, d.h. einBefehl mit Einrückung +1 sollte irgendwann mit einem Befehl mit -1 "gepaart"werden.So können Verschachtelungen Ihrer Ausgaben im Debug-Output realisiert werden.Beachten Sie, dass Sie – um die Ausgaben auch zu sehen – die Debugausgabenüber LlSetDebug() einschalten müssen.Beispiel:HLLJOB hJob;LlSetDebug(LL_DEBUG_CMBTLL);LlDebugOutput(+1, "Versionsnummer holen:");hJob = LlJobOpen(0);v = LlGetVersion(LL_VERSION_MAJOR);LlJobClose(hJob);LlDebugOutput(-1, "Versionsnummer geholt");171


Beschreibung der API-Funktionengibt in etwa folgendes auf dem Debugging-Output aus:Versionsnummer holen:@LlJobOpen(0)=1@LlGetVersion(1)=13@LlJobClose(1)Versionsnummer ist daSiehe auch:LlSetDebug, Debwin2.exeLlDefineChartFieldExtSyntax:INT LlDefineChartFieldExt(HLLJOB hJob, LPCTSTR lpszName,LPCTSTR lpszCont, INT32 lPara, LPVOID lpPara);Aufgabe:Definiert ein Chart-Feld und dessen Inhalt. Chart-Felder werden beispielsweisefür Charts in Tabellen benötigt.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: Zeiger auf ANSIZ-Zeichenkette mit FeldnamelpszCont: Zeiger auf ANSIZ-Zeichenkette mit FeldinhaltlPara: FeldtyplpPara: für spätere Erweiterungen, muss NULL oder "" (Leerstring) sein (sieheLlDefineFieldExt)Rückgabewert:FehlercodeHinweise:Es gelten die allgemeinen Hinweise von Abschnitt "Variablen und Felder in <strong>List</strong> &<strong>Label</strong>".Siehe auch:LlDefineChartFieldStart, LlEnumGetFirstChartField, LlPrintDeclareChartRowLlDefineChartFieldStartSyntax:void LlDefineChartFieldStart(HLLJOB hJob);172


GrundlagenAufgabe:Parameter:Hinweise:Siehe auch:Leert den DLL-internen Feldpuffer, um alte Definitionen von Chart-Feldern zu löschen.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleDie Hinweise zu LlDefineVariableStart() gelten auch für diese Funktion.Wenn die Funktion LlPrintIsChartFieldUsed() verwendet wird, darf diese Funktionnur vor dem Laden des Projekts aufgerufen werden, da LlDefineChartFieldStart()auch den "Used"-Status zurücksetzt.LlDefineChartFieldExt, LlEnumGetFirstChartField, LlPrintDeclareChartRowLlDefineFieldSyntax:INT LlDefineField(HLLJOB hJob, LPCTSTR lpszName, LPCTSTR lpszCont);Aufgabe:Parameter:Definiert ein <strong>List</strong>enfeld und dessen Inhalt.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: Zeiger auf ANSIZ-Zeichenkette mit FeldnamelpszCont: Zeiger auf ANSIZ-Zeichenkette mit FeldinhaltRückgabewert:Hinweise:FehlercodeEs gelten die allgemeinen Hinweise von Abschnitt "Variablen und Felder in <strong>List</strong> &<strong>Label</strong>".Diese Funktion definiert ein Textfeld, sie kann beliebig mit den anderen LlDefine-Field...()-Funktionen gemischt werden.LlDefineField() ist identisch mit LlDefineFieldExt(..., LL_TEXT, NULL).Folgende Felder sind von <strong>List</strong> & <strong>Label</strong> vorgegebenen Felder sind bei LlDefine-Field() aufgeführt.FeldBedeutung173


Beschreibung der API-FunktionenFeldLL.CountDataThisPageLL.CountDataLL.CountPrintedDataThisPageLL.CountPrintedDataLL.FCountDataThisPageLL.FCountDataLL.FCountPrintedDataThisPageLL.FCountPrintedDataBedeutungNumerisch, Fußzeilenfeld, definierte Datensätzepro SeiteNumerisch, Fußzeilenfeld, definierte DatensätzegesamtNumerisch, Fußzeilenfeld, gedruckte Datensätzepro SeiteNumerisch, Fußzeilenfeld, gedruckte DatensätzegesamtNumerisch, definierte Datensätze pro SeiteNumerisch, definierte Datensätze gesamtNumerisch, gedruckte Datensätze pro SeiteNumerisch, gedruckte Datensätze gesamtDer Unterschied von "definierten" zu "gedruckten" Datensätzen besteht darin,dass der Benutzer einen Satzfilter auf die Tabelle anwenden kann, so dass mit jedemvom Programm gesendeten Datensatz sich die "definierten" Zahlen erhöhen,aber nicht unbedingt die "gedruckten".Diese Funktion kann beliebig mit LlDefineFieldExt() gemischt werden, LlDefine-Field() ist identisch mit LlDefineFieldExt(..., LL_TEXT, NULL).Beispiel:hJob hJob;hJob = LlJobOpen(0);LlDefineFieldStart(hJob);LlDefineField(hJob, "Name", "Normalverbraucher");LlDefineField(hJob, "Vorname", "Otto");LlDefineFieldExt(hJob, "Ort", "Konstanz", LL_TEXT, NULL);LlDefineFieldExt(hJob, "PLZ", "*78462*", LL_BARCODE_3OF9);LlJobClose(hJob);Siehe auch:LlDefineFieldStart, LlDefineField, LlDefineFieldExt, LlDefineFieldExtHandleLlDefineFieldExtSyntax:INT LlDefineFieldExt(HLLJOB hJob, LPCTSTR lpszName, LPCTSTR lpszCont,INT32 lPara, LPVOID lpPara);Aufgabe:Definiert ein <strong>List</strong>enfeld und dessen Inhalt.174


GrundlagenParameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: Zeiger auf ANSIZ-Zeichenkette mit FeldnamelpszCont: Zeiger auf ANSIZ-Zeichenkette mit FeldinhaltlPara: Feldtyp, bei Bedarf ´oder´ verknüpft mit (s.u.)lpPara: für spätere Erweiterungen, muss NULL sein oder Zeiger auf Leerstring(s.u.)Rückgabewert:Hinweise:FehlercodeEs gelten die allgemeinen Hinweise von Abschnitt "Variablen und Felder in <strong>List</strong> &<strong>Label</strong>".LlDefineField(...) ist identisch mit LlDefineFieldExt(..., LL_TEXT, NULL).Die von <strong>List</strong> & <strong>Label</strong> vorgegebenen Felder sind bei LlDefineField() aufgeführt.lPara ver'oder't mit LL_TABLE_FOOTERFIELD stellt Felddefinitionen nur für den<strong>List</strong>enfuß zur Verfügung. Der <strong>List</strong>enfuß ist dynamisch an den <strong>List</strong>enkörper gekoppeltund eignet sich so z.B. für dynamische Rechnungen als Summen oderZwischensummenzeile.lPara ver'oder't mit LL_TABLE_HEADERFIELD stellt Felddefinitionen nur im <strong>List</strong>enheaderzur Verfügung, entsprechend LL_TABLE_GROUPFIELD nur im Gruppenbereich,LL_TABLE_GROUPFOOTERFIELD nur im Gruppenfußbereich, LL_TABLE_-BODYFIELD nur im <strong>List</strong>endatenbereich.Wenn keine Veroderung vorgenommen wird, tauchen die Felder in allen Tabellenbereichenzur Auswahl auf.lpPara muß, wie oben beschrieben, entweder NULL oder ein Zeiger auf 0 (Leerstring)sein. Ansonsten wird es als Zeiger auf eine Struktur interpretiert mit folgenderDefinition:typedef struct {UINT nSize; // nSize must have LOBYTE != 0 !!!UINT nType; // see belowchar cContents[nSize-2*sizeof(UINT)]} scVarPara;nSize = gesamte Größe der Struktur incl. BenutzerdatennType = 0x0000-0xbfff reserviert, 0xc000...0xffff für User-Daten!cContents[] = BenutzerdatenBeispiel:hJob hJob;175


Beschreibung der API-FunktionenhJob = LlJobOpen(0);LlDefineFieldStart(hJob);LlDefineField(hJob, "Name", "Normalverbraucher");LlDefineField(hJob, "Vorname", "Otto");LlDefineFieldExt(hJob, "Ort", "Konstanz", LL_TEXT, NULL);LlDefineFieldExt(job, "Anzahl_Seite","1",LL_TABLE_FOOTERFIELD Or LL_TEXT,NULL)LlDefineFieldExt(hJob, "PLZ", "*78462*", LL_BARCODE_3OF9);LlDefineFieldExt(hJob, "Foto", "c:\\fotos\\norm.bmp", LL_DRAWING);LlJobClose(hJob);Siehe auch:LlDefineFieldStart, LlDefineField, LlDefineFieldExtHandleLlDefineFieldExtHandleSyntax:INT LlDefineFieldExtHandle(HLLJOB hJob, LPCTSTR lpszName,HANDLE hContents,INT32 lPara, LPVOID lpPara);Aufgabe:Definiert ein <strong>List</strong>enfeld und dessen Inhalt.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-Handle176lpszName: Zeiger auf ANSIZ-Zeichenkette mit FeldnamehContents: Handle vom Typ HMETAFILE, HENHMETAFILE, HBITMAP oderHICON.lPara: LL_DRAWING_HMETA, LL_DRAWING_HEMETA (32 bit), LL_DRAWING_-HICON oder LL_DRAWING_HBITMAPlpPara: für spätere Erweiterungen, muss NULL oder "" (Leerstring) sein (sieheLlDefineFieldExt)Rückgabewert:FehlercodeHinweise:Es gelten die allgemeinen Hinweise von Abschnitt "Variablen und Felder in <strong>List</strong> &<strong>Label</strong>".Diese Funktion definiert ein Textfeld, sie kann beliebig mit den anderen LlDefine-Field...()-Funktionen gemischt werden.Die von <strong>List</strong> & <strong>Label</strong> vorgegebenen Felder sind bei LlDefineField() aufgeführt.Das Handle muss so lange gültig sein, wie es gebraucht wird, also während dergesamten Layout-Definition oder bis nach LlPrintField() bzw. LlPrint().


GrundlagenNach der Verwendung kann bzw. sollte es über die übliche Windows-API-Funktion gelöscht werden.Beispiel:hJob hJob;HMETAFILE hMeta;HDC hMetaDC;INT i;hMetaDC = CreateMetaFile(NULL); // FieberkurveselectObject(hMetaDC,GetStockObject(NULL_PEN));Rectangle(hMetaDC, 0, 0, LL_META_MAXX, LL_METY_MAXY);for (i = 0; i < 10; ++i){MoveTo(hMetaDC,0,MulDiv(i, LL_META_MAXY, 10));LineTo(hMetaDC,MulDiv(i, LL_META_MAXX, 100), MulDiv(i, LL_META_MAXY,10);}MoveTo(hMetaDC, 0, MulDiv(((100*i) & 251) % 100, LL_META_MAXY,100));for (i = 0; i < 10; ++i)LineTo(hMetaDC,MulDiv(i, LL_META_MAXX, 10), MulDiv(((100*i) & 251) %100,LL_META_MAXY,100));hMeta = CloseMetaFile(hMetaDC);hJob = LlJobOpen(0);LlDefineFieldStart(hJob);LlDefineField(hJob, "Name", "Normalverbraucher");LlDefineField(hJob, "Vorname", "Otto");LlDefineFieldExt(hJob, "Ort", "Konstanz", LL_TEXT, NULL);LlDefineFieldExtHandle(hJob, "Erfolgs-Chart", hMeta, LL_DRAWING_HMETA,NULL);LlJobClose(hJob);DeleteObject(hMeta);Siehe auch:LlDefineFieldExt, LlDefineFieldStart, LlDefineFieldLlDefineFieldStartSyntax:void LlDefineFieldStart(HLLJOB hJob);Aufgabe:Leert den DLL-internen Feldpuffer, um alte Definitionen zu löschen.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleHinweise:Die Hinweise zu LlDefineVariableStart() gelten auch für diese Funktion.177


Beschreibung der API-FunktionenWenn die Funktion LlPrintIsFieldUsed() verwendet wird, darf diese Funktion nurvor dem Laden des Projekts aufgerufen werden, da LlDefineFieldStart() auch den"Used"-Status zurücksetzt.Beispiel:hJob hJob;hJob = LlJobOpen(0);LlDefineFieldStart(hJob);LlDefineField(hJob, "Name", "Normalverbraucher");LlDefineField(hJob, "Vorname", "Otto");LlJobClose(hJob);Siehe auch:LlDefineField, LlDefineFieldExt, LlDefineFieldExtHandleLlDefineLayoutSyntax:INT LlDefineLayout(HLLJOB hJob, HWND hWnd, LPCTSTR lpszTitle,UINT nObjType, LPCTSTR lpszObjName);Aufgabe:Aufruf des interaktiven Designers. Dies ist auf dem Entwicklerrechner mit derStandard- und Professional-Edition, auf dem Endkundenrechner nur mit der Professional-Editionmöglich.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehWnd: Window-Handle des aufrufenden FensterslpszTitle: FenstertitelnObjType:WertBedeutungLL_PROJECT_LABEL für EtikettenLL_PROJECT_CARD für KarteikartenLL_PROJECT_LISTfür <strong>List</strong>enjeweils bei Bedarf mit 'oder' verknüpft mit:WertLL_FIXEDNAMELL_NOSAVEASBedeutungSperrt die Menüpunkte 'Neu' und 'Laden' (besser:über LlDesignerProhibitAction())Sperrt den Menüpunkt ´Speichern Als´ (besserüber LlDesignerProhibitAction())178


GrundlagenWertLL_EXPRCONVERTQUIETLL_NONAMEINTITLEBedeutungEine eventuell nötige Konvertierung in den neuenExpression-Modus wird ohne Dialogbox mit BenutzerhinweisvorgenommenVerhindert das Anhängen des Dateinamens anden FenstertitellpszObjName: Dateiname des gewünschten ObjektsRückgabewert:Fehlercode. Beachten Sie, dass die Funktion dem Endkunden nur in der Professional-Editionzur Verfügung gestellt werden darf.Hinweise:Das Window-Handle wird dazu verwendet, das aufrufende Programm zu deaktivieren.Falls dies nicht gewünscht ist, kann auch NULL übergeben werden. In diesemFall hat dann das aufrufende Programm für das ordnungsgemäße Beenden desLayout-Editors zu sorgen, falls der Benutzer das Hauptprogramm abbricht. DiesesVorgehen wird jedoch ausdrücklich nicht empfohlen.Bei Iconisierung des <strong>List</strong> & <strong>Label</strong>-Designers wird das aufrufende Programm auchautomatisch iconisiert, bei der darauffolgenden Restaurierung wird auch der Designerwieder mit restauriert.Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);LlDefineVariableStart(hJob);LlDefineVariable(hJob, "Name", "Normalverbraucher");LlDefineVariable(hJob, "Vorname", "Otto");LlDefineVariable(hJob, "PIN", "40|08150|78462", LL_BARCODE_EAN13, NULL);LlDefineLayout(hJob, hWndMain, "Test", LL_PROJECT_LABEL, "test.lbl")LlJobClose(hJob);Siehe auch:LlDesignerProhibitAction, LlSetOption, LlSetDlgboxMode, LlSetFileExtensionsLlDefineSortOrderSyntax:INT LlDefineSortOrder(HLLJOB hJob, LPCTSTR lpszID, LPCTSTR lpszText);Aufgabe:Definiert eine Sortierreihenfolge und deren Kennungs-Zeichenkette.179


Beschreibung der API-FunktionenParameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszID: Zeichenfolge zur eindeutigen Erkennung, wird bei LlPrintGetSortOrder()zurückgegebenlpszText: Text, der zu der Sortierreihenfolge gehört, und im Designer angezeigtwirdRückgabewert:FehlercodeHinweise:Wenn Sie in einem Projekt eine bestimmte Sortierreihenfolge zur Auswahl ermöglichenmöchten, müssen Sie diese vor dem Aufruf des Designers definieren, sodass sie dort das Projekt mit einer Sortierung verknüpfen können.Das Anwenderprogramm muss dies unterstützen, also vor dem Ausdruck dieSortierreihenfolge abfragen und die Daten entsprechend sortiert übergeben.Diese Funktion ist nur noch aus Kompatibilitätsgründen enthalten; wir empfehlendie Verwendung von LlDbAddTableSortOrder().Dies empfiehlt sich z.B. bei Tabellen, bei denen das sortierte Feld meist an ersterStelle stehen sollte; einem Projekt, bei dem "Firma" an erster Stelle steht, weistman die Sortierung nach "Firma", einem anderen mit "Name" als erstem Feld dieNamens-Sortierung zu.Diese Funktionen funktionieren nur bei Tabellenprojekten, und diese müssen dasFlag LL_OPTION_ONLYONETABLE gesetzt haben!Beispiel:hJob hJob;hJob = LlJobOpen(0);LlDefineSortOrderStart(hJob);LlDefineSortOrder(hJob, "Name", "Name");LlDefineSortOrder(hJob, "Firma", "Firma");LlJobClose(hJob);Siehe auch:LlDefineSortOrderStart, LlPrintGetSortOrderLlDefineSortOrderStartSyntax:INT LlDefineSortOrderStart(HLLJOB hJob);Aufgabe:Leert die DLL-internen Sortierungs-<strong>List</strong>e, um alte Definitionen zu löschen.180


GrundlagenParameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:Hinweise:FehlercodeWenn Sie keine Sortierungen anbieten, erscheint der entsprechende Menüpunktauch nicht im Designer.Diese Funktion ist nur noch aus Kompatibilitätsgründen enthalten.Beispiel:hJob hJob;hJob = LlJobOpen(0);LlDefineSortOrderStart(hJob);LlDefineSortOrder(hJob, "Name", "Name");LlDefineSortOrder(hJob, "Firma", "Firma");LlJobClose(hJob);Siehe auch:LlDefineSortOrder, LlPrintGetSortOrderLlDefineSumVariableSyntax:INT LlDefineSumVariable(HLLJOB hJob, LPCTSTR lpszName,LPCTSTR lpszCont);Aufgabe:Definiert einen Summenvariableninhalt.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: Zeiger auf ANSIZ-Zeichenkette mit FeldnamelpszCont: Zeiger auf ANSIZ-Zeichenkette mit FeldinhaltRückgabewert:FehlercodeHinweise:Der Feldinhalt muss numerisch sein.Die Benutzung dieser Funktion ist nur sinnvoll, wenn der Endanwender nichtden Designer benutzen darf/kann, da das Ergebnis einer Summenvariablen indiesem Falle nicht unbedingt mit den Designereinstellungen konform wäre.181


Beschreibung der API-FunktionenBeispiel:hJob hJob;hJob = LlJobOpen(0);LlDefineSumVariable(hJob, "@Summe15", "14");LlJobClose(hJob);Siehe auch:LlGetSumVariableContentsLlDefineVariableSyntax:INT LlDefineVariable(HLLJOB hJob, LPCTSTR lpszName, LPCTSTR lpszCont);Aufgabe:Definiert eine Variable vom Typ LL_TEXT und deren Inhalt.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: Zeiger auf ANSIZ-Zeichenkette mit VariablennamelpszCont: Zeiger auf ANSIZ-Zeichenkette mit VariableninhaltRückgabewert:FehlercodeHinweise:Es gelten die allgemeinen Hinweise von Abschnitt "Variablen und Felder in <strong>List</strong> &<strong>Label</strong>".Diese Funktion definiert eine Textvariable, sie kann beliebig mit den anderenLlDefineVariable...()-Funktionen gemischt werden.LlDefineVariable() ist identisch mit LlDefineVariableExt(..., LL_TEXT, NULL).Von <strong>List</strong> & <strong>Label</strong> sind schon folgende Variablen vorgegeben (im neuen Expression-Moduswird der '*' durch '_' ersetzt!):VariableLL.CountDataThisPageLL.CountDataLL.CountPrintedDataThisPageLL.CountPrintedDataLL.SortStrategyLL.FilterExpressionBedeutungNumerisch, definierte Datensätze pro SeiteNumerisch, definierte Datensätze gesamtNumerisch, gedruckte Datensätze pro SeiteNumerisch, gedruckte Datensätze gesamtZeichenkette, SortierausdruckZeichenkette, Filterausdruck182


GrundlagenDer Unterschied von "definierten" zu "gedruckten" Datensätzen besteht darin,dass der Benutzer einen Filter auf die Datensätze anwenden kann, so dass mitjedem vom Programm gesendeten Datensatz sich die "definierten" Zahlen erhöhen,aber nicht unbedingt die "gedruckten" (letztere Werte werden nur dann erhöht,wenn der Datensatz gedruckt wurde).Beispiel:hJob hJob;hJob = LlJobOpen(0);LlDefineVariableStart(hJob);LlDefineVariable(hJob, "Name", "Normalverbraucher");LlDefineVariable(hJob, "Vorname", "Otto");LlDefineVariableExt(hJob, "Ort", "Konstanz", LL_TEXT, NULL);LlDefineVariableExt(hJob, "PLZ", "*78462*", LL_BARCODE_3OF9 , NULL);LlJobClose(hJob);Siehe auch:LlDefineVariableStart, LlDefineVariableExt, LlDefineVariableExtHandle, LlGet-VariableContents, LlGetVariableTypeLlDefineVariableExtSyntax:INT LlDefineVariableExt(HLLJOB hJob, LPCTSTR lpszName,LPCTSTR lpszCont, INT32 lPara, LPVOID lpPara);Aufgabe:Definiert eine Variable und deren Inhalt.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: Zeiger auf ANSIZ-Zeichenkette mit VariablennamelpszCont: Zeiger auf ANSIZ-Zeichenkette mit VariableninhaltlPara: VariablentyplpPara: für spätere Erweiterungen, muss NULL oder "" (Leerstring) sein (sieheLlDefineFieldExt)Rückgabewert:FehlercodeHinweise:Es gelten die allgemeinen Hinweise von Abschnitt "Variablen und Felder in <strong>List</strong> &<strong>Label</strong>".183


Beschreibung der API-FunktionenDiese Funktion kann beliebig mit den anderen LlDefineVariable...()-Funktionengemischt werden.Die von <strong>List</strong> & <strong>Label</strong> vorgegebenen Variablen sind bei LlDefineVariable() aufgeführt.Beispiel:hJob = LlJobOpen(0);LlDefineVariableStart(hJob);LlDefineVariableExt(hJob, "Ort", "Konstanz", LL_TEXT, NULL);LlDefineVariableExt(hJob, "PLZ", "*78462*", LL_BARCODE_3OF9, NULL);LlDefineVariableExt(hJob, "Foto", "i.bmp", LL_DRAWING, NULL);LlJobClose(hJob);Siehe auch:LlDefineVariableStart, LlDefineVariable, LlDefineVariableExtHandle, LlGetVariable-Contents, LlGetVariableTypeLlDefineVariableExtHandleSyntax:INT LlDefineVariableExtHandle(HLLJOB hJob, LPSTR lpszName,HANDLE hContents, INT32 lPara, LPVOID lpPara);Aufgabe:Definiert eine Variable und deren Inhalt.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: Zeiger auf ANSIZ-Zeichenkette mit VariablennamehContents: Handle (HMETAFILE, HENHMETAFILE, HICON oder HBITMAP)lPara: LL_DRAWING_HMETA, LL_DRAWING_HEMETA (32 bit), LL_DRAWING_-HICON oder LL_DRAWING_HBITMAPlpPara: für spätere Erweiterungen, muss NULL oder "" (Leerstring) sein (sieheLlDefineFieldExt)Rückgabewert:FehlercodeHinweise:Es gelten die allgemeinen Hinweise von Abschnitt "Variablen/Felder und derenInhalte".Diese Funktion kann beliebig mit den anderen LlDefineVariable...()-Funktionengemischt werden.184


GrundlagenDas Handle muss so lange gültig sein, wie es gebraucht wird, also während dergesamten Layout-Definition oder bis nach LlPrintFields() bzw. LlPrint().Nach der Verwendung kann bzw. sollte es über die übliche API-Funktion gelöschtwerden.Beispiel:hJob hJob;HMETAFILE hMeta;HDC hMetaDC;INT i;hMetaDC = CreateMetaFile(NULL); // FieberkurveSelectObject(hMetaDC, GetStockObject(NULL_PEN));Rectangle(hMetaDC, 0, 0, LL_META_MAXX, LL_META_MAXY);for (i = 0; i < 10; ++i){MoveTo(hMetaDC,0,MulDiv(i, LL_META_MAXY, 10));LineTo(hMetaDC,MulDiv(i, LL_META_MAXX, 100), MulDiv(i, LL_META_-MAXY,10);}MoveTo(hMetaDC,0,MulDiv(((100*i) & 251) % 100, LL_META_MAXY,100));for (i = 0; i < 10; ++i)LineTo(hMetaDC,MulDiv(i, LL_META_MAXX, 10),MulDiv(((100*i) & 251) %100,LL_META_MAXY,100));hMeta = CloseMetaFile(hMetaDC);hJob = LlJobOpen(0);LlDefineVariableStart(hJob);LlDefineVariable(hJob, "Name", "Normalverbraucher");LlDefineVariable(hJob, "Vorname", "Otto");LlDefineVariableExtHandle(hJob, "Chart", hMeta, LL_DRAWING_HMETA, NULL);LlDefineVariableExt(hJob, "PLZ", "*78462*", LL_BARCODE_3OF9, NULL);LlJobClose(hJob);DeleteObject(hMeta);Siehe auch:LlDefineVariableStart, LlDefineVariable, LlDefineVariableExt, LlGetVariable-Contents, LlGetVariableTypeLlDefineVariableStartSyntax:void LlDefineVariableStart(HLLJOB hJob);Aufgabe:Leert den DLL-internen Variablenpuffer, um alte Definitionen zu löschen.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-Handle185


Beschreibung der API-FunktionenHinweise:Muss nicht unbedingt aufgerufen werden. Da jedoch bei jedem LlDefine-Variable...() die interne Variablenliste nach einer schon vorhandenen Variablendesselben Namens und Typs durchsucht wird, kann dies durch diese Funktionetwas verschnellert werden. Andernfalls braucht man nur die Variablen, deren Inhaltsich ändert, anzugeben, da dann der alte Inhalt der Variable überschriebenwird, die Inhalte der übrigen Variablen aber erhalten bleiben.Wenn die Funktion LlPrintIsVariableUsed() verwendet wird, darf diese Funktionnur vor dem Laden des Projekts aufgerufen werden, da LlDefineVariableStart()auch den "Used"-Status zurücksetzt.Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);LlDefineVariableStart(hJob);LlDefineVariable(hJob, "Name", "Normalverbraucher");LlDefineVariable(hJob, "Vorname", "Otto");LlDefineVariable(hJob, "Vorname", "Friedrich");LlJobClose(hJob);Siehe auch:LlDefineVariable, LlDefineVariableExt, LlDefineVariableExtHandle, LlGetVariable-Contents, LlGetVariableTypeLlDesignerAddActionSyntax:INT LlDesignerAddAction(HLLJOB hJob, UINT nID, UINT nFlags,LPCTSTR pszMenuText, LPCTSTR pszMenuHierarchy, LPCTSTR pszTooltipText,UINT nIcon, LPVOID pvReserved);Aufgabe:Erweitert den Designer und wahlweise auch die Toolbar des Designers um eigeneMenüpunkte. Im Unterschied zur Verwendung des CallbacksLL_CMND_MODIFYMENU kann hier auch eine Schaltfläche mit wählbarem Iconzur Toolbar hinzugefügt werden. Dieser Befehl muß vor LlDefineLayout aufgerufenwerden.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-Handle186nID: Menü-ID für die neu hinzuzufügende Aktion. Diese ID erhalten Sie im CallbackLL_CMND_SELECTMENU, wenn der Benutzer den zugehörigen Menüpunktoder Button ausgewählt hat. Benutzerdefinierte IDs sollten im Bereich zwischen10100 und 10999 liegen.nFlags: Kombination (Veroderung) der folgenden Flags:


GrundlagenWertLLDESADDACTIONFLAG_ADD_TO_TOOLBARLLDESADDACTION_MENUITEM_APPENDLLDESADDACTION_MENUITEM_INSERTBedeutungZusätzlich zum Menüeintrag eine Schaltflächezur Toolbar hinzufügen.Der Menüpunkt wird hinter dem in pszMenuHierarchybezeichneten Eintrag eingefügt.Der Menüpunkt wird vor dem in pszMenu-Hierarchy bezeichneten Eintrag eingefügt.sowie wahlweise zusätzlich einen Keycode als Shortcut und eine Kombination(veroderung) der folgenden Flags als Modifikator:WertLLDESADDACTION_ACCEL_CONTROLLLDESADDACTION_ACCEL_SHIFTLLDESADDACTION_ACCEL_ALTLLDESADDACTION_ACCEL_VIRTKEYBedeutungTastaturkürzel ist STRG+Keycode.Tastaturkürzel ist UMSCHALT+Keycode.Tastaturkürzel ist ALT+Keycode.Sollte immer gesetzt sein.pszMenuText: Menütext ohne Tastaturshortcut (dieser wird automatisch ergänzt).Sie können aber das "&"-Zeichen für die Vergabe der Kurztaste bei Menünavigationverwenden. Um Untermenüpunkte anzulegen verwenden Sie "." alsHierarchietrenner. Um z.B. ein Menü "Vorlagen" mit dem Unterpunkt "Rechnung"anzulegen, verwenden Sie "Vorlagen.Rechnung" als Menütext.pszMenuHierarchy: Menühierarchie des neuen Menüpunkts. Die Angabe erfolgtin der Form ".…" wobei "Ebene" jeweils der 0-basierende Indexdes Menüeintrages ist. Um z.B. in das "Bearbeiten"-Menü an erster Stelle einenneuen Eintrag einzufügen, verwenden Sie "1.0" undLLDESADDACTION_MENUITEM_INSERT.pszTooltipText: Text für den Tooltip der Toolbarschaltfläche. Wird nur ausgewertet,wenn das Flag LLDESADDACTIONFLAG_ADD_TO_TOOLBAR gesetzt wird.Darf NULL sein.nIcon: Icon-ID für die Schaltfläche. Wird nur ausgewertet, wenn das FlagLLDESADDACTIONFLAG_ADD_TO_TOOLBAR gesetzt wird. Verwenden Sie dasProgramm IconSelector.exe (im Tools-Verzeichnis) um die verfügbaren Icons mitIhren IDs angezeigt zu bekommen.pvReserved: Für zukünftige Erweiterungen, muß NULL sein.187


Beschreibung der API-FunktionenRückgabewert:Hinweise:FehlercodeUm die eigentliche Aktion auszuführen muß der LL_CMND_SELECTMENU-Callback behandelt werden.Siehe auch:LlDefineLayoutLlDesignerFileOpenSyntax:INT LlDesignerFileOpen(HLLJOB hJob, LPCTSTR pszFileName,UINT nFlags);Aufgabe:Öffnet bei geöffnetem Designer die angegebene Projektdatei.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlepszFileName: Projektdateiname mit PfadangabenFlags: Kombination (Veroderung) jeweils eines Flags aus den folgenden zweiGruppen:WertLL_DESFILEOPEN_OPEN_EXISTINGLL_DESFILEOPEN_CREATE_ALWAYSLL_DESFILEOPEN_CREATE_NEWBedeutungDatei muss bereits existieren, sonst wirdFehlercode zurückgeliefert.Datei wird immer neu erzeugt. Wenn schonvorhanden wird der Inhalt gelöscht.Datei wird neu erzeugt, wenn nicht vorhanden.Wenn Datei bereits existiert wird Fehlercodezurückgeliefert.LL_DESFILEOPEN_OPEN_ALWAYS Wenn Datei vorhanden, wird der Inhaltverwendet, sonst wird Datei neu erzeugt.LL_DESFILEOPEN_OPEN_IMPORT Importiert eine bestehende Datei in einbereits geöffnetes Projekt.WertLL_DESFILEOPENFLAG_SUPPRESBedeutungDie gerade geöffnete Datei wird vor.demLaden des neuen Projekts ohne Benutzerin-188


GrundlagenWertS_SAVEDIALOGLL_DESFILEOPENFLAG_SUPPRESS_SAVELL_DESFILEOPENFLAG_DEFAULTBedeutungteraktion gespeichert.Die gerade geöffnete Datei wird ohne Speicherngeschlossen. Alle Änderungen seitdem letzten Speichervorgang gehen damitverloren!Die gerade geöffnete Datei wird – wennnötig – nach Benutzerauswahl gespeichertoder verworfen, bevor das neue Projektgeladen wird.Rückgabewert:FehlercodeHinweise:Die Funktion kann nur innerhalb eines Designer-Events verwendet werden. Typischist die Verwendung in Verbindung mit LlDesignerAddAction um bestimmteAbläufe zu automatisieren.Siehe auch:LlDesignerFileSaveLlDesignerFileSaveSyntax:INT LlDesignerFileSave(HLLJOB hJob, UINT nFlags);Aufgabe:Speichert bei geöffnetem Designer die gerade geöffnete Projektdatei.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenFlags: Für spätere Erweiterungen, muß "0" (LL_DESFILESAVE_DEFAULT) sein.Rückgabewert:FehlercodeHinweise:Die Funktion kann nur innerhalb eines Designer-Events verwendet werden. Typischist die Verwendung in Verbindung mit LlDesignerAddAction um bestimmteAbläufe zu automatisieren.Siehe auch:LlDesignerFileOpen189


Beschreibung der API-FunktionenLlDesignerGetOptionStringSyntax:INT LlDesignerGetOptionString(HLLJOB hJob, INT nMode, LPTSTR pszBuffer,UINT nBufSize);Aufgabe:Fragt bei geöffnetem Designer diverse Einstellungen ab.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenMode: Optionsindex, siehe LlDesignerSetOptionString()pszBuffer: Puffer für Rückgabewert, darf NULL sein (s.u.)nBufSize: Größe des PuffersRückgabewert:Fehlercode oder benötigte Puffergröße, wenn pszBuffer NULL ist.Hinweise:Die für den Mode-Parameter gültigen Werte sind bei LlDesignerSetOptionString()aufgeführt.Siehe auch:LlDesignerSetOptionStringLlDesignerInvokeActionSyntax:INT LlDesignerInvokeAction(HLLJOB hJob, INT nMenuIndex);Aufgabe:Löst bei geöffnetem Designer die angegebene Aktion/den angegebenen Menüpunktaus.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenMenuIndex: Funktionsindex. Die verfügbaren Funktionen finden Sie in der DateiMENUID.TXT.Rückgabewert:Fehlercode190


GrundlagenHinweise:Wenn die Funktion eingesetzt werden soll, muss sie innerhalb eines Designer-Events verwendet werden. Typisch ist die Verwendung in Verbindung mit LlDesignerAddActionum bestimmte Abläufe zu automatisieren.Siehe auch:LlDefineLayout, LlDesignerAddActionLlDesignerProhibitActionSyntax:INT LlDesignerProhibitAction(HLLJOB hJob, INT nMenuIndex);Aufgabe:Verhindert eine Benutzeraktion im Designer, indem es Menüpunkte sperrt (versteckt).Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenMenuIndex: Funktionsindex:WertBedeutung0 Das Menü wird zurückgesetzt und dadurch derAusgangszustand herbeigeführt. Bei LlJobOpen[LCID]()wird dies automatisch aufgerufen; beimehreren LlDefineLayout()-Aufrufen mit verschiedenenSperreinträgen wird diese Funktion alsogebraucht, wenn zwischendurch der Job nichtfreigegeben und wieder angefordert wird, sonstaddieren sich die Sperreinträge.LL_SYSCOMMAND_-MINIMIZELL_SYSCOMMAND_-MAXIMIZEandere WerteDas Designer-Fenster kann nicht minimiert (iconisiert)werdenDer Designer kann nicht maximiert werden.Hier können die Menü-IDs der zu sperrenden Menüsangegeben werden. Die entsprechenden IDsfinden Sie (für die englische Version) in der DateiMENUID.TXT in Ihrer <strong>List</strong> & <strong>Label</strong> Installation.Rückgabewert:Fehlercode191


Beschreibung der API-FunktionenHinweise:Wenn die Funktion eingesetzt werden soll, muss sie vor der LlDefineLayout()-Funktion aufgerufen werden.Der Aufruf kann mehrfach hintereinander für verschiedene Funktionsindex-Werteaufgerufen werden, da die Einträge zu einer Sperreintragsliste hinzugefügt werden,die bei dem Aufruf von LlDefineLayout() ausgewertet wird.Sie können Menüidentifikationen tauch in den Callbacks LL_CMND_ENABLE-MENU und LL_CMND_MODIFYMENU durchführen.Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);LlDefineVariableStart(hJob);LlDefineVariable(hJob, "Name", "Normalverbraucher");LlDefineVariable(hJob, "Vorname", "Otto");LlDefineVariable(hJob, "PIN", "40|08150|78462", LL_BARCODE_EAN13, NULL);LlDesignerProhibitAction(hJob, LL_SYSCOMMAND_MINIMIZE);LlDesignerProhibitAction(hJob, 515); // no "save as"LlDefineLayout(hJob,hWndMain, "Test", LL_PROJECT_LABEL, "test.lbl");LlJobClose(hJob);Siehe auch:LlDefineLayout, Callback LL_CMND_ENABLEMENU, Callback LL_CMND_-MODIFYMENULlDesignerProhibitEditingObjectSyntax:INT LlDesignerProhibitEditingObject(HLLJOB Job, LPCTSTR pszObject);Aufgabe:Verhindert, dass das übergebene Objekt im Designer bearbeitet werden kann.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-Handle192pszObject: Objektname.Rückgabewert:FehlercodeHinweise:Über NULL oder einen Leerstring wird die <strong>List</strong>e der zu sperrenden Objekte gelöscht.Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);


GrundlagenLlDesignerProhibitEditingObject(hJob, "DemoText");...LlJobClose(hJob);Siehe auch:-LlDesignerProhibitFunctionSyntax:INT LlDesignerProhibitFunction(HLLJOB Job, LPCTSTR pszFunction);Aufgabe:Verhindert, dass die übergebene Funktion im Funktionsassistenten angebotenwird.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlepszFunction: Funktionsname.Rückgabewert:FehlercodeHinweise:Über NULL oder einen Leerstring wird die <strong>List</strong>e der zu unterdrückenden Funktionengelöscht.Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);LlDesignerProhibitFunction(hJob, "");LlDesignerProhibitFunction(hJob, "CStr$");...LlJobClose(hJob);Siehe auch:-LlDesignerRefreshWorkspaceSyntax:INT LlDesignerRefreshWorkspace(HLLJOB hJob);193


Beschreibung der API-FunktionenAufgabe:Löst im Designer eine Aktualisierung aller Toolfenster, Menüpunkte etc. aus.Verwenden Sie diese Funktion, um nach Änderungen am Objektmodell per DOMbei geöffnetem Designer sicherzustellen, dass der Designer diese Änderungenauch sofort darstellt.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:FehlercodeHinweise:Die Funktion kann nur innerhalb eines Designer-Events verwendet werden. Typischist die Verwendung in Verbindung mit LlDesignerAddAction.Siehe auch:LlDefineLayout, LlDesignerAddActionLlDesignerSetOptionStringSyntax:INT LlDesignerSetOptionString(HLLJOB hJob, INT nMode, LPCTSTR pszValue);Aufgabe:Setzt diverse Einstellungen im geöffneten <strong>List</strong> & <strong>Label</strong> Designer.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenMode: Folgende Werte sind als Funktionsindex möglich:LL_DESIGNEROPTSTR_PROJECTFILENAMEDer Name des gerade geöffneten Projekts. Wenn Sie durch eine Aktion eine Dateineu angelegt haben, können Sie dieser auf diese Weise einen Namen zuordnen.Ansonsten entspricht das Setzen einem "Speichern unter…".LL_DESIGNEROPTSTR_ WORKSPACETITLEBestimmt den Inhalt der Titelzeile im Designer. Sie können im Text den Formatierungsplatzhalter%s verwenden, um den Projektnamen anzuzeigen.LL_DESIGNEROPTSTR_ PROJECTDESCRIPTIONSetzt die Projektbeschreibung, die auch im "Datei öffnen"-Dialog angezeigt wird.pszValue: neuer Wert194


GrundlagenRückgabewert:FehlercodeSiehe auch:LlDesignerGetOptionStringLlDlgEditLineExSyntax:INT LlDlgEditLineEx(HLLJOB Job, HWND hWnd, LPTSTR pszBuffer,UINT nBufSize, UINT32 nParaTypes, LPCTSTR pszTitle,BOOL bTable, LPVOID pReserved);Aufgabe:Diese Funktion steht nur in der Enterprise Edition zur Verfügung! Startet den<strong>List</strong> & <strong>Label</strong> Formelassistenten unabhängig vom Designer. Dadurch können <strong>List</strong> &<strong>Label</strong> Formeln auch an vom Druck unabhängigen Stellen der Applikation verwendetwerden.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehWnd: Fensterhandle des aufrufenden ProgrammspszBuffer: Puffer für RückgabewertnBufSize: Größe des PuffersnParaTypes: erwarteter Rückgabetyp. Ein oder mehrere veroderteLL_FCTPARATYPE_... WertepszTitle: FenstertitelbTable: bestimmt, ob nur Variablen (FALSE) oder Felder (TRUE) zur Verfügungstehen sollenpReserved: reserviert, muss NULL oder leer ('') sein.Rückgabewert:FehlercodeLlDomCreateSubobjectSyntax:INT LlDomCreateSubobject(HLLDOMOBJ hDOMObj, INT nPosition,LPCTSTR pszType, PHLLDOMOBJ phDOMSubObj);195


Beschreibung der API-FunktionenAufgabe:Erzeugt ein neues Unterobjekt innerhalb der angegebenen DOM-<strong>List</strong>e. AusführlicheAnwendungsbeispiele finden Sie im Kapitel "5.1.1. DOM-Funktionen".Parameter:hDomObj: DOM-Handle der <strong>List</strong>enPosition: Index (0-basierend) des einzufügenden Elements. Alle folgenden Elementewerden um eine Position nach hinten verschoben.pszType: gewünschter Elementtyp, z.B. "Text" um in der Objektliste ein neuesTextobjekt anzulegenphDOMSubObj: Zeiger auf DOM-Handle für die RückgabeRückgabewert:FehlercodeSiehe auch:Kapitel "5.1.1. DOM-Funktionen"LlDomDeleteSubobjectSyntax:INT LlDomDeleteSubobject(HLLDOMOBJ hDOMObj, INT nPosition);Aufgabe:Löscht ein Unterobjekt aus der angegebenen DOM-<strong>List</strong>e. Ausführliche Anwendungsbeispielefinden Sie im Kapitel "5.1.1. DOM-Funktionen".Parameter:hDomObj: DOM-Handle der <strong>List</strong>enPosition: Index (0-basierend) des zu löschenden Elements. Alle folgenden Elementewerden um eine Position nach vorne verschoben.Rückgabewert:FehlercodeSiehe auch:Kapitel "5.1.1. DOM-Funktionen"LlDomGetObjectSyntax:INT LlDomGetObject(HLLDOMOBJ hDOMObj, LPCTSTR pszName,PHLLDOMOBJ phDOMSubObj);196


GrundlagenAufgabe:Parameter:Liefert ein Unterobjekt des angegebenen DOM-Objektes, wird z.B. verwendet,um vom Projekt die Objektliste zu erfragen. Ausführliche Anwendungsbeispielefinden Sie im Kapitel "5.1.1. DOM-Funktionen".hDomObj: DOM-Handle des "Eltern"-ObjektespszName: Name des gewünschten Unterobjektes, z.B. "Objects"phDOMSubObj: Zeiger auf DOM-Handle für die RückgabeRückgabewert:Siehe auch:FehlercodeKapitel "5.1.1. DOM-Funktionen"LlDomGetProjectSyntax:INT LlDomGetProject(HLLJOB hJob, PHLLDOMOBJ phDOMObj);Aufgabe:Parameter:Liefert das aktuell geladene Projektobjekt. Kann z.B. nach LlPrint(WithBox)Startverwendet werden, um das Projekt während des Ausdrucks mit DOM-Funktionenzu verändern. Um Projekte neu zu erstellen oder vor dem Ausdruck zu bearbeitenverwenden Sie LlProjectOpen, LlProjectSave und LlProjectClose. AusführlicheAnwendungsbeispiele finden Sie im Kapitel "5.1.1. DOM-Funktionen".hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlephDOMSubObj: Zeiger auf DOM-Handle für die RückgabeRückgabewert:Siehe auch:FehlercodeLlProjectOpen, LlProjectSave, LlProjectClose , Kapitel "5.1.1. DOM-Funktionen"LlDomGetPropertySyntax:INT LlDomGetProperty(HLLDOMOBJ hDOMObj, LPCTSTR pszName,LPTSTR pszBuffer, UINT nBufSize);197


Beschreibung der API-FunktionenAufgabe:Liefert den Inhalt der angegebenen Eigenschaft zurück. Ausführliche Anwendungsbeispielefinden Sie im Kapitel "5.1.1. DOM-Funktionen".Parameter:hDomObj: DOM-Handle des abzufragenden ObjektspszName: Name der gewünschten Eigenschaft, z.B. "Condition" um von einemObjekt die Darstellungsbedingung zu erfragen.pszBuffer: Speicherbereich, in den der Parameter geschrieben werden soll. KannNULL sein (siehe Hinweise)nBufSize: Größe des PuffersRückgabewert:Fehlercode bzw. benötigte PuffergrößeHinweise:Wenn pszBuffer NULL ist, ist der Rückgabewert die Länge des benötigten Puffers(in TCHARS, also BYTEs im SBCS/MBCS-Fall und WCHARs bei UNICODE)inclusive der String-Terminierung.Siehe auch:Kapitel "5.1.1. DOM-Funktionen"LlDomGetSubobjectSyntax:INT LlDomGetSubobject(HLLDOMOBJ hDOMObj, INT nPosition,PHLLDOMOBJ phDOMSubObj);Aufgabe:Liefert das angegebene Unterelement der DOM-<strong>List</strong>e zurück. Ausführliche Anwendungsbeispielefinden Sie im Kapitel "5.1.1. DOM-Funktionen".Parameter:hDomObj: DOM-Handle der abzufragenden <strong>List</strong>enPosition: Index (0-basierend) des gewünschten ElementsphDOMSubObj: Zeiger auf DOM-Handle für die RückgabeRückgabewert:FehlercodeSiehe auch:Kapitel "5.1.1. DOM-Funktionen"198


GrundlagenLlDomGetSubobjectCountSyntax:INT LlDomGetSubobjectCount(HLLDOMOBJ hDOMObj, _LPINT32 pnCount);Aufgabe:Parameter:Liefert die Anzahl der Elemente in der angegebenen DOM-<strong>List</strong>e zurück. So kannz.B. die Anzahl der Objekte in der Objektliste ermittelt werden. Ausführliche Anwendungsbeispielefinden Sie im Kapitel "5.1.1. DOM-Funktionen".hDomObj: DOM-Handle der abzufragenden <strong>List</strong>epnCount: Zeiger für die RückgabeRückgabewert:Siehe auch:FehlercodeKapitel "5.1.1. DOM-Funktionen"LlDomSetPropertySyntax:INT LlDomSetProperty(HLLDOMOBJ hDOMObj, LPCTSTR pszName,LPCTSTR pszValue);Aufgabe:Setzt die angegebenen Eigenschaft auf den übergebenen Wert. AusführlicheAnwendungsbeispiele finden Sie im Kapitel "5.1.1. DOM-Funktionen".Parameter:hDomObj: DOM-Handle des abzufragenden ObjektspszName: Name der gewünschten Eigenschaft, z.B. "Condition" um die Darstellungsbedingungeines Objektes zu setzenpszValue: Neuer Wert der EigenschaftRückgabewert:FehlercodeSiehe auch:Kapitel "5.1.1. DOM-Funktionen"199


Beschreibung der API-FunktionenLlEnumGetEntrySyntax:HLISTPOS LlEnumGetEntry(HLLJOB hJob, HLISTPOS hPos, LPTSTR pszNameBuf,UINT nNameBufsize, LPTSTR pszContBuf, UINT nContBufSize,HANDLE* pHandle, INT32* pType);Aufgabe:Liefert den Inhalt und den Namen einer Variable bzw. eines Feldes.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-Handle200hPos: Das Handle der momentanen Variable/des momentanen FeldspszNameBuf, nNameBufsize: beschreiben einen Puffer, in dem der Variablen/Feldbezeichnergespeichert werden sollpszContBuf, nContBufSize: beschreiben einen Puffer, in dem der Inhalt gespeichertwerden soll. pszContBuf darf NULL sein.pHandle: Zeiger auf ein HANDLE, in dem ein etwaiges Handle gespeichert werdensoll. Darf NULL sein (siehe LlDefineVariableExtHandle() und LlDefineFieldExtHandle()).pType: Zeiger auf INT32, in dem der Typ gespeichert werden soll (LL_TEXT, ...).Darf NULL sein.Rückgabewert:FehlercodeHinweise:Vor Abfrage einer Variablen darf nicht LlDefineVariableStart() oder LlDefine-FieldStart() aufgerufen werden!Über die Enumeratoren kann man die Variablen- und Feldliste durchlaufen unddie Definitionen der vorhandenen Variablen und Felder samt Typen und Inhaltenabfragen.Folgendes Beispiel durchläuft die Variablenliste und gibt alle Variablen aus (LL_-TYPEMASK ist die Addition aller möglicher Variablentypen):HLISTPOS hPos = LlEnumGetFirstVar(hJob, LL_TYPEMASK);while (hPos != NULL){TCHAR szName[64+1];TCHAR szContents[256+1];LlEnumGetEntry(hJob, hPos, szName, sizeof(szName), szContents, sizeof(szContents),NULL, NULL);printf("%s - %s\n",szName,szContents);hPos = LlEnumGetNextEntry(hJob, hPos, LL_TYPEMASK);}


GrundlagenSiehe auch:LlEnumGetFirstVar, LlEnumGetFirstField, LlEnumGetNextEntryLlEnumGetFirstChartFieldSyntax:HLISTPOS LlEnumGetFirstChartField(HLLJOB hJob, UINT32 nFlags);Aufgabe:Parameter:Liefert das erste definierte Chart-Feld. Dabei muss der Name des Feldes nichtbekannt sein. Die Felder werden in der Reihenfolge wie sie bei <strong>List</strong> & <strong>Label</strong> angemeldetwurden zurückgeliefert.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenFlags: Flags für die erlaubten Feldtypen: LL_TEXT, LL_BOOLEAN, LL_BARCODE,LL_DRAWING, LL_NUMERIC, LL_DATE, LL_RTF, LL_HTMLRückgabewert:Hinweise:Siehe auch:Handle oder NULL, wenn kein Feld vorhanden.Während einer Iteration darf LlDefineChartFieldStart() nicht aufgerufen werden.LlEnumGetFirstField, LlEnumGetFirstVar, LlEnumGetNextEntry, LlEnumGetEntryLlEnumGetFirstFieldSyntax:HLISTPOS LlEnumGetFirstField(HLLJOB hJob, UINT32 nFlags);Aufgabe:Parameter:Liefert das erste definierte Feld. Dabei muss der Name des Feldes nicht bekanntsein. Die Felder werden in der Reihenfolge wie sie bei <strong>List</strong> & <strong>Label</strong> angemeldetwurden zurückgeliefert.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenFlags: Flags für die erlaubten Feldtypen: LL_TEXT, LL_BOOLEAN, LL_BARCODE,LL_DRAWING, LL_NUMERIC, LL_DATE, LL_RTF, LL_HTMLRückgabewert:Handle oder NULL, wenn kein Feld vorhanden.201


Beschreibung der API-FunktionenHinweise:Siehe auch:Während einer Iteration darf LlDefineFieldStart() nicht aufgerufen werden.LlEnumGetFirstChartField, LlEnumGetFirstVar, LlEnumGetNextEntry, LlEnumGetEntryLlEnumGetFirstVarSyntax:HLISTPOS LlEnumGetFirstVar(HLLJOB hJob, UINT32 nFlags);Aufgabe:Liefert die erste definierte Variable. Dabei muss der Name der Variable nicht bekanntsein. Die Variablen werden in der Reihenfolge wie sie bei <strong>List</strong> & <strong>Label</strong> angemeldetwurden zurückgeliefert.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenFlags: Flags für die erlaubten Variablentypen: LL_TEXT, LL_BOOLEAN, LL_-BARCODE, LL_DRAWING, LL_NUMERIC, LL_DATE, LL_RTF, LL_HTMLRückgabewert:Handle oder NULL, wenn keine Variable vorhanden.Hinweise:Während einer Iteration darf LlDefineVariableStart() nicht aufgerufen werden.Es werden keine internen Variablen ausgegeben.Siehe auch:LlEnumGetFirstField, LlEnumGetNextEntry, LlEnumGetEntryLlEnumGetNextEntrySyntax:HLISTPOS LlEnumGetNextEntry(HLLJOB hJob, HLISTPOS hPos, UINT32 nFlags);Aufgabe:Liefert das nächste definierte Feld / Variable. Die Iterierung wir über LlEnumGet-FirstVar oder LlEnumGetFirstField begonnen und mit dieser Funktion fortgesetzt.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-Handle202hPos: Das Handle der momentanen Variable/des momentanen Felds


GrundlagennFlags: Flags für die erlaubten Variablentypen: LL_TEXT, LL_BOOLEAN, LL_-BARCODE, LL_DRAWING, LL_NUMERIC, LL_DATE, LL_RTF, LL_HTMLRückgabewert:Hinweise:Siehe auch:Handle für die nächste Variable/Feld oder NULL, wenn keine passende Variable/keinpassendes Feld mehr vorhanden.Während einer Iteration darf LlDefineVariableStart() oder LlDefineFieldStart() nichtaufgerufen werden.LlEnumGetFirstVar, LlEnumGetFirstField, LlEnumGetEntryLlExprErrorSyntax:void LlExprError(HLLJOB hJob, LPTSTR lpBuffer, INT nBufferSize);Aufgabe:Parameter:Gibt den Grund des Fehlers in einem Ausdruck-String von LlExprParse() im Klartextzurück.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpBuffer: Zeiger auf Puffer, in den der Fehlertext geschrieben werden sollnBufferSize: Größe des Puffers, empfohlen: ca. 250 ZeichenRückgabewert:Hinweise:Beispiel:Siehe auch:FehlercodeDie Funktion muss sofort nach LlExprParse() aufgerufen werden.LlExprError() führt beim Laden (auch zum Druck) eines Projekts nur bedingt zumErfolg, da der interne Formelparser evtl. beim Aufruf der Funktion schon eine völligandere Formel geparst hat und somit evtl. gar keinen Fehler mehr "aktiv" hat,kann man über den Callback LL_NTFY_EXPRERROR Fehlermeldungen sammelnund dann nach LlPrintStart() dem Benutzer melden.Siehe LlExprParse()LlExprParse, LlExprEvaluate, LlExprType, LlExprFree203


Beschreibung der API-FunktionenLlExprEvaluateSyntax:INT LlExprEvaluate(HLLJOB hJob, LPVOID lpExpr, LPTSTR lpBuffer,INT nBufferSize);Aufgabe:Evaluiert einen Ausdruck.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpExpr: Der vom dazugehörigen LlExprParse() zurückgegebene ZeigerlpBuffer: Zeiger auf Puffer, in den der berechnete Wert geschrieben werden sollnBufferSize: Größe des PuffersRückgabewert:FehlercodeHinweise:Der Puffer wird immer mit einer nullterminierten Zeichenkette gefüllt.Abhängig vom Typ des Ergebnisses ist der Pufferinhalt wie folgt zu interpretieren:TypLL_EXPRTYPE_STRINGLL_EXPRTYPE_DOUBLELL_EXPRTYPE_DATELL_EXPRTYPE_BOOLLL_EXPRTYPE_DRAWINGLL_EXPRTYPE_BARCODEBedeutungDer Pufferinhalt ist die Ergebnis-ZeichenketteDer Pufferinhalt ist die entsprechende Darstellungdes Wertes, für Pi z.B. "3.141592". Der Wert wirdimmer mit 6 Nachkommastellen ausgegeben.Der Pufferinhalt ist die entsprechende Darstellungdes julianischen Wertes, z.B. "21548263".Der Puffer enthält entweder die Zeichenkette"TRUE" oder "FALSE".Der Puffer enthält den Namen der Zeichnungs-Variablen/des Zeichnungs-Feldes(!), nicht denInhalt.Der Puffer enthält den Wert, der als Barcode zuinterpretieren wäre.Beispiel:Siehe LlExprParse204


GrundlagenSiehe auch:LlExprParse, LlExprType, LlExprError, LlExprFreeLlExprFreeSyntax:void LlExprFree(HLLJOB hJob, LPVOID lpExpr);Aufgabe:Parameter:Hinweise:Beispiel:Siehe auch:Gibt die mit LlExprParse() erzeugte Baumstruktur wieder frei.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpExpr: Der vom dazugehörigen LlExprParse() zurückgegebene ZeigerUm Speicherverluste zu vermeiden, muss die Funktion aufgerufen werden, wennein über LlExprParse() erzeugter Baum nicht mehr benötigt wird und freigegebenwerden soll.Siehe LlExprParse()LlExprParse, LlExprEvaluate, LlExprType, LlExprErrorLlExprParseSyntax:LPVOID LlExprParse(HLLJOB hJob, LPCTSTR lpExprText, BOOL bTableFields);Aufgabe:Testet den Ausdruck auf Korrektheit und erstellt eine interne Datenstruktur fürdiesen Ausdruck.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpExprText: AusdruckbTableFields: TRUE: Bezug auf Felder (und Variablen), FALSE: Bezug nur auf VariablenRückgabewert:Zeiger auf <strong>List</strong> & <strong>Label</strong> interne Datenstruktur205


Beschreibung der API-FunktionenHinweise:Wenn ein Fehler zurückgemeldet wird (Adresse = NULL), kann man über LlExpr-Error() die Fehlerbeschreibung abgefragt werden.Die über LlDefineVariable() definierten Variablen können mit in den Ausdruck eingebautwerden, wenn bTableFields auf FALSE ist, ansonsten werden die überLlDefineField() definierten Felder in den Ausdruck mit einbezogen.Wenn der Ausdruck mehrmals benötigt wird, empfiehlt es sich, diesen einmalüber LlExprParse() übersetzen zu lassen und dann die Berechnungen durchzuführenund erst am Schluss den Baum wieder freizugeben.Wenn beim Aufruf dieser Funktionen ein Fehler im Ausdruck erkannt wird, wirdder entsprechende Fehler-Callback LL_NTFY_EXPRERROR aufgerufen.Beispiel:LPVOID lpExpr;char lpszErrortext[128];char lpszBuf[20];long lDateOne;long lDateTwo;LlDefineVariable(hJob, "Datum", "29.2.1964", LL_TEXT);lpExpr = LlExprParse(hJob, "DateToJulian(DATE(Datum))", FALSE);if (lpExpr){if (LlExprType(hJob, lpExpr) != LL_EXPRTYPE_DOUBLE){// da stimmt was nicht, muss numerisch sein!}LlExprEvaluate(hJob, lpExpr, lpszBuf, sizeof(lpszBuf));lDateOne = atol(lpszBuf);// lDateOne hat nun das julianische Datum vom 29.2.1964LlDefineVariable(hJob, "Datum", "29.2.2000", LL_TEXT);LlExprEvaluate(hJob, lpExpr, lpszBuf, sizeof(lpszBuf));lDateTwo = atol(lpszBuf);// lDateTwo hat nun das julianische Datum vom 29.2.2000LlExprFree(hJob, LpExpr);}else{// Fehler!LlExprError(hJob, lpszErrortext, sizeof(lpszErrortext));}Siehe auch:LlExprEvaluate, LlExprType, LlExprError, LlExprFreeLlExprTypeSyntax:INT LlExprType(HLLJOB hJob, LPVOID lpExpr);206


GrundlagenAufgabe:Parameter:Evaluiert den Typ eines Ausdrucks.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpExpr: Der vom dazugehörigen LlExprParse() zurückgegebene ZeigerRückgabewert:Beispiel:Siehe auch:Typ des Ergebnisses:WertLL_EXPRTYPE_STRINGLL_EXPRTYPE_DOUBLELL_EXPRTYPE_DATELL_EXPRTYPE_BOOLLL_EXPRTYPE_DRAWINGLL_EXPRTYPE_BARCODESiehe LlExprParse()BedeutungZeichenketteNumerischer WertDatumBool´scher WertZeichnungBarcodeLlExprParse, LlExprEvaluate, LlExprError, LlExprFreeLlGetChartFieldContentsSyntax:INT LlGetChartFieldContents(HLLJOB hJob, LPCTSTR lpszName,LPTSTR lpszBuffer, UINT nBufSize);Aufgabe:Gibt den Inhalt des entsprechenden Chart-Felds zurück.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: Zeiger auf ANSIZ-Zeichenkette mit FeldnamelpszBuffer: Zeiger auf Puffer, in den der Inhalt gespeichert werden sollnBufSize: Größe des PuffersRückgabewert:Fehlercode (meist LL_ERR_UNKNOWN_FIELD oder 0)207


Beschreibung der API-FunktionenHinweise:Siehe auch:Diese Funktion kann in Callback-Routinen verwendet werden, um Chartfeld-Inhalte abzufragen.LlDefineChartFieldStart, LlDefineChartFieldExt, LlGetFieldTypeLlGetDefaultProjectParameterSyntax:INT LlGetDefaultProjectParameter(HLLJOB hLlJob, LPCTSTR pszParameter,LPTSTR pszBuffer, INT nBufSize, UINT32* pnFlags);Aufgabe:Fragt den Default-Wert eines Projekt-Parameters ab (siehe auch Kapitel Projekt-Parameter)Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlepszParameter: Name des Parameters. Kann NULL sein (siehe Hinweise)pszBuffer: Speicherbereich, in den der Parameter geschrieben werden soll. KannNULL sein (siehe Hinweise)nBufSize: Größe des Pufferbereichs, auf den pszBuffer zeigt (in TCHARs).pnFlags: Zeiger auf einen UINT32, den Typ des Parameters (Werte siehe LlSet-DefaultProjectParameter()). Kann NULL sein, wenn der Wert nicht benötigt wird.Rückgabewert:Fehlercode bzw. benötigte PuffergrößeHinweise:Wenn pszParameter NULL ist, wird eine Semikolon-separierte <strong>List</strong>e aller USER-Parameter zurückgegeben.Wenn pszBuffer NULL ist, ist der Rückgabewert die Länge des benötigten Puffers(in TCHARS, also BYTEs im SBCS/MBCS-Fall und WCHARs bei UNICODE)inclusive der String-Terminierung.Siehe auch:LlSetDefaultProjectParameter, LlPrintSetProjectParameter, LlPrintGetProject-Parameter208


GrundlagenLlGetDlgboxModeSyntax:UINT LlGetDlgboxMode(void);Aufgabe:Rückgabe der Einstellungsparameter des Dialogbox-Layouts.Rückgabewert:Eine mit 'oder' verknüpfte Zahl von Dialogbox-Modus und den erweiterten Flags:Dialogbox-Modus: LL_DLGBOXMODE_SAA, LL_DLGBOXMODE_ALT1, LL_-DLGBOXMODE_ALT2, LL_DLGBOXMODE_ALT3, LL_DLGBOXMODE_ALT4, LL_-DLGBOXMODE_ALT5, LL_DLGBOXMODE_ALT6, LL_DLGBOXMODE_ALT7, LL_-DLGBOXMODE_ALT8 oder LL_DLGBOXMODE_ALT9erweiterte Flags: LL_DLGBOXMODE_3DBUTTONS oder LL_DLGBOXMODE_NO-BITMAPBUTTONSSiehe auch:LlSetDlgboxMode, LlJobOpen, LlJobOpenLCIDLlGetErrortextSyntax:INT LlGetErrortext(INT nError, LPTSTR lpszBuffer, UINT nBufSize);Aufgabe:Liefert eine lokalisierte Fehlermeldung für den übergebenen Fehlercode.Parameter:nError: FehlercodelpszBuffer: Zeiger auf Puffer, in den die Meldung gespeichert werden sollnBufSize: Größe des PuffersRückgabewert:Fehlercode bzw. benötigte PuffergrößeHinweise:Diese Funktion kann verwendet werden, um eine Fehlermeldung anzuzeigen.Häufigere Fehler sind z.B. LL_ERR_EXPRESSION (-23) oder LL_ERR_NOPRINTER(-18). Wenn bereits ein Job geöffnet wurde erfolgt die Ausgabe in der Sprachedes jeweiligen Jobs, ansonsten wird die Sprache des ersten gefundenen Sprachkitsverwendet.209


Beschreibung der API-FunktionenLlGetFieldContentsSyntax:INT LlGetFieldContents(HLLJOB hJob, LPCTSTR lpszName, LPTSTR lpszBuffer,UINT nBufSize);Aufgabe:Gibt den Inhalt des entsprechenden Felds zurück.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: Zeiger auf ANSIZ-Zeichenkette mit FeldnamelpszBuffer: Zeiger auf Puffer, in den der Inhalt gespeichert werden sollnBufSize: Größe des PuffersRückgabewert:Fehlercode (meist LL_ERR_UNKNOWN_FIELD oder 0)Hinweise:Diese Funktion kann in Callback-Routinen verwendet werden, um Variableninhalteabzufragen.Siehe auch:LlDefineFieldStart, LlDefineFieldExt, LlDefineFieldExtHandle, LlGetFieldTypeLlGetFieldTypeSyntax:INT32 LlGetFieldType(HLLJOB hJob, LPCTSTR lpszName);Aufgabe:Gibt den Typ des entsprechenden Felds (oder Chart-Felds) zurück.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: Zeiger auf ANSIZ-Zeichenkette mit FeldnameRückgabewert:Feldtyp (positiv), oder Fehlercode (negativ)Hinweise:Diese Funktion kann in Callback-Routinen verwendet werden, um Variableninhalteabzufragen.210


GrundlagenSiehe auch:LlDefineFieldStart, LlDefineFieldExt, LlDefineFieldExtHandle, LlGetFieldContentsLlGetNotificationMessageSyntax:UINT LlGetNotificationMessage(HLLJOB hJob);Aufgabe:Parameter:Rückgabe der Nachrichtennummer für Callback-(USER-)Objekte.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:Hinweise:eingestellte NachrichtennummerDie voreingestellte Nachrichtennummer hat den Wert der Funktion Register-WindowMessage("cmbtLLMessage").Höhere Priorität hat die Callback-Funktion. Wenn diese definiert ist, wird keineNachricht gesendetBeispiel:HLLJOB hJob;INT wMsg;LlSetDebug(TRUE);hJob = LlJobOpen(0);v = LlGetNotificationMessage(hJob);LlJobClose(hJob);Siehe auch:LlSetNotificationMessage, LlSetNotificationCallbackLlGetOptionSyntax:UINT32 LlGetOption(HLLJOB hJob, INT nMode);Aufgabe:Fragt diverse Einstellungen und Parameter (s.u.) in <strong>List</strong> & <strong>Label</strong> ab.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenMode: Optionsindex, siehe LlSetOption()211


Beschreibung der API-FunktionenRückgabewert:Hinweise:Der Wert der entsprechenden OptionDie für den Mode-Parameter gültigen Werte sind bei LlSetOption() aufgeführt.Hinzu kommen folgende neue oder im Rückgabewert modifizierte Optionen:LL_OPTION_DEFPRINTERINSTALLEDGibt zurück, ob es im Betriebssystem einen Default-Drucker gibt.LL_OPTION_LANGUAGEÜber diese Option können Sie die eingestellte Sprache abfragen. Siehe LlJobOpen()und LlJobOpenLCID().LL_OPTION_HELPAVAILABLELOWORD: Einstellung von LlSetOption()HIWORD: Testet, ob die Hilfedatei benutzbar ist: TRUE: benutzbar, FALSE: nichtbenutzbarBeispiel:HLLJOB hJob;UINT32 n;hJob = LlJobOpen(0);n = LlGetOption(hJob, LL_OPTION_LANGUAGE, TRUE);// ....LlJobClose(hJob);Siehe auch:LlSetOptionLlGetOptionStringSyntax:INT LlGetOptionString(HLLJOB hJob, INT nMode, LPTSTR pszBuffer,UINT nBufSize);Aufgabe:Fragt diverse Einstellungen in <strong>List</strong> & <strong>Label</strong> ab.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-Handle212nMode: Optionsindex, siehe LlSetOptionString()pszBuffer: Puffer für RückgabewertnBufSize: Größe des Puffers


GrundlagenRückgabewert:Hinweise:Siehe auch:FehlercodeDie für den Mode-Parameter gültigen Werte sind bei LlSetOptionString() aufgeführt.LlSetOptionStringLlGetPrinterFromPrinterFileSyntax:INT LlGetPrinterFromPrinterFile(HLLJOB hJob, UINT nObjType,LPCTSTR pszObjName, INT nPrinter, LPCTSTR pszPrinter,UINT* pnSizePrn, DEVMODE* pDM, UINT* pnSizeDm);Aufgabe:Ermöglicht es, die Druckerkonfiguration aus der Druckerbeschreibungsdatei zulesen.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenObjType: LL_PROJECT_LABEL, LL_PROJECT_LIST oder LL_PROJECT_CARDpszObjName: Dateiname des ProjektsnPrinter: Druckerindex (0 für Erstseiten-Drucker, 1 für Folgeseiten-Drucker)pszPrinter: Zeiger auf einen Puffer, in den der Druckername gespeichert werdensoll. Wenn pszPrinter NULL ist und pnSizePrn nicht NULL ist, wird die Größe desbenötigten Platzes in *pnSizePrn gespeichert.pnSizePrn: Puffergröße des Bereichs, auf den pszPrinter zeigtpDM: Zeiger auf einen Puffer, in dem die DEVMODE-Struktur des Druckers abgelegtwird. Wenn pDM NULL ist und pnSizeDm nicht NULL ist, wird die Größe desbenötigten Platzes in *pnSizeDm gespeichert.pnSizeDm: Puffergröße des Bereichs, auf den pDM zeigtRückgabewert:FehlercodeHinweise:Die DEVMODE-Struktur ist in der Windows-API definiert.213


Beschreibung der API-FunktionenBeispiel:WCHAR szFilenameW[MAX_PATH];UINT PrnSize = 0;UINT DEVMODESize = 0;mbstowcs(szFilenameW,szFilenameA,MAX_PATH);LlGetPrinterFromPrinterFileW(hJob,nPrjType,szFilenameW, nPrn,NULL,&nPrnSize,NULL,&nDEVMODESize);WCHAR szPrinter[MAX_PATH];DEVMODEW* pDEVMODE = (DEVMODEW*)(new BYTE[nDEVMODESize]);ASSERT(nPrnSize


GrundlagenSiehe auch:LlSetUserVariableContentsLlGetUsedIdentifiersSyntax:INT LlGetUsedIdentifiers(HLLJOB hJob, LPCTSTR lpszProjectName,LPTSTR lpszBuffer, UINT nBufSize);Aufgabe:Liefert die im angegebenen Projekt verwendeten Variablen, Felder und Chartfelderals semikolon-separierte <strong>List</strong>e zurück.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszProjectName: Zeiger auf ANSIZ-Zeichenkette mit ProjektnamelpszBuffer: Zeiger auf Puffer, in den der Inhalt gespeichert werden sollnBufSize: Größe des PuffersRückgabewert:Fehlercode (meist LL_ERR_UNKNOWN_FIELD oder 0)Hinweise:Mit Hilfe dieser Funktion lassen sich vor dem Druckstart die tatsächlich benötigtenFelder, Chartfelder und Variablen ermitteln. Dadurch brauchen auch nur dieseangemeldet zu werden, was zu erheblichen Performancegewinnen führen kann.Damit die <strong>List</strong>e im Projektfile aufgebaut werden kann, muß das Projekt einmaligmit <strong>List</strong> & <strong>Label</strong> 11 oder neuer im Designer gespeichert werden. Für "ältere" Projektewird der Fehlercode - LL_ERR_UNKNOWN_FIELD zurückgeliefert, in diesemFalle müssen Sie alle Felder, Chartfelder und Variablen anmelden um den Druckerfolgreich zu starten.Siehe auch:LlPrintIsVariableUsed, LlPrintIsChartFieldUsed, LlPrintIsFieldUsedLlGetUserVariableContentsSyntax:INT LlGetUserVariableContents(HLLJOB hJob, LPCTSTR lpszName,LPTSTR lpszBuffer, UINT nBufSize);Aufgabe:Gibt den Inhalt der gewünschten Benutzervariablen zurück.215


Beschreibung der API-FunktionenParameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: Zeiger auf ANSIZ-Zeichenkette mit FeldnamelpszBuffer: Zeiger auf Puffer, in den der Inhalt gespeichert werden sollnBufSize: Größe des PuffersRückgabewert:Hinweise:Fehlercode (meist LL_ERR_UNKNOWN_FIELD oder 0)Diese Funktion kann in Callback-Routinen verwendet werden, um Benutzervariableninhalteabzufragen.Der Typ einer Benutzervariable kann über LlGetVariableType() oder LlGetField-Type() abgefragt werden.Siehe auch:LlGetSumVariableContents, LlGetVariableContentsLlGetVariableContentsSyntax:INT LlGetVariableContents(HLLJOB hJob, LPCTSTR lpszName,LPCTSTR lpszBuffer, UINT nBufSize);Aufgabe:Gibt den Inhalt der entsprechenden Variablen zurück.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: Zeiger auf ANSIZ-Zeichenkette mit VariablennamelpszBuffer: Zeiger auf Puffer, in den der Inhalt gespeichert werden sollnBufSize: Größe des PuffersRückgabewert:Fehlercode (meist LL_ERR_UNKNOWNVARIABLE oder 0)Hinweise:Diese Funktion kann in Callback-Routinen verwendet werden, um Variableninhalteabzufragen.216


GrundlagenSiehe auch:LlDefineVariableStart, LlDefineVariableExt, LlDefineVariableExtHandle, LlGet-VariableTypeLlGetVariableTypeSyntax:INT32 LlGetVariableType(HLLJOB hJob, LPCTSTR lpszName);Aufgabe:Parameter:Gibt den Typ der entsprechenden Variablen zurück.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: Zeiger auf ANSIZ-Zeichenkette mit VariablennameRückgabewert:Hinweise:Siehe auch:Variablentyp (positiv), oder Fehlercode (negativ)Diese Funktion kann in Callback-Routinen verwendet werden, um Variablentypenabzufragen.LlDefineVariableStart, LlDefineVariableExt, LlDefineVariableExtHandle, LlGet-VariableContentsLlGetVersionSyntax:INT LlGetVersion(INT nCmd);Aufgabe:Parameter:Rückgabe der Versionsnummer von <strong>List</strong> & <strong>Label</strong>.WertBedeutungLL_VERSION_MAJOR Rückgabe der Haupt-Versionsnummer, z.B. 13LL_VERSION_MINOR Rückgabe der Unter-Versionsnummer, z.B. 13, (13 bedeutet013, da die Unter-Versionsnummer bei <strong>List</strong> &<strong>Label</strong> immer 3-stellig ist)217


Beschreibung der API-FunktionenRückgabewert:siehe ParameterBeispiel:INT v;v = LlGetVersion(LL_VERSION_MAJOR);LlJobCloseSyntax:void LlJobClose(HLLJOB hJob);Aufgabe:Schließen des DLL-JobsParameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleHinweise:Diese Funktion muss am Ende aufgerufen werden (paarweise mit LlJobOpen()oder LlJobOpenLCID()), d.h. nach Benutzung der <strong>List</strong> & <strong>Label</strong>-DLL oder bei BeendigungIhres Programms.Beispiel:HLLJOB hJob;hJob = LlJobOpen(1);LlDefineVariableStart(hJob);LlDefineVariable(hJob, "Name", "Normalverbraucher");LlDefineVariable(hJob, "Vorname", "Otto");LlJobClose(hJob);Siehe auch:LlJobOpen, LlJobOpenLCIDLlJobOpenSyntax:HLLJOB LlJobOpen(INT nLanguage);Aufgabe:Öffnet den DLL-Job. Fast alle DLL-Befehle benötigen den Rückgabewert dieserFunktion als Parameter.Parameter:nLanguage: gewählte Sprache für Benutzer-InteraktionenWertBedeutung218


GrundlagenWertCMBTLANG_DEFAULTCMBTLANG_GERMANCMBTLANG_ENGLISHBedeutungim System voreingestellte SprachedeutschenglischWeitere Konstanten in den Deklarationsdateien.wenn dieser Parameter mit dem Wert LL_JOBOPENFLAG_NOLLXPRELOADver"odert" wird, werden die <strong>List</strong> & <strong>Label</strong>-Extensions nicht (vor-)geladen.Rückgabewert:Ein Handle, das bei den meisten Funktionen als Parameter benötigt wird, um aufdie applikationsspezifischen Daten zugreifen zu können.Ein gültiger Wert ist größer als 0.Hinweise:Aus Übersichtsgründen empfehlen wir, globale Einstellungen, die für alle <strong>List</strong> &<strong>Label</strong>-Aufrufe gelten sollen, ein einziges Mal nach LlJobOpen() zu tätigen (z.B. Dialogdesignoder Callback-Modi).Die C?LL13-DLL benötigt die sprachabhängigen Teile in einer separaten DLL, z.B.C?LL1300.LNG oder C?LL1301.LNG, die je nach Sprach-Einstellung benutzt werden.Lesen Sie hierzu auch Kapitel 1.Wenn <strong>List</strong> & <strong>Label</strong> nicht mehr benötigt wird, sollte der Job über die FunktionLlJobClose() wieder freigegeben werden, um der DLL eine Chance zu geben, dieinternen Variablen zu diesem Job freigeben zu können.Viele weitere Sprachen sind als Sprachmodule zusätzlich erhältlich. Fragen Sieunseren Vertrieb.Beispiel:HLLJOB hJob;hJob = LlJobOpen(CMBTLANG_GERMAN);LlDefineVariableStart(hJob);LlDefineVariable(hJob, "Name", "Normalverbraucher");LlDefineVariable(hJob, "Vorname", "Otto");LlJobClose(hJob);Siehe auch:LlJobOpenLCID, LlJobClose, LlSetOption, LlSetOptionStringLlJobOpenLCIDSyntax:HLLJOB LlJobOpenLCID(UINT32 nLCID);219


Beschreibung der API-FunktionenAufgabe:Parameter:Siehe LlJobOpen().nLCID: Windows-Locale-ID gilt nur für das BenutzerinterfaceRückgabewert:Hinweise:Siehe LlJobOpen().Ruft LlJobOpen() auf mit der zur LCID gehörigen CMBTLANG_...-Konstanten.Beispiel:HLLJOB hJob;hJob = LlJobOpenLCID(LOCALE_USER_DEFAULT);LlDefineVariableStart(hJob);LlDefineVariable(hJob, "Name", "Normalverbraucher");LlDefineVariable(hJob, "Vorname", "Otto");LlJobClose(hJob);Siehe auch:LlJobOpen, LlJobClose, LL_OPTION_LCID, LL_OPTION_CODEPAGE, WIN-API:GetACPLlPreviewDeleteFilesSyntax:INT LlPreviewDeleteFiles(HLLJOB hJob, LPCTSTR lpszObjName,LPCTSTR lpszPath);Aufgabe:Löscht die beim Preview angelegten Preview-Dateien.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszObjName: gültiger Projektdateiname mit PfadangabelpszPath: gültiger Pfad der Preview-Dateien mit abschließendem Backslash "\"Rückgabewert:FehlercodeHinweise:Sollte immer nach einem LlPreviewDisplay() aufgerufen werden, da die erstelltenVorschaudateien im Allgemeinen nur momentane Gültigkeit haben.220


GrundlagenSollte natürlich nicht (sofort) aufgerufen werden, wenn Sie die Vorschaudateienarchivieren oder später (z.B. im Hintergrund) drucken möchten.Siehe auch:LlPreviewDisplay, LlPreviewDisplayEx, LlPreviewSetTempPathLlPreviewDisplaySyntax:INT LlPreviewDisplay(HLLJOB hJob, LPCTSTR lpszObjName,LPCTSTR lpszPath, HWND hWnd);Aufgabe:Startet das separat aufzurufende Preview-Fenster für eine Echt-Daten-Vorschau.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszObjName: gültiger Projektdateiname mit PfadangabelpszPath: gültiger Pfad der Vorschau-Dateien mit abschließendem Backslash "\"hWnd: Fensterhandle des aufrufenden ProgrammsRückgabewert:FehlercodeHinweise:Wenn Pfad NULL oder "" ist, wird der Pfad genommen, in dem die Definitionsdateigespeichert ist.LlPreviewDisplay() ruft intern LlPreviewDisplayEx() mit LL_PRVOPT_PRN_ASK-PRINTERIFNEEDED auf.Beispiel:Siehe Programmbeispiel im Kapitel "Preview".Siehe auch:LlPrintStart, LlPrintWithBoxStart, LlPreviewDeleteFiles, LlPreviewSetTempPath,LlPreviewDisplayExLlPreviewDisplayExSyntax:INT LlPreviewDisplayEx(HLLJOB hJob, LPCTSTR lpszObjName,LPCTSTR lpszPath, HWND hWnd, UINT32 nOptions, LPVOID pOptions);221


Beschreibung der API-FunktionenAufgabe:Parameter:Startet das separate Preview-Fenster für eine Echt-Daten-Vorschau mit der Möglichkeitspezielle Druckerkonfigurationen vorzugeben.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszObjName: gültiger Projektdateiname mit PfadangabelpszPath: gültiger Pfad der Preview-Dateien mit abschließendem Backslash "\"hWnd: Fensterhandle des aufrufenden ProgrammsnOptions:WertBedeutungLL_PRVOPT_PRN_-USEDEFAULTLL_PRVOPT_PRN_-ASKPRINTERIFNEEDEDLL_PRVOPT_PRN_-ASKPRINTERALWAYSDer Preview benutzt den Default-Drucker als AusgabemediumDer Preview versucht, die in dem Druckfile gespeichertenDrucker zu finden. Wenn diese nicht gefundenwerden, kann der Benutzer die DruckerwählenEs erscheint in jedem Fall ein Druckerauswahl-Dialog, in dem der Benutzer seine Druckerzuordnungbestimmen kannpOptions: Optionen für zukünftige Versionen, jetzt NULL oder ""!Rückgabewert:FehlercodeHinweise:Unabhängig vom Designer aufzurufendes Fenster mit der Möglichkeit, eine wirklichkeitsnaheDruckvorschau zu realisieren.Wenn Pfad NULL oder "" ist, wird der Pfad genommen, in dem die Definitionsdateigespeichert ist.Siehe auch:LlPreviewDeleteFiles, LlPreviewSetTempPath, LlPreviewDisplayLlPreviewSetTempPathSyntax:INT LlPreviewSetTempPath(HLLJOB hJob, LPCTSTR lpszPath);Aufgabe:Setzt einen Pfad für die Druckvorschau-Datei(en).222


GrundlagenParameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszPath: gültige Pfadangabe mit abschließendem Backslash "\"Rückgabewert:Hinweise:FehlercodeWenn Pfad NULL oder "" ist, wird der Pfad genommen, in dem die Definitionsdateigespeichert ist. In diesem Pfad wird die Vorschaudatei gespeichert. Der Dateinameist immer der Projektname, die Dateiendung ist immer ".LL". Die Seitendateienliegen im Storage-Format vor und können so gegebenenfalls weiterverarbeitetoder zu Archivierungszwecken gespeichert werden.Dieser Befehl muss VOR dem ersten LlPrint() aufgerufen werden.Siehe auch:LlPrintStart, LlPrintWithBoxStart, LlPreviewDisplay, LlPreviewDisplayExLlPrintSyntax:INT LlPrint(HLLJOB hJob);Aufgabe:Ausgabe aller Objekte auf dem Drucker.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:FehlercodeHinweise:Es werden alle Objekte ausgegeben, von einem Tabellenobjekt die Kopfzeile (sieheLL_OPTION_DELAYTABLEHEADER). Eine Tabelle muss danach mit LlPrint-Fields()-Aufrufen gefüllt werden. Durch LlPrint() wird der Seitenvorschub ausgelöst.Karteikarten/Etikettenprojekte: So lange LlPrint() LL_WRN_REPEAT_DATA zurückliefert,muss es noch einmal aufgerufen werden, da sich dann durch einen Umbruchdas Objekt auf einer neuen Seite fortsetzt.Beispiel:Siehe Programmbeispiel im Kapitel "Einführung in die Programmierung"223


Beschreibung der API-FunktionenSiehe auch:LlPrintFields, LlPrintEnableObjectLlPrintAbortSyntax:INT LlPrintAbort(HLLJOB hJob);Aufgabe:Parameter:Beendet Ausdruck (evtl. unvollendete Seite bleibt unvollendet oder wird evtl.nicht ausgedruckt).hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:Hinweise:FehlercodesWird benötigt, um den Druck durch das Programm abzubrechen, wenn nichtLlPrintWithBoxStart() verwendet wird.Der Unterschied zum ´normalen´ Ende, d.h. dazu, nicht mehr LlPrint() oderLlPrintFields() aufzurufen, liegt darin, dass noch im Druckertreiber stehende Datenverworfen werden, so dass der Druck möglicherweise mitten auf einer Seite beendetwird.Danach folgende LlPrint....()-Aufrufe geben als Rückgabewert LL_USER_ABORTEDzurück.Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);if (LlPrintStart(hJob, LL_PROJECT_LABEL, "test", LL_PRINT_NORMAL) == 0){for all data records{if (bDataError)LlPrintAbort(hJob);}LlPrintEnd(hJob);}elseMessageBox(NULL, "Fehler", "<strong>List</strong> & <strong>Label</strong>",MB_OK);LlJobClose(hJob);Siehe auch:LlPrintStart, LlPrintWithBoxStart, LlPrintEnd224


GrundlagenLlPrintCopyPrinterConfigurationSyntax:INT LlPrintCopyPrinterConfiguration(HLLJOB hJob, LPCTSTR lpszFilename,INT nFunction);Aufgabe:Ermöglicht die Speicherung bzw. das Restaurieren der Druckerkonfiguration.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszFilename: Dateiname der Druckerkonfiguration (P-Datei)nFunction: auszuführende Aktion.AktionLL_PRINTERCONFIG_SAVELL_PRINTERCONFIG_-RESTORERückgabewert:Fehlercode (immer 0)Bedeutungspeichert die Druckerkonfiguration des zum Druckgeöffneten Projekts in eine andere Dateikopiert die durch LL_PRINTERCONFIG_SAVE gespeicherteDruckerkonfiguration wieder zu demaktuellen geöffneten Druckprojekt.Hinweise:LL_PRINTERCONFIG_RESTORE muss nach LlPrint[WithBox]Start() und vorLlPrint() aufgerufen werden!Beispiel:Folgendes Prinzip sollte z.B. bei selbsterstellten Kopien auf temporär geändertenDrucker benutzt werden (da ansonsten nur die erste Kopie auf den geändertenDrucker geschrieben wird):for each copy{LlPrintWithBoxStart(...)if (erste Kopie){LlPrintOptionsDialog(...);LlPrintCopyPrinterConfiguration("curconfig.~~~",LL_PRINTERCONFIG_SAVE);}else{LlPrintCopyPrinterConfiguration("curconfig.~~~",LL_PRINTERCONFIG_RESTORE);}.. LlPrint(), LlPrintFields(), ...}225


Beschreibung der API-FunktionenSiehe auch:LlPrintStart, LlPrintWithBoxStart, LlSetPrinterToDefault, LlPrintStart, LlPrintWith-BoxStart, LlSetPrinterInPrinterFile, LlGetPrinterFromPrinterFile, LlSetPrinterDefaultsDirLlPrintDbGetRootTableCountSyntax:INT LlPrintDbGetRootTableCount(HLLJOB hJob);Aufgabe:Parameter:Liefert die Anzahl der Tabellen in der obersten Hierarchieebene zurück. DieserWert kann verwendet werden, um eine Fortschrittsazeige zu realisieren.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:Hinweise:Siehe auch:Anzahl der TabellenBeachten Sie die Hinweise im Kapitel "4. Ansteuerung des Berichtscontainer-Objekts".LlDbAddTable, LlDbAddTableRelation, LlDbAddTableSortOrder, LlPrintDbGetCurrent-Table,LlPrintDbGetCurrentTableSortOrder, LlPrintDbGetCurrentTableRelationLlPrintDbGetCurrentTableSyntax:INT LlPrintDbGetCurrentTable(HLLJOB hJob, LPTSTR pszTableID,UINT nTableIDLength, BOOL bCompletePath);Aufgabe:Fragt die ID der aktuell zu druckenden Tabelle ab.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-Handle226pszTableID: Puffer für RückgabewertnTableIDLength: Größe des PuffersbCompletePath: Bestimmt, ob die Tabellen-ID mit allen Hierarchestufen (z.B."Orders.OrderDetails") oder nur die Tabellen-ID (z.B. "OrderDetails") zurückgeliefertwird.


GrundlagenRückgabewert:Hinweise:Siehe auch:FehlercodeBeachten Sie die Hinweise im Kapitel "4. Ansteuerung des Berichtscontainer-Objekts".LlDbAddTable, LlDbAddTableRelation, LlDbAddTableSortOrder, LlPrintDbGetCurrent-TableSortOrder,LlPrintDbGetCurrentTableRelationLlPrintDbGetCurrentTableRelationSyntax:INT LlPrintDbGetCurrentTableRelation(HLLJOB hJob, LPTSTR pszRelationID,UINT nRelationIDLength);Aufgabe:Fragt die ID der aktuell zu druckenden Unterrelation ab.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlepszRelationID: Puffer für RückgabewertnRelationIDLength: Größe des PuffersRückgabewert:FehlercodeHinweise:Beachten Sie die Hinweise im Kapitel "4. Ansteuerung des Berichtscontainer-Objekts".Siehe auch:LlDbAddTable, LlDbAddTableRelation, LlDbAddTableSortOrder, LlPrintDbGetCurrent-Table,LlPrintDbGetCurrentTableSortOrderLlPrintDbGetCurrentTableSortOrderSyntax:INT LlPrintDbGetCurrentTableSortOrder(HLLJOB hJob,LPTSTR pszSortOrderID, UINT nSortOrderIDLength);Aufgabe:Fragt die ID der aktuell zu druckenden Sortierung ab.227


Beschreibung der API-FunktionenParameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlepszSortOrderID: Puffer für RückgabewertnSortOrderIDLength: Größe des PuffersRückgabewert:Hinweise:Siehe auch:FehlercodeBeachten Sie die Hinweise im Kapitel "4. Ansteuerung des Berichtscontainer-Objekts".LlDbAddTable, LlDbAddTableRelation, LlDbAddTableSortOrder, LlPrintDbGetCurrent-Table,LlPrintDbGetCurrentTableRelationLlPrintDeclareChartRowSyntax:INT LlPrintDeclareChartRow(HLLJOB hJob, UINT nFlags);Aufgabe:Diese Funktion teilt den im Projekt enthaltenen Chart-Objekten mit, dass Wertefür diese bereitstehen.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenFlags: bestimmt, für welchen Typ von Chart-Objekten Werte zur Verfügung stehen.Rückgabewert:FehlercodeHinweise:Ein oder mehrere der folgenden Flags können für den nFlags Parameter benutztwerden:LL_DECLARECHARTROW_FOR_OBJECTS: teilt Chart-Objekten mit, dass sie sichdie Daten speichern sollenLL_DECLARECHARTROW_FOR_TABLECOLUMNS: teilt Charts in Tabellenspaltenmit, dass sie sich die Daten speichern sollenBitte beachten Sie die Hinweise im Kapitel für Chart-Objekte.228


GrundlagenDurch diesen Befehl werden Charts nicht gedruckt, sondern es wird Ihnen nurmitgeteilt, dass neue Daten für sie zur Verfügung stehen. Erst bei dem BefehlLlPrint() (für Chart-Objekte) bzw. dem Befehl LlPrintFields() (für Charts in Tabellen)werden diese ausgegeben.Beispiel:// while data to put into chart object...... LlDefineChartFieldExt(...);LlPrintDeclareChartRow(hJob, LL_DECLARECHARTROW_FOR_OBJECTS);// now print chart objectret = LlPrint();Siehe auch:LlDefineChartFieldExt, LlDefineChartFieldStartLlPrintDidMatchFilterSyntax:INT LlPrintDidMatchFilter(HLLJOB hJob);Aufgabe:Gibt an, ob der zuletzt gedruckte Datensatz dem vom Benutzer eingegebenen Filter(aus dem Designer) entsprochen hat, also wirklich ausgedruckt wurde.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:Fehlercode (wenn negativ), 0: wurde nicht ausgedruckt, 1: wurde ausgedrucktHinweise:Diese Funktion kann erst nach LlPrint() bzw. LlPrintFields() aufgerufen werden.Beispiel:ret = LlPrint();if (ret == 0 && LlPrintDidMatchfilter(hJob))++nCountOfPrintedRecords;Siehe auch:LlPrintGetFilterExpression, LlPrintWillMatchFilter, Callback LL_NTFY_FAILS_-FILTERLlPrintEnableObjectSyntax:INT LlPrintEnableObject(HLLJOB hJob, LPCTSTR lpszObject, BOOL bEnable);229


Beschreibung der API-FunktionenAufgabe:Parameter:Ermöglicht Druck des Objekts oder verhindert diesen, indem das Objekt übergangenwird.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszObject: Objektname, siehe HinweisebEnable: TRUE: Objekt druckbar, FALSE: Objekt wird übergangenRückgabewert:Hinweise:Fehlercode (wichtig!)Der Objektname kann '' (also leer) sein, um alle Objekte anzusprechen, ansonstenmuss es der vom Benutzer eingegebene Name des Objekts sein, mit einem ':'davor.Wenn der Benutzer im Designer Objekte und Objektnamen verändern kann, ist eswichtig, den Rückgabewert abzufragen, um testen zu können, ob es das Objektüberhaupt gibt!Besonders wichtig ist diese Funktion für das Auffüllen mehrerer unabhängigerTabellen. Vor LlPrint() müssen auf jeden Fall alle Tabellen enabled sein.Siehe auch Kapitel "Mehrere Tabellen".Beispiel:LlPrintEnableObject(hJob, "", TRUE);LlPrintEnableObject(hJob, ":Author<strong>List</strong>", FALSE);Siehe auch:LlPrint, LlPrintFieldsLlPrintEndSyntax:INT LlPrintEnd(HLLJOB hJob, INT nPages);Aufgabe:Beendet den Druckjob.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-Handle230nPages: Zahl der gewünschten Seitenvorschübe nach dem DruckRückgabewert:Fehlercode


GrundlagenHinweise:Der Druckerjob wird beendet und der Drucker-Device-Kontext geschlossen. Fallsbenötigt, werden Seitenvorschübe an den Ausdruck angehängt.Benutzen Sie immer LlPrintEnd(), wenn Sie ein LlPrintStart() oder LlPrintWith-BoxStart() verwendet haben, auch wenn diese Befehle mit einem Fehler abgebrochenwurden, ansonsten kann es zu Speicherverlusten kommen.Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);if (LlPrintStart(hJob, LL_PROJECT_LABEL, "test", LL_PRINT_NORMAL) == 0){LlPrintEnd(hJob,0);}elseMessageBox(NULL, "Fehler", "<strong>List</strong> & <strong>Label</strong>", MB_OK);LlJobClose(hJob);Siehe auch:LlPrintStart, LlPrintWithBoxStartLlPrinterSetupSyntax:INT LlPrinterSetup(HLLJOB hJob, HWND hWnd, UINT nObjType,LPCTSTR lpszObjName);Aufgabe:Öffnet ein Druckerauswahlfenster, und speichert die Benutzerauswahl in die Definitionsdatei.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehWnd: Window-Handle des aufrufenden ProgrammsnObjType:WertLL_PROJECT_LABELLL_PROJECT_LISTLL_PROJECT_CARDBedeutungEtiketten<strong>List</strong>enKarteikartenlpszObjName: Dateiname231


Beschreibung der API-FunktionenRückgabewert:Hinweise:FehlercodeEinfachere Variante von LlPrintOptionsDialog(). Diese Funktion muss vorLlPrint[WithBox]Start() aufgerufen werden, da sie die Druckerdefinitionsdatei direktverändert.Von der Verwendung dieser Funktion wird abgeraten, LlPrintOptionsDialog() istder Dialog der ersten Wahl.Siehe auch:LlPrintStart, LlPrintWithBoxStart, LlPrintOptionsDialog, LlPrintOptionsDialogTitle,LlPrintGetPrinterInfoLlPrintFieldsSyntax:INT LlPrintFields(HLLJOB hJob);Aufgabe:Ausgabe einer Tabellenzeile.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:Fehlercode oder LL_WRN_REPEAT_DATAHinweise:Mit LlPrintFields() wird in allen Tabellen eine Tabellenzeile mit den zum Zeitpunktdes Aufrufs definierten Feldern ausgefüllt.Mit dem Rückgabewert LL_WRN_REPEAT_DATA teilt <strong>List</strong> & <strong>Label</strong> mit, dass fürdiesen Datensatz eine neue Seite angefangen werden muss. Der <strong>Programmierer</strong>darf dann nach dem für die nächste Seite folgenden LlPrint() nicht auf den nächstenDatensatz wechseln.Wenn Sie über LlDbAddTable() mehrere Tabellen zum Design anbieten, kann derRückgabewert auch LL_WRN_TABLECHANGE sein. Dies bedeutet, dass der Benutzereine Untertabelle platziert hat, die gedruckt werden soll. Sie können dannüber LlPrintDbGetCurrentTable() erfragen, welche Tabelle zu drucken ist. BeachtenSie auch die Hinweise im Kapitel "4. Ansteuerung des Berichtscontainer-Objekts".Beispiel:Siehe Programmbeispiel im Kapitel "Einführung in die Programmierung"232


GrundlagenSiehe auch:LlPrint, LlPrintEnableObjectLlPrintFieldsEndSyntax:INT LlPrintFieldsEnd(HLLJOB hJob);Aufgabe:Parameter:Bewirkt den Druck bzw. den Versuch die Fußzeile der letzen Seite zu drucken.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:Hinweise:FehlercodeNur nötig bei <strong>List</strong>en-Projekten!Wird benötigt, um sicherzustellen, dass die Fußzeile auch gedruckt werden kann,auch wenn keine anderen Daten auf der Seite vorhanden sind.So lange der Rückgabewert LL_WRN_REPEAT_DATA ist, konnten die Fußzeileoder angehängte Objekte nicht mehr auf die letze Seite gedruckt werden. LlPrint-FieldsEnd muss dann ein weiteres Mal aufgerufen werden, um die Fußzeile oderdie angehängten Objekte dann auf einer eigenen Seite auszugeben. Ab diesemZeitpunkt liefert LastPage() aus dem Designer TRUE.Wenn Sie über LlDbAddTable() mehrere Tabellen zum Design anbieten, kann derRückgabewert auch LL_WRN_TABLECHANGE sein. Dies bedeutet, dass der Benutzerauf der selben Hierarchie-Ebene eine weitere Tabelle platziert hat, die gedrucktwerden soll. Sie können dann über LlPrintDbGetCurrentTable() erfragen,welche Tabelle zu drucken ist. Beachten Sie auch die Hinweise im Kapitel "4. Ansteuerungdes Berichtscontainer-Objekts".Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);if (LlPrintStart(hJob, LL_PROJECT_LIST, "test", LL_PRINT_NORMAL) == 0){while (LlPrintFieldsEnd(hJob) == LL_WRN_REPEAT_DATA){// Benutzer sollte abbrechen können:LlPrintUpdateBox(hJob);}LlPrintEnd(hJob,0);233


Beschreibung der API-Funktionen}elseMessageBox(NULL, "Fehler", "<strong>List</strong> & <strong>Label</strong>", MB_OK);LlJobClose(hJob);Siehe auch:LlPrintEndLlPrintGetChartObjectCountSyntax:INT LlPrintGetChartObjectCount(HLLJOB hJob, INT nType);Aufgabe:Abfrage der Anzahl der im Projekt vorhandenen Charts mit der angegebenen Platzierung.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenType: Ort des abzufragenden ChartsRückgabewert:Fehlercode oder Anzahl der ChartsHinweise:Einer der folgenden Werte muß für nType angegeben werden:LL_GETCHARTOBJECTCOUNT_CHARTOBJECTS: Gibt die Anzahl der Chart-Objektezurück. Dieses beinhaltet nicht Tabellen, die Charts enthalten.LL_GETCHARTOBJECTCOUNT_CHARTOBJECTS_BEFORE_TABLE: Gibt die Anzahlder Chart-Objekte zurück, die sich in der Druckreihenfolge vor Tabellen befinden.LL_GETCHARTOBJECTCOUNT_CHARTCOLUMNS: Gibt die Anzahl der Charts inTabellenspalten zurück.Diese Funktion kann dazu verwendet werden, die Druckschleife zu optimieren.Weitere Hinweise hierzu sowie die Anwendung finden Sie im Kapitel über Chart-Objekte.Siehe auch:LlPrintLlPrintGetCurrentPageSyntax:INT LlPrintGetCurrentPage(HLLJOB hJob);234


GrundlagenAufgabe:Parameter:Abfrage der momentanen Seitennummer.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:Hinweise:Siehe auch:Fehlercode oder SeitennummerDie Seitennummer entspricht dem Wert, der von Page() im Designer zurückgegebenwird.LlPrintLlPrintGetFieldCharsPrintedHinweise:Diese Funktion ist zwar aus Kompatibilitätsgründen zur Version 5 weiterhin enthalten,wird aber nicht mehr unterstützt. Verwenden Sie diese Funktion nichtmehr!LlPrintGetFilterExpressionSyntax:INT LlPrintGetFilterExpression(HLLJOB hJob, LPTSTR pszBuffer,UINT nBufSize);Aufgabe:Fragt die vom Benutzer in dem Projekt (Designer) eingegebene Filterbedingungab.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlepszBuffer: Puffer für RückgabewertnBufSize: Größe des PuffersRückgabewert:FehlercodeHinweise:Diese Funktion kann erst nach dem Einlesen eines Projekts, also nachLlPrint[WithBox]Start() benutzt werden.235


Beschreibung der API-FunktionenSiehe auch:LlPrintWillMatchFilter, LlPrintDidMatchFilterLlPrintGetItemsPerPageSyntax:INT LlPrintGetItemsPerPage(HLLJOB hJob);Aufgabe:Parameter:Gibt die Zahl der Etiketten einer Seite zurück (Spaltenzahl * Zeilenzahl) entsprechendden Einstellungen des Projekts.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:Hinweise:Siehe auch:Zahl der Etiketten oder Fehlercode (negativ).Bei LL_PROJECT_LIST-Objekten wird immer 1 zurückgegeben.Kann zur Berechnung der Ausgabe-Gesamtseitenzahl verwendet werden.LlPrintGetItemsPerTable, LlPrintGetRemainingItemsPerTableLlPrintGetItemsPerTableSyntax:INT LlPrintGetItemsPerTable(HLLJOB hJob);Aufgabe:236Gibt die Datenzeilenanzahl der kleinsten <strong>List</strong>e (diese können aber aus multiplenDatenzeilen bestehen) einer Seite zurück.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:Zahl der Tabellenzeilen oder Fehlercode (negativ)Hinweise:Kann zur Grob-Berechnung der Ausgabe-Gesamtseitenzahl verwendet werden.Dieser Wert muss nicht korrekt sein, da durch Wortumbruch, Gruppierungen oderverschiedene Zeilenzahlen pro Feld die Zeilenhöhe oder der Raum für Datenzeilensehr variieren kann.


GrundlagenSiehe auch:Darstellungsbedingungen und Formeln werden mit dem zu diesem Zeitpunkt definiertenFeld- und Variableninhalten ausgewertet.LlPrintGetItemsPerPage, LlPrintGetRemainingItemsPerTableLlPrintGetOptionSyntax:INT LlPrintGetOption(HLLJOB hJob, INT nIndex);Aufgabe:Parameter:Gibt verschiedene Druckoptionen zurück, die z.B. bei dem Aufruf von LlPrintOptionsDialog()vom Benutzer gesetzt wurden.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenIndex: einer der folgenden Werte: LL_PRNOPT_COPIES, LL_PRNOPT_PAGE,LL_PRNOPT_OFFSET, LL_PRNOPT_UNIT, LL_PRNOPT_FIRSTPAGE, LL_PRNOPT_-LASTPAGE, LL_PRNOPT_JOBPAGES oder LL_PRNOPT_COPIES_SUPPORTEDRückgabewert:Hinweise:vom Benutzer gewählte EinstellungZusätzlich zu den bei LlPrintSetOption() einstellbaren Werten gibt es noch weitere:LL_PRNOPT_COPIES_SUPPORTEDGibt zurück, ob die über LL_PRNOPT_COPIES eingestellte Kopienzahl durch denDrucker selbst unterstützt wird. Dies macht üblicherweise nur bei <strong>List</strong>enprojektenSinn.Wichtig: Diese Abfrage bewirkt gleichzeitig, dass - sofern der Drucker Kopienunterstützt - die über LL_PRNOPT_COPIES eingestellten Kopien vom Druckerübernommen werden.Wenn nicht, muss LL_PRNOPT_COPIES auf 1 gesetzt werden und die Kopiendann evtl. "von Hand" gedruckt werden.LL_PRNOPT_DEFPRINTERINSTALLEDGibt zurück, ob es im Betriebssystem einen Default-Drucker gibt.237


Beschreibung der API-FunktionenLL_PRNOPT_JOBIDAbgefragt nach LlPrint() gibt diese Option die Druckjobnummer des Spoolers zurück.Wenn mehrere Drucker im Projekt definiert sind oder mehrere Druckjobsausgegeben werden, können natürlich nach den LlPrint()s verschiedenen IDs zurückgeliefertwerden, es sollte also nach jedem LlPrint() abgefragt werden.Mit dieser ID kann man über Windows-API-Funktionen die tatsächliche Ausführungeines Druckjobs überwachen.LL_PRNOPT_PRINTORDER gibt die gewählte Druckreihenfolge des Projekts zurück.Default: LL_PRINTORDER_HORZ_LTRBLL_PRNOPT_UNITGibt die verwendete Maßeinheit zurück, vorgegeben durch ´iMeasure´ in der´[intl]´ section in WIN.INI (bzw. Systemeinstellungen bei Win32). Rückgabewertesind LL_UNITS_MM_DIV_10 für 1/10 mm und LL_UNITS_INCH_DIV_100 für 1/100Inch.LL_PRNOPT_USE2PASSLiefert zurück, ob der Druck ein Two-Pass-Verfahren verwendet, d.h. ob im Projektdie Gesamtseitenzahl ausgeben wird.LL_PRNOPT_JOBIDVerwenden Sie diese Option nach LlPrint() um die Job-Nummer des Druckjobs imSpooler zu erfragen.Diese ID kann mit Windows_API-Funktionen verwendet werden, um die Ausführungdes Druckjobs zu kontrollieren.Beispiel:siehe Programmbeispiel bei LlGetOptionSiehe auch:LlPrintSetOption, LlPrintOptionsDialogLlPrintGetOptionStringSyntax:INT LlPrintGetOptionString(HLLJOB hJob, INT nMode, LPTSTR pszBuffer,INT nBufSize);Aufgabe:Fragt diverse Einstellungen in <strong>List</strong> & <strong>Label</strong> ab.238


GrundlagenParameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenMode: OptionsindexpszBuffer: Puffer für RückgabewertnBufSize: Größe des PuffersRückgabewert:Hinweise:Siehe auch:FehlercodeDie für den Mode-Parameter gültigen Werte sind bei LlPrintSetOptionString() aufgeführt.LlPrintSetOptionStringLlPrintGetPrinterInfoSyntax:INT LlPrintGetPrinterInfo(HLLJOB hJob, LPTSTR lpszPrn, UINT nPrnBufSize,LPTSTR lpszPort, UINT nPortBufSize);Aufgabe:Rückgabe von Informationen über den Zieldrucker des DruckprojektsParameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszPrn: Puffer für DruckernamenPrnBufSize: Länge des durch lpszPrn bezeichneten PufferslpszPort: Puffer für DruckerportnPortBufSize: Länge des durch lpszPort bezeichneten PuffersRückgabewert:FehlercodeHinweise:Beispiele für Druckernamen sind ´HP Deskjet 500´ oder ´NEC P6´, für Druckerport´LPT2:´ oder ´\\server\printer1´.Bei einem Export enthält der Druckername die Beschreibung des Exportmodulsund der Port ist leer.239


Beschreibung der API-FunktionenSiehe auch:LlPrintStart, LlPrintWithBoxStartLlPrintGetProjectParameterSyntax:INT LlPrintGetProjectParameter(HLLJOB hLlJob, LPCTSTR pszParameter,BOOL bEvaluated, LPTSTR pszBuffer, INT nBufSize, UINT32* pnFlags)Aufgabe:Über diese Funktion kann man den Wert eines Projekt-Parameters abfragenParameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlepszParameter: Name des Parameters. Kann NULL sein (siehe Hinweise).pszBuffer: Speicherbereich, in den der Parameter geschrieben werden soll. KannNULL sein (siehe Hinweise)bEvaluated: Gibt an, ob der Wert vor der Rückgabe berechnet werden soll odernicht, falls der Parameter den Type LL_PARAMETERFLAG_FORMULA besitzt.nBufSize: Größe des Pufferbereichs, auf den pszBuffer zeigt (in TCHARs).Rückgabewert:Fehlercode bzw. benötigte PuffergrößeHinweise:Diese Funktion kann erst nach LlPrint[WithBox]Start() aufgerufen werden!Wenn pszParameter NULL ist, wird eine Semikolon-separierte <strong>List</strong>e aller USER-Parameter zurückgegeben.Wenn pszBuffer NULL ist, ist der Rückgabewert die Länge des benötigten Puffers(in TCHARS, also BYTEs im SBCS/MBCS-Fall und WCHARs bei UNICODE)inclusive der String-Terminierung.Siehe auch:LlSetDefaultProjectParameter, LlGetDefaultProjectParameter, LlPrintGetProject-ParameterLlPrintGetRemainingItemsPerTableSyntax:INT LlPrintGetRemainingItemsPerTable(HLLJOB hJob, LPCTSTR lpszField);240


GrundlagenAufgabe:Parameter:Gibt die verbleibende Zahl der Zeilen (diese können aber aus multiplen Datenzeilenbestehen) in einer Tabelle zurück.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszField: bestimmt die Tabelle (durch das hier angegebene Feld), die zur Berechnungherangezogen wird.Rückgabewert:Hinweise:Zahl der verbleibenden Tabellenzeilen oder Fehlercode (negativ)Da die Berechnung auf Grund der beim Aufruf der Funktion definierten Daten erfolgt,kann es sein, dass der Rückgabewert nicht zutreffend ist, wenn die Zeilenzahlder Einzelzeilen durch Wortumbruch variiert. Variablen- und Feldinhalte könnennicht mehr verändert werden, bis die nächste Datenzeile gedruckt wird.Wenn lpszField NULL ist oder auf eine leere Zeichenkette ("") zeigt, wird der minimaleWert aller Tabellen verwendet, ansonsten wird die Tabelle, die das angegebeneFeld enthält, zur Berechnung benutzt. Alternativ kann auch ein Objektnamemit einem vorangestellten ":" wie z.B. ":Tabelle1" angegeben werden.Darstellungsbedingungen und Formeln werden mit dem zu diesem Zeitpunkt definiertenFeld- und Variableninhalten ausgewertet.Diese Funktion ist aus Kompatibilitätsgründen zur Version 5 weiterhin enthalten,wird aber nicht mehr gepflegt.Siehe auch:LlPrintGetItemsPerPage,LlPrintGetItemsPerTable, LlPrintGetRemainingSpacePer-TableLlPrintGetRemainingSpacePerTableSyntax:INT LlPrintGetRemainingSpacePerTable(HLLJOB hJob, LPCTSTR lpszField,INT nDimension);Aufgabe:Gibt den verbleibenden Platz in einer Tabelle zurück.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszField: bestimmt die Tabelle (durch das hier angegebene Feld), die zur Berechnungherangezogen wird.241


Beschreibung der API-FunktionennDimension: bestimmt die Dimension des Rückgabewertes. Siehe auch "Hinweise".Rückgabewert:Hinweise:Verbleibender Platz in der Tabelle oder Fehlercode (negativ)Für nDimensions kann einer der folgenden Parameter übergeben werden:WertBedeutungLL_GRIPT_DIM_SCM Der Rückgabewert ist in SCM-Einheiten (1/1000mm)LL_GRIPT_DIM_PERCDer Rückgabewert ist prozentual auf die Größeder Tabelle auf der aktuellen Seite bezogenWenn lpszField NULL ist oder auf eine leere Zeichenkette ("") zeigt, wird der minimaleWert aller Tabellen verwendet, ansonsten wird die Tabelle, die das angegebeneFeld enthält, zur Berechnung benutzt. Alternativ kann auch ein Objektnamemit einem vorangestellten ":" wie z.B. ":Tabelle1" angegeben werden.LlPrintGetSortOrderSyntax:INT LlPrintGetSortOrder(HLLJOB hJob, LPTSTR lpszBuffer, UINT nBufSize);Aufgabe:Fragt die Kennungs-Zeichenkette (ID) der gewählten Sortierreihenfolge ab.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszBuffer: Puffer für RückgabewertnBufSize: Größe des PuffersRückgabewert:FehlercodeHinweise:Diese Funktion kann erst nach dem Einlesen eines Projekts, also nachLlPrint[WithBox]Start() benutzt werden.Beim Ausdruck eines Projektes sollten Sie die vom Benutzer gewählte Sortierungüber diese Funktion abfragen, und die Daten entsprechend sortiert an <strong>List</strong> & <strong>Label</strong>übergeben.242


GrundlagenDiese Funktion ist nur noch aus Kompatibilitätsgründen enthalten. Wir empfehlendie Verwendung von LlPrintDbGetCurrentTableSortOrder().Beispiel:hJob = LlJobOpen(0);if(LlPrintStart(hJob, LL_PROJECT_LABEL, "test", LL_PRINT_NORMAL)== 0){LlPrintGetSortOrder(hJob,sSortOrder,sizeof(sSortOrder);LlPrintEnd(hJob);}elseMessageBox(NULL, "Fehler", "<strong>List</strong> & <strong>Label</strong>", MB_OK);LlJobClose(hJob);Siehe auch:LlDefineSortOrderStart, LlDefineSortOrderLlPrintIsChartFieldUsedSyntax:INT LlPrintIsChartFieldUsed(HLLJOB hJob, LPCTSTR lpszFieldName);Aufgabe:Gibt an, ob das angegebene Chart-Feld von dem geladenen Projekt verwendetwird.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszFieldName: FeldnameRückgabewert:WertBedeutung1 Feld wird verwendet0 Feld wird nicht verwendetLL_ERR_UNKNOWN Feld nicht definiertHinweise:Diese Funktion kann erst nach LlPrintStart() oder LlPrintWithBoxStart() aufgerufenwerden.Diese Funktion setzt voraus, dass LL_OPTION_NEWEXPRESSIONS auf TRUEsteht (Voreinstellung).243


Beschreibung der API-FunktionenEin Aufruf von LlDefineChartFieldStart() löscht die "Benutzt"-Flags, so dass dieseFunktion direkt danach immer LL_ERR_UNKNOWN zurückmeldet, daher darfLlDefineChartFieldStart() nur vor LlPrint[WithBox]Start() verwendet werden.Statt eines einfachen Feldnamens kann auch eine Wildcardsuche verwendet werden.Hinweise hierzu finden Sie bei LlPrintIsFieldUsed.Beispiel:if (LlPrintIsChartFieldUsed(hJob, "Name")==1)LlDefineChartFieldExt(hJob, "Name",);Siehe auch:LlPrintStart, LlPrintWithBoxStart, LlPrintIsVariableUsed, LlPrintIsFieldUsedLlPrintIsFieldUsedSyntax:INT LlPrintIsFieldUsed(HLLJOB hJob, LPCTSTR lpszFieldName);Aufgabe:Gibt an, ob das angegebene Feld von dem geladenen Projekt verwendet wird.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszFieldName: FeldnameRückgabewert:WertBedeutung1 Feld wird verwendet0 Feld wird nicht verwendetLL_ERR_UNKNOWN Feld nicht definiertHinweise:Diese Funktion kann erst nach LlPrintStart() oder LlPrintWithBoxStart() aufgerufenwerden.Diese Funktion setzt voraus, dass LL_OPTION_NEWEXPRESSIONS auf TRUEsteht (Voreinstellung).Ein Aufruf von LlDefineFieldStart() löscht die "Benutzt"-Flags, so dass diese Funktiondirekt danach immer LL_ERR_UNKNOWN zurückmeldet, daher darf LlDefine-FieldStart() nur vor LlPrint[WithBox]Start() verwendet werden.244


GrundlagenStatt eines einfachen Feldnamens kann auch eine Wildcardsuche verwendet werden.Dies ist immer dann nützlich, wenn Sie Ihre Felder hierarchisch anmelden,z.B. alle Felder der Tabelle "Artikel" in der Form "Artikel.Nr", "Artikel.Bezeichnung"usw. Um zu überprüfen, ob die Artikel-Tabelle überhaupt benötigt wird, könnenSie dann für den Parameter lpszFieldName "Artikel*" übergeben.Beispiel:if (LlPrintIsFieldUsed(hJob, "Name")==1)LlDefineFieldExt(hJob, "Name",);Siehe auch:LlPrintStart, LlPrintWithBoxStart, LlPrintIsVariableUsed, LlPrintIsChartFieldUsedLlPrintIsVariableUsedSyntax:INT LlPrintIsVariableUsed(HLLJOB hJob, LPCTSTR lpszName);Aufgabe:Gibt an, ob die angegebene Variable von dem geladenen Projekt verwendet wird.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszName: VariablennameRückgabewert:WertBedeutung1 Variable wird verwendet0 Variable wird nicht verwendetLL_ERR_UNKNOWN Variable nicht definiertHinweise:Diese Funktion kann erst nach LlPrintStart() oder LlPrintWithBoxStart() aufgerufenwerden.Diese Funktion setzt voraus, dass LL_OPTION_NEWEXPRESSIONS auf TRUEsteht (Voreinstellung).Ein Aufruf von LlDefineVariableStart() löscht die Flags, so dass diese Funktion direktdanach immer LL_ERR_UNKNOWN zurückmeldet, daher darf LlDefine-VariableStart() nur vor LlPrint[WithBox]Start() verwendet werden.Statt eines einfachen Variablennamens kann auch eine Wildcardsuche verwendetwerden. Hinweise hierzu finden Sie bei LlPrintIsFieldUsed.245


Beschreibung der API-FunktionenBeispiel:Siehe auch:if (LlPrintIsVariableUsed(hJob, "Name")==1)LlDefineVariabledExt(hJob, "Name",);LlPrintStart, LlPrintWithBoxStart, LlPrintIsFieldUsedLlPrintOptionsDialogSyntax:INT LlPrintOptionsDialog(HLLJOB hJob, HWND hWnd, LPCTSTR lpszText);Aufgabe:246Ruft ein Druckoptionsauswahlfenster auf und ermöglicht es dem Benutzer,druckspezifische Einstellungen vorzunehmen.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehWnd: Window-Handle des aufrufenden ProgrammslpszText: im Dialog oben auszugebender Text, z.B. ´Es werden nun 55 Etikettengedruckt´Rückgabewert:FehlercodeHinweise:Es werden folgende Optionen abgefragt:• Drucker (oder <strong>Referenz</strong>drucker für Export)• Export-Ziel• Seitenzahl der ersten Seite (optional)• Zahl der gewünschten Kopien (optional)• Anfangsposition bei LL_PROJECT_LABEL, LL_PROJECT_CARD, wenn mehrals ein Etikett/ eine Karteikarte pro Seite vorhanden sind (optional)• Ausgabemedium (optional)• Seitenbereich von.. bis... (optional)Voreinstellungswerte können mit LlPrintSetOption() definiert werden. Diese Funktionkann erst nach LlPrintStart() / LlPrintWithBoxStart(), muss aber vor dem erstenAufruf von LlPrint() aufgerufen werden.Die Zahl der Kopien muss vom <strong>Programmierer</strong> ausgewertet werden, da viele Druckertreiberdie entsprechende Funktion nicht implementiert haben.Diese Funktion ruft intern LlPrintOptionsDialogTitle() mit NULL als pszTitle auf.Die Funktion LlPrinterSetup() liefert eine Möglichkeit, einen Druckauswahldialogohne weitere Einstellungen aufzurufen, wird aber nicht empfohlen.


GrundlagenSiehe auch:LlPrintSetOption, LlPrintGetOption, LlPrintOptionsDialogTitle, LlPrinterSetupLlPrintOptionsDialogTitleSyntax:INT LlPrintOptionsDialogTitle(HLLJOB hJob, HWND hWnd, LPCTSTR pszTitle,LPCTSTR pszText);Aufgabe:Ruft ein Druckoptionsauswahlfenster auf und ermöglicht es dem Benutzer,druckspezifische Einstellungen vorzunehmen.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehWnd: Window-Handle des aufrufenden ProgrammspszTitle: DialogtitelpszText: im Dialog oben auszugebender Text, z.B. ´Es werden nun 55 Etikettengedruckt´Rückgabewert:FehlercodeHinweise:Die Funktion ist fast identisch zu LlPrintOptionsDialog(), nur kann man hierüberauch den Dialogtitel festlegen.Siehe auch:LlPrintSetOption, LlPrintGetOption, LlPrintOptionsDialog, LlPrinterSetupLlPrintResetObjectStatesSyntax:INT LlPrintResetObjectStates(HLLJOB hJob);Aufgabe:Setzt den Ausdruck-Status der Objekte zurück.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:Fehlercode247


Beschreibung der API-FunktionenHinweise:Jedes Objekt in <strong>List</strong> & <strong>Label</strong> merkt sich intern, wie weit es gedruckt wurde (warteauf Druck, im Druck, unvollständig, fertig). Dieser Status kann wieder zurückgesetztwerden, um einen Neudruck von Objekten zu erzwingen.Diese API ist nur für Spezialfälle gedacht, wenn man das Verhalten von <strong>List</strong> & <strong>Label</strong>absichtlich modifizieren will; unerwünschte Nebeneffekte sind nicht auszuschließen.Siehe auch:LlPrintResetProjectStateLlPrintResetProjectStateSyntax:INT LlPrintResetProjectState(HLLJOB hJob);Aufgabe:Setzt den Status des Druckjobs zurück, als ob gerade LlPrint[WithBox]Start() aufgerufenwurde.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:FehlercodeHinweise:Über diese Funktion kann man den Druck-Status des gesamten Projekts "zurücksetzen"(Objektstati, Seitennummern, Benutzer- und Summenvariablen etc.), d.h.die folgenden Druck-Befehle arbeiten wieder mit einem "frischen" Projekt.Dies kann z.B. genutzt werden, um Serienbriefe zu erstellen. Der Projektstatuskann nach jedem Brief zurückgesetzt werden, um den nächsten Brief zu drucken.Außerdem sind so alle Drucke ohne Zusatzaufwand in einer Vorschaudatei enthalten.Beispiel:{LlPrintResetProjectState(hJob)}248


GrundlagenSiehe auch:LlPrintResetObjectStateLlPrintSelectOffsetExSyntax:INT LlPrintSelectOffsetEx(HLLJOB hJob, HWND hWnd);Aufgabe:Parameter:Öffnet das Auswahlfenster für die Anfangsposition.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehWnd: Window-Handle des aufrufenden ProgrammsRückgabewert:Hinweise:FehlercodeNicht für <strong>List</strong>enprojekte!Diese Funktion kann erst nach LlPrintStart() oder LlPrintWithBoxStart() aufgerufenwerden. Dieser Dialog fragt die Position des Anfangsetiketts ab. Der Offset kannmit LlPrintSetOption() und LL_PRNOPT_OFFSET vorher gesetzt und hinterher abgefragtwerden.Wenn die Projektdatei nur ein Etikett hat, wird 0 zurückgegeben.LlPrintSetBoxTextSyntax:INT LlPrintSetBoxText(HLLJOB hJob, LPCTSTR lpszText, INT nPercentage);Aufgabe:Setzt Text und Fortschrittsanzeige in der Abbruch-Dialogbox.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpszText: Text, der im Textfeld erscheinen sollnPercentage: Fortschritt in ProzentRückgabewert:Fehlercode249


Beschreibung der API-FunktionenHinweise:Um den Text mehrzeilig zu machen, können LineFeeds (´\x0a´) eingefügt werden.Unveränderte Texte oder NULL-Pointer werden nicht neu gezeichnet, um einFlimmern zu verhindern, unveränderte Prozentwerte oder ´-1´ werden ebenfallsignoriert.Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);if (LlPrintWithBoxStart(hJob, LL_PROJECT_LABEL, "test", LL_PRINT_NORMAL,LL_BOXTYPE_NORMALMETER, hWnd, "Ausdruck") == 0){LlPrintSetBoxText(hJob, "bin gleich soweit...", 0);LlPrintSetBoxText(hJob, " fertig", 100);LlPrintEnd(hJob);}elseMessageBox(NULL, "Fehler", "<strong>List</strong> & <strong>Label</strong>", MB_OK);LlJobClose(hJob);Siehe auch:LlPrintWithBoxStart, LlPrintUpdateBox, LlPrintLlPrintSetOptionSyntax:INT LlPrintSetOption(HLLJOB hJob, INT nIndex, INT nValue);Aufgabe:Setzt verschiedene Druckoptionen, z.B. um die Zahl der gewünschten Kopien(und evtl. die Anfangsseite) voreinzustellen.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenIndex:LL_PRNOPT_COPIESZahl der gewünschten Kopien. Ein Wert von LL_COPIES_HIDE versteckt die Abfrageboxin dem Optionendialog. Die Verarbeitung von Kopien ist im Kapitel überden Druck beschrieben.Voreinstellung: 1250


GrundlagenLL_PRNOPT_PAGESeitenzahl, mit der <strong>List</strong> & <strong>Label</strong> die erste Seite ausdrucken soll. Wenn sie nichteingegeben werden können soll, muss LL_PAGE_HIDE als Wert übergeben werden.Voreinstellung: 1LL_PRNOPT_OFFSETPosition (nur beim Etikettendruck) des ersten Etiketts, abhängig von der eingestelltenDruckreihenfolge.Voreinstellung: 0LL_PRNOPT_FIRSTPAGEDie vom Benutzer gewählte Startseite. Wenn "Alle" gewählt wurde, ist die ersteDruckseite mit der Startseite identisch.Voreinstellung: MIN_INTLL_PRNOPT_LASTPAGESeitennummer der letzten zu druckenden Seite.Voreinstellung: MAX_INTLL_PRNOPT_JOBPAGESHiermit stellen sie die Zahl der Seiten pro Druckjob ein, wenn Sie mit dem FlagLL_PRINT_MULTIPLE_JOBS drucken.Voreinstellung: 16LL_PRNOPT_PRINTDLG_ONLYPRINTERCOPIESWenn diese Option auf TRUE gesetzt wird, kann man die Kopien im Druckdialognur dann einstellen, wenn der Drucker auch von sich aus Kopien unterstützt.Voreinstellung: FALSE.LL_PRNOPT_PRINTDLG_DESTMASKÜber diese Option kann man eingestellt werden, welche Ausgabemedien im Druckoptionsdialogangezeigt werden sollen. Dies ist eine Ver'oder'ung (oder Addition)folgender Werte:WertLL_DESTINATION_PRNLL_DESTINATION_PRVLL_DESTINATION_FILEBedeutungDruckerPreview-DateiDrucker-Datei251


Beschreibung der API-FunktionenDiese werden durch den Ausgabe-Parameter nPrintOptions in LlPrintStart() oderLlPrintWithBoxStart() entsprechend voreingestellt:nPrintOptionsLL_PRINT_NORMALVoreinstellungLL_DESTINATION_PRNLL_PRINT_PREVIEW LL_DESTINATION_PRVLL_PRINT_FILELL_DESTINATION_FILELL_PRINT_USERSELECT alle MedienUm zusätzlich zu Druck und Preview-Druck die Exportmodule benutzen zu können,können nicht die o.g. Flags benutzt werden, in diesem Falle sollten die Ausgabemedienüber die Funktionen LlPrintGetOptionStr() und LlPrintSetOptionStr()mit den Flags LL_OPTIONSTR_EXPORTS_ALLOWED, LL_PRNOPTSTR_EXPORTeingestellt werden. Weitere Informationen finden Sie im Kapitel "Die Export-Module".252


GrundlagenBeispielLlPrintStart(hJob,..., LL_PRINT_USERSELECT,...);// nur Printer und Preview, (USERSELECT setzt alle bits)LlPrintSetOption(hJob, LL_PRNOPT_PRINTDLG_DESTMASK, LL_DESTINATION_PRN |LL_DESTINATION_PRV);// Default bitte abweichend auf Preview:LlPrintSetOption(hJob, LL_PRNOPT_PRINTDLG_DEST, LL_DESTINATION_PRV);// Druckerdialog: will der Benutzer doch noch wechseln?LlPrintOptionsDialog(hJob,....);bPreview = LlPrintGetOption(hJob, LL_PRNOPT_PRINTDLG_DEST)== LL_DESTINATION_PRV;// ...Ausgaben....// Druckende:LlPrintEnd(hJob,0);if (bPreview){LlPreviewDisplay(hJob,...)LlPreviewDeleteFiles(hJob,...)}LL_PRNOPT_PRINTDLG_DESTHiermit kann vor Aufruf des Druckerdialogs eingestellt werden, welches Ausgabemediumvoreingestellt werden soll.Während oder nach dem Druckdialog bzw. Druck (aber vor LlPrintEnd()) kann hierüberabgefragt werden, welches Medium der Benutzer ausgewählt hat.Dieses wird durch den Ausgabe-Parameter nPrintOptions in LlPrintStart() oderLlPrintWithBoxStart() entsprechend voreingestellt:nPrintOptionsVoreinstellungLL_PRINT_NORMAL LL_DESTINATION_PRNLL_PRINT_PREVIEW LL_DESTINATION_PRVLL_PRINT_FILELL_DESTINATION_FILELL_PRINT_USERSELECT LL_DESTINATION_PRNUm zusätzlich zu Druck und Preview-Druck die Exportmodule benutzen zu können,können nicht die o.g. Flags benutzt werden, in diesem Falle sollten die Ausgabemedienüber die Funktionen LlPrintGetOptionStr() und LlPrintSetOptionStr()mit den Flags LL_OPTIONSTR_EXPORTS_ALLOWED, LL_PRNOPTSTR_EXPORTeingestellt werden. Weitere Informationen finden Sie im Kapitel "Die Export-Module".LL_PRNOPT_UNITSDer Rückgabewert ist identisch mit dem von LlGetOption(..., LL_OPTION_UNITS).nValue: Setzt die dem nIndex entsprechende OptionRückgabewert:Fehlercode253


Beschreibung der API-FunktionenSiehe auch:LlPrintStart, LlPrintWithBoxStart, LlPrintGetOption, LlPrintOptionsDialogLlPrintSetOptionStringSyntax:INT LlPrintSetOptionString(HLLJOB hJob, INT nMode, LPCTSTR pszValue);Aufgabe:Parameter:254Setzt diverse Einstellungen in <strong>List</strong> & <strong>Label</strong>.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenMode: Folgende Werte sind als Funktionsindex möglich:LL_PRNOPTSTR_EXPORTGibt das gewünschte bzw. im Dialog voreingestellte Exportmedium an (z.B."RTF“, "HTML“, "PDF“, ...)LL_PRNOPTSTR_PRINTDST_FILENAMEHier kann ein Dateiname voreingestellt werden, in den die Druckausgabe geschieht,sofern LL_PRINT_FILE bzw. das Ausgabemedium LL_DESTINATION_FILEdurch den Endanwender bzw. bei LlPrint[WithBox]Start gewählt wurde.LL_PRNOPTSTR_PRINTJOBNAMEHierüber kann die Bezeichnung des Druckjobs eingestellt werden, die im Druckerspoolererscheint.Diese muss vor dem ersten Aufruf von LlPrint() angeggeben werden.pszValue: neuer WertRückgabewert:FehlercodeBeispiel:HLLJOB hJob;hJob = LlJobOpen(0);// LlPrintStart(...);LlPrintSetOptionString(hJob, LL_PRNOPTSTR_PRINTDST_FILENAME,"c:\\tmp\\ll.prn");// ....// LlPrintEnd();LlJobClose(hJob);Siehe auch:LlPrintGetOptionString


GrundlagenLlPrintSetProjectParameterSyntax:INT LlPrintSetProjectParameter(HLLJOB hLlJob, LPCTSTR pszParameter,LPCTSTR pszValue, UINT32 nFlags)Aufgabe:Ändert den Wert eines Projekt-Parameters (siehe auch Kapitel Projekt-Parameter)Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlepszParameter: Name des ParameterspszValue: Wert des ParametersnFlags: Typ des Parameters (siehe LlSetDefaultProjectParameter). Wird nur benutzt,wenn der Parameter neu ist.Rückgabewert:FehlercodeHinweise:Diese Funktion kann erst nach LlPrint[WithBox]Start() aufgerufen werden!Siehe auch:LlSetDefaultProjectParameter, LlGetDefaultProjectParameter, LlPrintGetProject-Parame-terLlPrintStartSyntax:INT LlPrintStart(HLLJOB hJob, UINT nObjType, LPCTSTR lpszObjName,INT nPrintOptions, INT nV1Dummy);Aufgabe:Öffnet das Projekt zum Drucken.ParameterhJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenObjType: LL_PROJECT_LABEL, LL_PROJECT_LIST oder LL_PROJECT_CARDlpszObjName: Der Dateiname des ProjektsnPrintOptions: Druck-Optionen:WertLL_PRINT_NORMALBedeutungAusgabe auf Drucker255


Beschreibung der API-FunktionenWertLL_PRINT_PREVIEWLL_PRINT_FILELL_PRINT_USERSELECTLL_PRINT_EXPORTBedeutungAusgabe auf Preview-DateienAusgabe in DateiAusgabe auf Drucker, im Druckdialog durch BenutzerwählbarAls Ausgabemedium wird ein Export-Modul voreingestellt,welches anschliessend über LlPrint-SetOptionString(LL_PRNOPTSTR_EXPORT) festgelegtwerden kann.kann mit LL_PRINT_MULTIPLE_JOBS ver'oder't werden, damit der Druckjob inmehrere kleinere Einzeljobs gesplittet wird und der Druck dadurch schon beginnenkann. Die Seitenanzahl, nach der der Job gesplittet werden soll, kann mitLlPrintSetOption() eingestellt werden.nV1Dummy: Dummy-Variable, für Kompatibilität mit alten VersionenRückgabewert:FehlercodeHinweise:Bitte unbedingt den Rückgabewert auswerten!nPrintOptions kann mit LL_PRINT_MULTIPLE_JOBS ver'oder't werden, damit derDruckjob in mehrere kleinere Einzeljobs gesplittet wird und der Druck dadurchschon beginnen kann. Die Seitenanzahl, nach der der Job gesplittet werden soll,kann mit LlPrintSetOption() eingestellt werden.Es wird keine Abbruch-Dialogbox gestartet, dies geschieht über LlPrintWithBox-Start().Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);if(LlPrintStart(hJob, LL_PROJECT_LABEL, "test", LL_PRINT_NORMAL)== 0){LlPrintEnd(hJob);}elseMessageBox(NULL, "Fehler", "<strong>List</strong> & <strong>Label</strong>", MB_OK);LlJobClose(hJob);Siehe auch:LlPrintWithBoxStart, LlPrintEnd, LlPrintSetOption256


GrundlagenLlPrintUpdateBoxSyntax:INT LlPrintUpdateBox(HLLJOB hJob);Aufgabe:Parameter:Ermöglicht ein Neuzeichnen der Abbruch-DialogboxhJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:Hinweise:FehlercodeWenn Sie langwierige Operationen während des Drucks ausführen, können Sieüber diese Funktion ermöglichen, dass sich die Abbruch-Box (wenn nötig) wiedervollständig zeichnet, oder auch auf einen Button-Druck "flüssig" reagiert. Zu diesemZweck ruft diese Funktion die Nachrichtenbearbeitungsschleife der Abbruch-Box auf.LlPrintSetBoxText() ruft auch diese Nachrichtenbearbeitungsschleife auf, so dassdie Funktion LlPrintUpdateBox()nur in seltenen Fällen benötigt wird.Siehe auch:LlPrintWithBoxStart, LlPrintSetBoxTextLlPrintWillMatchFilterSyntax:INT LlPrintWillMatchFilter(HLLJOB hJob);Aufgabe:Gibt an, ob der momentane Datensatz den vom Benutzer eingegebenen Filterentspricht, also bei der nächsten Ausdruckfunktion (LlPrint() oder LlPrintFields())ausgedruckt wird.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-Handle257


Beschreibung der API-FunktionenRückgabewert:WertBedeutungnegativFehlercode0 wird nicht ausgedruckt1 wird ausgedrucktHinweise:Diese Funktion kann erst nach LlPrintStart() oder LlPrintWithBoxStart() aufgerufenwerden.Die Funktion berechnet den Filterwert anhand der momentan definierten Daten(Variablen bzw. Felder).Beispiel:if (LlPrintWillMatchfilter(hJob))....Siehe auch:LlPrintGetFilterExpression, LlPrintDidMatchFilterLlPrintWithBoxStartSyntax:INT LlPrintWithBoxStart(HLLJOB hJob, UINT nObjType,LPCTSTR lpszObjName, INT nPrintOptions, INT nBoxType,HWND hWnd, LPCTSTR lpszTitle);Aufgabe:Öffnet das Projekt zum Drucken mit Abbruch-Fenster.ParameterhJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenObjType: LL_PROJECT_LABEL, LL_PROJECT_LIST oder LL_PROJECT_CARDlpszObjName: Der Dateiname des ProjektsnPrintOptions: Druck-Optionen:WertLL_PRINT_NORMALLL_PRINT_PREVIEWLL_PRINT_FILELL_PRINT_USERSELECTBedeutungAusgabe auf DruckerAusgabe auf Preview-DateienAusgabe in DateiAusgabe auf Drucker, im Druckdialog durch Benutzerwählbar258


GrundlagenWertLL_PRINT_EXPORTBedeutungAls Ausgabemedium wird ein Export-Modul voreingestellt,welches anschliessend über LlPrint-SetOptionString(LL_PRNOPTSTR_EXPORT) festgelegtwerden kann.kann mit dem Flag LL_PRINT_MULTIPLE_JOBS: Ausgabe in mehreren kleineDruckjobs kombiniert (addiert) werden. Die Druckoptionen beeinflussen den Wertvon LL_OPTIONSTR_EXPORTS_ALLOWED.nBoxType:WertBedeutungLL_BOXTYPE_STDABORT Abbruch-Box mit SystemfortschrittsanzeigeLL_BOXTYPE_-Abbruch-Box mit Balken-FortschrittsanzeigeNORMALMETERLL_BOXTYPE_-Abbruch-Box mit Brücken-FortschrittsanzeigeBRIDGEMETERLL_BOXTYPE_EMPTYABORT Abbruch-Box mit TextLL_BOXTYPE_STDWAIT Box mit Systemfortschrittsanzeige, kein AbbruchbuttonLL_BOXTYPE_-NORMALWAITLL_BOXTYPE_BRIDGEWAITLL_BOXTYPE_EMPTYWAITLL_BOXTYPE_NONEBox mit Balken-Fortschrittsanzeige, kein AbbruchbuttonBox mit Brücken-Fortschrittsanzeige, kein AbbruchbuttonBox mit Text, kein AbbruchbuttonKeine FortschrittsboxhWnd: Fenster-Handle des aufrufenden Programms (für die Dialog-Box)lpszTitle: Titel der Dialogbox, erscheint auch als Text im Druck-ManagerRückgabewert:FehlercodeHinweise:Bitte unbedingt den Rückgabewert auswerten!Es wird eine anwendungsmodale Abbruch-Dialogbox gestartet, deren Titel durchden oben angegebenen Parameter definiert wird. In der Dialogbox befindet sichein Prozent-Meter-Control und ein 2-zeiliger statischer Text, die beide über LlPrint-SetBoxText() gesetzt werden können, um dem Benutzer den Druckfortschritt anzuzeigen,und bei Anforderung (s.u.) noch ein Abbruch-Button.259


Beschreibung der API-FunktionenBeispiel:HLLJOB hJob;hJob = LlJobOpen(0);if (LlPrintWithBoxStart(hJob, LL_PROJECT_LABEL, "test", LL_PRINT_NORMAL,LL_BOXTYPE_NORMALMETER, hWnd, "Ausdruck") == 0){LlPrintSetBoxText(hJob, "Drucke...", 0);LlPrintEnd(hJob, 0);}elseMessageBox(NULL, "Fehler", "App", MB_OK);LlJobClose(hJob);Siehe auch:LlPrintStart, LlPrintEnd, LlPrintSetBoxTextLlProjectCloseSyntax:HLLDOMOBJ LlProjectClose(HLLJOB hJob);Aufgabe:Diese Funktion steht erst ab der Professional Edition zur Verfügung! Schliesstein geöffnetes Projekt und gibt die zugehörige Projektdatei wieder frei. Die Dateiwird dabei nicht gespeichert! Ausführliche Anwendungsbeispiele finden Sie imKapitel "5.1.1. DOM-Funktionen".Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandleRückgabewert:FehlercodeBeispiel:Siehe Kapitel "5.1.1. DOM-Funktionen".Siehe auch:LlProjectSave, LlProjectOpenLlProjectOpenSyntax:HLLDOMOBJ LlProjectOpen(HLLJOB hJob, UINT nObjType, LPCTSTR pszObjName,UINT nOpenMode);260


GrundlagenAufgabe:Parameter:Diese Funktion steht erst ab der Professional Edition zur Verfügung! Öffnetdie angegebene Projektdatei und liefert das DOM-Handle für das Projektobjektzurück. Dieses Objekt ist die Basis für alle weiteren DOM-Funktionen. AusführlicheAnwendungsbeispiele finden Sie im Kapitel "5.1.1. DOM-Funktionen".hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenObjType:WertLL_PROJECT_LABELLL_PROJECT_CARDLL_PROJECT_LISTBedeutungfür Etikettenfür Karteikartenfür <strong>List</strong>enpszObjName: Projektdateiname mit PfadangabenOpenMode: Kombination (Veroderung) jeweils eines Flags aus den folgendendrei Gruppen:WertBedeutungLL_PRJOPEN_CD_OPEN_EXISTING Datei muss bereits existieren, sonst wirdFehlercode zurückgeliefert.LL_PRJOPEN_CD_CREATE_ALWAYSLL_PRJOPEN_CD_CREATE_NEWLL_PRJOPEN_CD_OPEN_ALWAYSDatei wird immer neu erzeugt. Wenn schonvorhanden wird der Inhalt gelöscht.Datei wird neu erzeugt, wenn nicht vorhanden.Wenn Datei bereits existiert wird Fehlercodezurückgeliefert.Wenn Datei vorhanden, wird der Inhaltverwendet, sonst wird Datei neu erzeugt.WertLL_PRJOPEN_AM_READWRITELL_PRJOPEN_AM_READONLYBedeutungDatei wird nur für Lesezugriff geöffnet.Datei wird für Lese/Schreibzugriff geöffnet.WertLL_PRJOPEN_EM_IGNORE_FORMULAERRORSBedeutungSyntaxfehler werden ignoriert. Siehe Hinweise.261


Beschreibung der API-FunktionenRückgabewert:Hinweise:Fehlercode (


GrundlagenSiehe auch:LlProjectOpen, LlProjectCloseLlRTFCreateObjectSyntax:HLLRTFOBJ LlRTFCreateObject(HLLJOB hJob);Aufgabe:Erstellt eine Instanz des <strong>List</strong> & <strong>Label</strong> RTF-Objekts zum Aufruf unabhängig vom<strong>List</strong> & <strong>Label</strong> Designer.Rückgabewert:ParameterSiehe auch:Handle auf RTF-Editorobjekt oder NULL, wenn FehlerhJob: <strong>List</strong> & <strong>Label</strong> Job-HandleLlRTFGetTextLlRTFDeleteObjectSyntax:INT LlRTFDeleteObject(HLLJOB hJob, HLLRTFOBJ hRTF);Aufgabe:ParameterGibt das RTF-Objekt wieder frei.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehRTF: Handle auf RTF-ObjektRückgabewert:Siehe auch:FehlercodeLlRTFCreateObjectLlRTFGetTextLengthSyntax:INT LlRTFGetTextLength(HLLJOB hJob, HLLRTFOBJ hRTF, INT nFlags);263


Beschreibung der API-FunktionenAufgabe:ParameterLiefert die Länge des Inhalts des RTF-Objektes zurück. Damit kann dann z.B. einpassender Puffer bereitgestellt werden.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehRTF: Handle auf RTF-ObjektnFlags: jeweils eine Option der folgenden beiden Optionsgruppen muß angegebensein:WertBedeutungOptionen zur Wahl des Darstellungsmodus:LL_RTFTEXTMODE_RTFLL_RTFTEXTMODE_PLAINLänge des RTF-formatierten Texts (incl. RTF-Steuerzeichen)Länge des unformatierten TextsOptionen zur Wahl des Inhalts:LL_RTFTEXTMODE_RAWLL_RTFTEXTMODE_EVALUATEDText in unberechneter Form (ggf. mit Formeln)Text in ausgewerteter FormRückgabewert:Länge des benötigten PuffersSiehe auch:LlRTFCreateObject, LlRTFGetTextLlRTFCopyToClipboardSyntax:INT LlRTFCopyToClipboard(HLLJOB hJob, HLLRTFOBJ hRTF);Aufgabe:Kopiert den Inhalt des RTF-Objektes in die Zwischenablage. Dabei werden verschiedeneClipboardformate zur Verfügung gestellt (CF_TEXT, CF_TEXTW (bei U-nicode-DLL), CF_RTF)ParameterhJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehRTF: Handle auf RTF-Objekt264


GrundlagenRückgabewert:FehlercodeSiehe auch:LlRTFCreateObjectLlRTFDisplaySyntax:INT LlRTFDisplay(HLLJOB hJob, HLLRTFOBJ hRTF, HDC hDC, RECT* pRC,BOOL bRestart, UINT* pnState);Aufgabe:Gibt den Inhalt des RTF-Objektes in einem beliebigen Gerätekontext aus. Dieskann verwendet werden, um den Inhalt etwa zu drucken oder in einem eigenenFenster darzustellen.ParameterhJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehRTF: Handle auf RTF-EditorobjekthDC: Gerätekontext für die Ausgabe. Kann auch NULL sein, in diesem Fall wirdder Standard-Drucker DC verwendet.pRC: Zeiger auf Ausgaberechteck. Kann auch NULL sein, in diesem Fall wird füreinen Druckerkontext die ganze bedruckbare Seite verwendet. Andernfalls mussdie Angabe in logischen Koordinaten erfolgen (mm/10, inch/100 etc.), sofern derDC kein Bildschirm-DC ist.bRestart: Wenn TRUE, dann wird der Inhalt des Objektes (wieder) von Anfang andargestellt, ansonsten wird der Text von der letzen Ausgabe fortgesetzt, um einemehrseitige Ausgabe zu bekommen.pnState: AusgabestatusRückgabewert:FehlercodeBeispiel:// Drucker-Devicecontext erzeugenHDC hDC = CreateDC(NULL,"\\\\prnsrv\\standard",NULL,NULL);RECT rc = {0,0,1000,1000};BOOL bFinished = FALSE;INT nPage = 0;// Dokument initialisierenStartDoc(hDC,NULL);while (!bFinished)265


Beschreibung der API-Funktionen{nPage++;UINT nState = 0;// Seite initialisierenStartPage(hDC);// DC vorbereitenSetMapMode(hDC,MM_ISOTROPIC);SetWindowOrgEx(hDC,rc.left,rc.top,NULL);SetWindowExtEx(hDC,rc.right-rc.left,rc.bottom-rc.top,NULL);SetViewportOrgEx(hDC,0,0,NULL);SetViewportExtEx(hDC,GetDeviceCaps(hDC,HORZRES),GetDeviceCaps(hDC,VERTRES),NULL);// RTF-Text auf Drucker ausgebenBOOL bFinished = (LlRTFDisplay(hJob,hRTF,hDC,&rc,nPage ==1,&nState) == LL_WRN_PRINTFINISHED);// Seite bschliessenEndPage(hDC);}EndDoc(hDC);Siehe auch:LlRTFCreateObjectLlRTFEditObjectSyntax:INT LlRTFEditObject(HLLJOB hJob, HLLRTFOBJ hRTF, HWND hWnd,HDC hPrnDC, INT nProjectType, BOOL bModal);Aufgabe:Erzeugt einen RTF-Editor für die Bearbeitung des RTF-Objekts durch den Benutzer.Es stehen alle innerhalb des übergebenen <strong>List</strong> & <strong>Label</strong>-Jobs definierten Variablenund Felder (im Fall eines <strong>List</strong>enprojekts) zur Verfügung.ParameterhJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehRTF: Handle auf RTF-ObjekthWnd: Parent-Fensterhandle bzw. Handle des Controls, das für die Darstellungdes Objektes verwendet werden soll (siehe bModal-Flag)hPrnDC: <strong>Referenz</strong>-Gerätekontext (wichtig z.B. für die zur Verfügung stehendenSchriftarten). Kann auch NULL sein, in diesem Fall wird der Standard-Drucker DCverwendet.nProjectType: Projekttyp266


GrundlagenWertLL_PROJECT_LABELLL_PROJECT_CARDLL_PROJECT_LISTBedeutungfür Etikettenfür Karteikartenfür <strong>List</strong>enbModal: bestimmt, ob das Fenster als modaler Dialog angezeigt werden soll(TRUE) oder ob das Control, dessen Fensterhandle in hWnd übergeben wurde,durch das RTF-Control ersetzt werden soll (FALSE). Beachten Sie, dass von VisualC++ erzeugte Fenster leider nicht als Control-Handle für die nicht-modale Variantegeeignet sind. Wir empfehlen stattdessen die Verwendung des RTF-OCX-Controls (cmll13r.ocx).Rückgabewert:FehlercodeSiehe auch:LlRTFCreateObjectLlRTFEditorInvokeActionSyntax:INT LlRTFEditorInvokeAction(HLLJOB hJob, HLLRTFOBJ hRTF,INT nControlID);Aufgabe:Erlaubt es, eine Schaltfläche im RTF-Editor per Code zu aktivieren. Dies ist wichtig,wenn Sie den Editor inplace anzeigen (s. LlRTFEditObject) und die umgebendeApplikation ein zusätzliches Menue zur Verfügung stellen soll.ParameterhJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehRTF: Handle auf RTF-ObjektnControlID: Hier kann die Control-ID der zu aktivierenden Schaltflächen angegebenwerden. Die entsprechenden IDs finden Sie in der Datei MENUID.TXT in Ihrer<strong>List</strong> & <strong>Label</strong> Installation.Rückgabewert:FehlercodeSiehe auch:LlRTFCreateObject , LlRTFEditorProhibitAction, LlRTFEditObject267


Beschreibung der API-FunktionenLlRTFEditorProhibitActionSyntax:INT LlRTFEditorProhibitAction(HLLJOB hJob, HLLRTFOBJ hRTF,INT nControlID);Aufgabe:Erlaubt es, einzelne Schaltflächen des Editors auszublenden.ParameterhJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehRTF: Handle auf RTF-ObjektnControlID: Hier können die Control-IDs der auszublendenden Schaltflächen angegebenwerden. Die entsprechenden IDs finden Sie in der Datei MENUID.TXT inIhrer <strong>List</strong> & <strong>Label</strong> Installation.Rückgabewert:FehlercodeSiehe auch:LlRTFCreateObject , LlRTFEditorInvokeAction, LlRTFEditObjectLlRTFGetTextSyntax:INT LlRTFGetText(HLLJOB hJob, HLLRTFOBJ hRTF, INT nFlags,LPCTSTR lpszBuffer, UINT nBufferSize);Aufgabe:Fragt den Text des RTF-Objekts abParameterhJob: <strong>List</strong> & <strong>Label</strong> Job-Handle268hRTF: Handle auf RTF-ObjektnFlags: Optionen (s. LlRTFGetTextLength)lpszBuffer: Puffer für die RückgabenBufferSize: PuffergrösseRückgabewert:FehlercodeBeispiel:HLLRTFOBJ hRTF = LlRTFCreateObject(hJob);if (LlRTFEditObject(hJob,hRTF,NULL,NULL,LL_PROJECT_LABEL) >= 0){


GrundlagenINT nFlags = LL_RTFTEXTMODE_RTF|LL_RTFTEXTMODE_EVALUATED);INT nLen = LlRTFGetTextLength(hJob,hRTF,nFlags);TCHAR* pszText = new TCHAR[nLen+1];LlRTFGetText(hJob,hRTF,nFlags,pszText,nLen+1);printf("'%s'\n\n", pszText);delete[] pszText;}Siehe auch:LlRTFCreateObject, LlRTFGetTextLengthLlRTFSetTextSyntax:INT LlRTFSetText(HLLJOB hJob, HLLRTFOBJ hRTF, LPCTSTR lpszText);Aufgabe:Setzt den Inhalt des RTF-Objekts auf die übergebene Zeichenkette.ParameterhJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehRTF: Handle auf RTF-ObjektlpszText: Neuer Inhalt des ObjektsRückgabewert:FehlercodeSiehe auch:LlRTFCreateObjectLlSelectFileDlgTitleExSyntax:INT LlSelectFileDlgTitleEx(HLLJOB hJob, HWND hWnd, LPCTSTR pszTitle,UINT nObjType, LPTSTR pszBuffer, UINT nBufLen, LPVOID pReserved);Aufgabe:Öffnet einen Dateiauswahl-Dialog mit integriertem Vorschau-Fenster, sofern dieOption im Designer gewählt wurde (Voreinstellung).Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlehWnd: Fensterhandle des aufrufenden ProgrammspszTitle: Fenstertitel des Dateiauswahl-Dialogs269


Beschreibung der API-FunktionennObjType:WertLL_PROJECT_LABELLL_PROJECT_CARDLL_PROJECT_LISTBedeutungfür Etikettenfür Karteikartenfür <strong>List</strong>enwenn LL_FILE_ALSONEW addiert wird, kann ein neuer Dateiname angegebenwerden, ansonsten kann man nur eine existierende Datei wählen.pszBuffer: initialisierter Puffer für Dateinamen mit PfadangabenBufLen: Länge des PufferspReserved: reserviert, muss NULL oder leer ('') sein.Rückgabewert:FehlercodeHinweise:Wichtig für Visual Basic bei direkter DLL-Ansteuerung (nicht OCX): Der Puffermuss Null-terminiert (chr$(0)) sein und bereits auf nBufLen voralloziert sein.Analoges gilt für die meisten Programmiersprachen!!!Vorteile gegenüber normalem CommonDialog: Anzeige der Beschreibung, Preview-Skizze,Sprachkonsistenz innerhalb <strong>List</strong> & <strong>Label</strong> und die Dialogdesign-Anpassung.Beispiel:char szFilename[255+1]={0};if LlSelectFileDlgTitleEx(hJob,hWnd, "Report", LL_PROJECT_LIST, szFilename,sizeof(szFilename), NULL)==0;Siehe auch:LL_OPTION_OFNDIALOG_EXPLORER,LL_OPTION_OFNDIALOG_NOPLACESBAR, LL_OPTIONSTR_..._PRJDESCRLlSetDebugSyntax:void LlSetDebug(INT nOnOff);Aufgabe:Schaltet den Debug-Modus ein oder aus.Parameter:nOnOff: Null, wenn Debug-Mode ausgeschaltet werden soll, sonst können folgendeWerte verodert (addiert) übergeben werden:270


GrundlagenWertLL_DEBUG_CMBTLLLL_DEBUG_CMBTDWGLL_DEBUG_CMBTLL_-NOCALLBACKSLL_DEBUG_CMBTLL_NOSTORAGEBedeutungzum Einschalten der normalen Debugging-Infozum Einschalten der Debugging-Info fürGrafikfunktionenLL-Debugging, aber keine Callback-InfoLL-Debugging, aber keine StgAPI-InfoLL_DEBUG_CMBTLL_NOSYSINFO Kein System-Informations-Dump beimEinschalten des Debugging-ModusLL_DEBUG_CMBTLL_LOGTOFILE Die Ausgaben werden auch in eine Log-Datei namens COMBIT.LOG im%APPDATA%-Verzeichnis geschrieben.Hinweise:Benutzen Sie das im Lieferumfang enthaltene Programm DEBWIN2.EXE, um dieDebugausgaben in einem Extra-Fenster oder auf einem Monochrom-Monitor auszugeben.Wenn in <strong>List</strong> & <strong>Label</strong> über LlSetDebug(LL_DEBUG_CMBTLL) der Debug-Moduseingeschaltet wird, gibt die DLL jeden Funktionsaufruf mit den dazugehörigen Parameternund Ergebnissen aus. Ein Klammeraffe (´@´) ist den Funktionsnamenvorgesetzt, damit man die Funktionsaufrufe leicht von anderen internen <strong>List</strong> & <strong>Label</strong>Debugging-Ausgaben, unterscheiden kann.Die Ausgaben sind durch Einrückungen geschachtelt, falls eine DLL im Debugging-Modusandere Funktionen einer DLL (auch sich selbst) , die sich auch imDebugging-Modus befindet, aufruft.Bitte lesen Sie auch den Anhang DEBWIN2.EXE sowie die FAQ.Beispiel:HLLJOB hJob;INT v;LlSetDebug(LL_DEBUG_CMBTLL);hJob = LlJobOpen(0);v = LlGetVersion(LL_VERSION_MAJOR);LlJobClose(hJob);gibt in etwa folgendes auf dem Debugging-Output aus:@LlJobOpen(0)=1@LlGetVersion(1)=6@LlJobClose(1)Siehe auch:LlDebugOutput271


Beschreibung der API-FunktionenLlSetDefaultProjectParameterSyntax:INT LlSetDefaultProjectParameter(HLLJOB hLlJob, LPCTSTR pszParameter,LPCTSTR pszValue, UINT32 nFlags)Aufgabe:Setzt den Default-Wert eines Projekt-Parameters (siehe auch Kapitel Projekt-Parameter)Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlepszParameter: Name des Parameters. Wenn dieser Parameter NULL ist, werdenalle USER-Parameter aus der internen <strong>List</strong>e entfernt.pszValue: Wert des ParametersnFlags: Typ des Parameters:LL_PARAMETERTYPE_USERDer Parameter ist ein benutzerdefinierter Parameter (derzeit der einzige Typ)Diese Parameter können noch mit diversen Eigenschaften versehen werden, indemman sie mit je einem der folgenden Flag-Gruppen PUBLIC/PRIVATE,FORMULA/VALUE und GLOBAL/LOCAL verodert:LL_PARAMETERFLAG_PUBLICDer Parameterwert bzw. die Formel ist im Designer einstellbarLL_PARAMETERFLAG_PRIVATEDer Parameterwert bzw. die Formel ist im Designer nicht einstellbarLL_PARAMETERFLAG_FORMULADer Parameter ist eine Formel und wird beim Druck evaluiertLL_PARAMETERFLAG_VALUEDer Parameter ist ein fester WertLL_PARAMETERFLAG_GLOBALDer Wert wird im LL-File gespeichertLL_PARAMETERFLAG_LOCALDer Wert ist nur für den lokalen Rechner gültig und wird nicht im LL-File gespeichert.272


GrundlagenRückgabewert:Hinweise:FehlercodeDiese Funktion sollte vor LlDefineLayout() und LlPrint[WithBox]Start() aufgerufenwerden!Siehe auch:LlGetDefaultProjectParameter, LlPrintSetProjectParameter, LlPrintGetProject-ParameterLlSetDlgboxModeSyntax:void LlSetDlgboxMode(UINT nMode);Aufgabe:Setzen der Einstellungsparameter des Dialogbox-Layouts.Parameter:nMode: gewünschter Dialogbox-Modus. Der Dialogbox-Modus ist eine mit´oder´ verknüpfte Zahl von Dialogbox-Modus und den erweiterten Flags:Dialogbox-Modus:WertBedeutungLL_DLGBOXMODE_SAAStandard-Windows 3.x-StilLL_DLGBOXMODE_ALT1verschiedene Stile mit grauem Hintergrund... ...LL_DLGBOXMODE_ALT8 ...LL_DLGBOXMODE_ALT9Office 97 Button StyleLL_DLGBOXMODE_ALT10 Menü-Buttons werden nur farbig, wennMauscursor darübererweiterte Flags:WertLL_DLGBOXMODE_3DBUTTONSLL_DLGBOXMODE_TOOLTIPS98LL_DLGBOXMODE_NOBITMAPSBedeutungButton-Texte in 3D-StilTooltips im Win98 StyleButtons ohne Bitmaps273


Beschreibung der API-FunktionenHinweise:Beispiel:Siehe auch:Diese Funktion sollte direkt nach LlJobOpen[LCID]() aufgerufen werden.Die hier eingestellten Werte gelten nur für Ihre Applikation, so dass <strong>List</strong> & <strong>Label</strong> inverschiedenen Applikationen verschiedene Dialogbox-Modi benutzen kann.LlSetDlgboxMode(LL_DLGBOXMODE_ALT9 | LL_DLGBOXMODE_ TOOLTIPS98);// Setze "flat"-button Stil und Tooltips im Win98 StyleLlGetDlgboxMode, LlJobOpen, LlJobOpenLCIDLlSetFileExtensionsSyntax:INT LlSetFileExtensions(HLLJOB hJob, INT nObjType,LPCTSTR lpszProjectExt, LPCTSTR lpszPrintExt, LPCTSTR lpszSketchExt);Aufgabe:Einstellung von benutzerdefinierten Dateiendungen.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenObjType:WertLL_PROJECT_LABELLL_PROJECT_CARDLL_PROJECT_LISTBedeutungfür Etikettenfür Karteikartenfür <strong>List</strong>enlpszProjectExt: Extension für Project-File. Voreinstellung:WertLL_PROJECT_LABELLL_PROJECT_CARDLL_PROJECT_LISTVoreinstellung"lbl""crd""lst"lpszPrintExt: Extension für Druckerdefinitions-File. Voreinstellung:WertLL_PROJECT_LABELLL_PROJECT_CARDVoreinstellung"lbp""crp"274


GrundlagenWertLL_PROJECT_LISTVoreinstellung"lsp"lpszSketchExt: Extension für Dateidialog-Skizze. Voreinstellung:WertLL_PROJECT_LABELLL_PROJECT_CARDLL_PROJECT_LISTVoreinstellung"lbv""crv""lsv"Rückgabewert:FehlercodeHinweise:Die Extension kann nur 3 Zeichen lang sein. Es ist wichtig, dass alle 9 Dateierweiterungenverschieden sind!Bitte rufen sie diese Funktion vor LlDefineLayout() und vor den LlPrint...Start()-Funktionen auf, am besten also direkt nach LlJobOpen()/LlJobOpenLCID().Die Dateierweiterungen können auch über LlSetOptionString() gesetzt werden.Beispiel:HLLJOB hJob;INT v;hJob = LlJobOpen(0);v = LlSetFileExtensions(hJob, LL_PROJECT_LIST, "llx", "lly", "llz");// ....LlJobClose(hJob);LlSetNotificationCallbackSyntax:FARPROC LlSetNotificationCallback(HLLJOB hJob, FARPROC lpfnNotify);Aufgabe:Definition einer Prozedur, die bei Notifications aufgerufen werden soll.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlelpfnNotify: die Adresse einer Funktion (s.u.)Rückgabewert:Adresse der übergebenen Funktion (oder NULL, wenn Fehler)275


Beschreibung der API-FunktionenHinweise:Die Callback-Funktion hat höhere Priorität als die Callback-Nachricht; wenn siedefiniert ist, wird keine Nachricht gesendet, sondern die Callback-Funktion aufgerufen.Diese Funktion darf nur dann genutzt werden, wenn Callbacks direkt verwendetwerden, d.h. nicht bei OCX oder VCL, da dort die Callbacks auf Events abgebildetwerden.Die Callback-Funktion hat folgende Definition:LPARAM FAR PASCAL MyCallback(UINT nFunction, LPARAM lParam)und muss eine exportierte Funktion sein.Die Bedeutung der Parameter nFunction und lParam können Sie in dem Kapitelüber die Callback-Objekte nachlesen.Beispiel:LPARAM FAR PASCAL MyCallback(UINT nFunction, LPARAM lParam){ //…. }hJob hJob;unsigned int wMsg;hJob = LlJobOpen(0);v = LlSetNotificationCallback(hJob, MyCB);// ....LlJobClose(hJob);Siehe auch:LlSetNotificationCallbackExt, NotificationMessage, LlSetNotificationMessageLlSetNotificationCallbackExtSyntax:FARPROC LlSetNotificationCallbackExt(HLLJOB hJob, INT nEvent,FARPROC lpfnNotify);Aufgabe:Definition einer Prozedur, die bei Notifications des genannten Events aufgerufenwerden soll.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenEvent: Event-ID (LL_CMND_xxx oder LL_NTFY_xxxx)lpfnNotify: die Adresse einer Funktion (s.u.)Rückgabewert:Adresse der übergebenen Funktion (oder NULL, wenn Fehler)276


GrundlagenHinweise:Die "spezialisierte" Callback-Funktion hat höhere Priorität als die "generelle" Callback-Funktionoder eine Callback-Nachricht.<strong>List</strong> & <strong>Label</strong> sucht also erst mal, ob es für den Event, denen es auslösen möchteneinen über diese Funktion definierten "spezialisierten" Callback gibt. Wenn ja, wirddieser aufgerufen.Wenn nein, überprüft <strong>List</strong> & <strong>Label</strong>, ob ein über LlSetNotificationCallback definierter"unspezifischer" Callback definiert ist. Wenn ja, wird dieser aufgerufen.Wenn nein, überprüft <strong>List</strong> <strong>Label</strong>, ob eine Nachrichten-Nummer über LlSetNotificationMessagedefiniert ist. Wenn ja, wird diese Nachricht gesendet.Diese Funktion darf auch genutzt werden, wenn Callbacks direkt verwendet werden,d.h. bei OCX oder VCL. Nicht aber bei der .NET-Komponente, da diese dieseFunktion schon für sich verwendet.Die Callback-Funktion hat folgende Definition:LPARAM FAR PASCAL MyCallback(UINT nFunction, LPARAM lParam)und muss eine exportierte Funktion sein.Die Bedeutung der Parameter nFunction und lParam können Sie in dem Kapitelüber die Callback-Objekte nachlesen.Beispiel:LPARAM FAR PASCAL MyCallback(UINT nFunction, LPARAM lParam){ //....}hJob hJob;unsigned int wMsg;hJob = LlJobOpen(0);v = LlSetNotificationCallbackExt(hJob, LL_CMND_CHANGE_DCPROPERTIES_DOC,MyCB);// ....LlJobClose(hJob);Siehe auch:LlSetNotificationCallbackLlSetNotificationMessageSyntax:UINT LlSetNotificationMessage(HLLJOB hJob, UINT nMessage);277


Beschreibung der API-FunktionenAufgabe:Definition einer von der Voreinstellung abweichenden Nachrichtennummer fürCallback (USER-)-Objekte.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenMessage: die neue NachrichtennummerRückgabewert:FehlercodeHinweise:Die voreingestellte Nachrichtennummer hat den Wert der Funktion Register-WindowMessage("cmbtLLMessage");Höhere Priorität hat die Callback-Funktion; wenn diese definiert ist, wird keineNachricht gesendet.Die Bedeutung der Parameter der Nachricht können Sie in dem Kapitel über dieCallback-Objekte nachsehen.Diese Funktion darf nur dann genutzt werden, wenn Callbacks direkt verwendetwerden, d.h. nicht bei OCX, oder VCL, da dort die Callbacks auf Events abgebildetwerden.Beispiel:hJob hJob;unsigned int wMsg;LlSetDebug(TRUE);hJob = LlJobOpen(0);v = LlSetNotificationMessage(hJob,WM_USER+1);// ....LlJobClose(hJob);Siehe auch:LlGetNotificationMessage, LlSetNotificationCallback, LlSetNotificationCallbackExtLlSetOptionSyntax:INT LlSetOption(HLLJOB hJob, INT nMode, UINT32 nValue);Aufgabe:Setzt diverse Einstellungen in <strong>List</strong> & <strong>Label</strong>.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-Handle278


GrundlagennMode: Optionsindex:LL_OPTION_ADDVARSTOFIELDSTRUE: Der Formelassistent in Tabellenobjekten bietet die Variablen zusätzlich zuden Feldern an.FALSE: Variablen werden im Formelassistent nicht angeboten, nur die Felder(Voreinstellung).Diese Option macht nur im Tabellenmodus (LL_PROJECT_LIST) Sinn.LL_OPTION_ALLOW_LLX_EXPORTERSTRUE: Export-Module, die in der <strong>List</strong>e der zu ladenden Extension-DLLs (LL_-OPTIONSTR_LLXPATHLIST) gefunden werden, werden akzeptiertFALSE: Es werden keine Export-Module akzeptiertDiese Option muss vor dem Setzen der Option LL_OPTIONSTR_LLXPATHLIST eingestelltwerden.Voreinstellung: TRUELL_OPTION_AUTOMULTIPAGETRUE: <strong>List</strong> & <strong>Label</strong> führt seinen automatischen Seitenumbruch durch. Dazu müssenaber auch diverse Anpassungen gegenüber älteren Versionen durchgeführtwerden (siehe Anhang), (Voreinstellung).FALSE: Es ist kein Seitenumbruch innerhalb einer Tabellenzeile möglich.LL_OPTION_CALCSUMVARSONINVISIBLELINESHiermit geben Sie die Voreinstellung für die Option an, ob auch bei unterdrücktenDatenzeilen die Summenberechnung durchgeführt werden soll. Der eingestellteWert wird dann in der Projektdatei gespeichert.Voreinstellung: FALSELL_OPTION_CALC_SUMVARS_ON_PARTIAL_LINESTRUE: Die Summenvariablen werden aktualisiert, sobald eine Datenzeile angedrucktwurde.FALSE: Die Summenvariablen werden aktualisiert, sobald alle Datenzeilen komplettgedruckt werden konnten.Voreinstellung: FALSE279


Beschreibung der API-FunktionenLL_OPTION_CALLBACKMASKAls Wert ist eine beliebige Kombination folgender Werte möglich: LL_CB_PAGE,LL_CB_PROJECT, LL_CB_OBJECT, LL_CB_HELP, LL_CB_TABLELINE, LL_CB_-TABLEFIELDZur Bedeutung der Parameter lesen Sie bitte das Kapitel über Callbacks.LL_OPTION_CALLBACKPARAMETERAls Wert ist ein beliebiger 32 bit-Wert möglich, der den Callback-Funktionen direktübergeben wird. Voreinstellung ist 0.Zur Bedeutung des Parameters lesen Sie bitte das Kapitel über Callbacks.LL_OPTION_CODEPAGEHierüber setzen Sie die Codepage, die für sämtliche Konvertierungen vonSBCS/DBCS- und Unicode-Strings benutzt wird.Betroffen sind die "artfremden" API-Funktionen, also die W-Funktionen bei derSBCS/DBCS-DLL und die A-Funktionen der Unicode-DLL sowie das Lesen einer"artfremden" Projektdatei.Diese Einstellung ist global gültig, d.h für alle <strong>List</strong> & <strong>Label</strong>-Jobs innerhalb einerTask. Entsprechend wird der Wert in hJob auch ignoriert.Die Codepage muss auf dem System installiert sein (Stichwort NLS 8 ).Voreinstellung: CP_ACP.LL_OPTION_COMPRESSRTFWenn Sie einen festen Text in einem RTF-Control eingeben, wird der Text im Projektfileabgespeichert. Wenn diese Option auf TRUE gesetzt wird, wird der Text –wenn es sich lohnt – komprimiert.Eigentlich ist es nur für Debugging-Zwecke sinnvoll, diese Option auszuschalten.Voreinstellung: TRUELL_OPTION_COMPRESSSTORAGEZur Verwendung siehe LL_OPTION_STORAGESYSTEM.TRUE: Die Metafile-Preview-Dateien werden automatisch komprimiert.FALSE: keine Kompression (Voreinstellung). Diese Option hat normalerweise einenGeschwindigkeitsvorteil.8 NLS = "National Language Support"280


GrundlagenLL_OPTION_CONVERTCRLFTRUE: <strong>List</strong> & <strong>Label</strong> übersetzt CR-LF-Kominationen in Variablen- und Feldinhaltendurch LF (und verhindert somit doppelte Zeilenumbrüche).FALSE: Der Inhalt bleibt unverändert (Voreinstellung).LL_OPTION_DEBUGFLAGTRUE: Schaltet Debug-Modus ein (bzw. gibt den Zustand des Flags zurück)FALSE: Kein Debug-LoggingLL_OPTION_DEFDEFFONTMit dieser Option setzen Sie ein Font-Handle für die Schriftart, die als Voreinstellungfür die Projekt-Schriftart verwendet wird. Es wird eine Kopie des Fontsangelegt, das Handle muss also nicht mehr nach dem Aufruf gültig bleiben.Diese Schriftart kann auch über LL_OPTIONSTR_DEFDEFFONT gesetzt oder abgefragtwerden.Voreinstellung: GetStockObject(ANSI_VAR_FONT)LL_OPTION_DELAYTABLEHEADERDiese Option beschreibt, ob der Kopf einer Tabelle bei dem Aufruf von LlPrint(),oder erst bei dem ersten Drucken einer Datenzeile (LlPrintFields()) gedruckt werdensoll:TRUE: erst bei LlPrintFields().FALSE: schon bei LlPrint() (Voreinstellung). Falls Felder in der Kopfzeile verwendetwerden können, muss der Inhalt schon vor dem 1. LlPrint übergeben wordensein.LL_OPTION_ENABLE_STANDALONE_DATACOLLECTING_OBJECTSKompatibilitätsoption. Nach Einschalten der Option werden auch im MultitabellenmodusChart-Objekte und Kreuztabellen als Einzelobjekte angeboten. Dadurchsteigt im Designer die Gefahr der Fehlbedienung, wir empfehlen, die Option ausgeschaltetzu lassen – ältere Projekte, die Charts als Einzelobjekte nutzen, könnenauch dann weiterhin gedruckt und designed werden, es können lediglich keineneuen Objekte hinzugefügt werden.TRUE: auch im Multitabellenmodus stehen Charts und Kreuztabellen als Einzelobjektezur VerfügungFALSE: Charts und Kreuztabellen können im Multitabellenmodus nur innerhalbdes Berichtscontainers eingefügt werdenVoreinstellung: FALSE281


Beschreibung der API-FunktionenLL_OPTION_EMFRESOLUTIONUm Seiten im Preview darstellen zu können, die größer als 32.67 cm Kantenlängehaben (z.B. DIN A 3), muss man um eine Koordinaten-Einschränkung von Windows95/98 "herumarbeiten" und die Auflösung der EMF-Vorschaudateien "fälschen".Über diese Option stellt man die Auflösung (mm/Wert) der EMF-Dateien ein:0: <strong>List</strong> & <strong>Label</strong> berechnet den optimalen Wert (Voreinstellung)anderer Wert: Teiler von Millimeter, z.B. 100 = 1/100 mm AuflösungLL_OPTION_ ERR_ON_FILENOTFOUNDTRUE: Wenn eine Grafikdatei zur Druckzeit nicht gefunden wurde, wirdLL_ERR_DRAWINGNOTFOUND ausgelöst.FALSE: Der Fehler wird ignoriert und die Grafik ohne weitere Rückmeldung nichtausgegeben (Voreinstellung).LL_OPTION_ESC_CLOSES_PREVIEWDiese Option bestimmt, ob ein Druck auf die Escape-Taste das Vorschaufensterschliesst. Default: FALSE.LL_OPTION_EXPRSEPREPRESENTATIONCODEDiese Option bestimmt den Code des Zeichens, das verwendet wird, um in demmehrzeiligen Editfeld des Formelassistenten die Zeilen zu trennen.Dieser Wert muss u.U. für den Einsatz mit anderen Sprachen/ Zeichensätzen geändertwerden, da der Default-Code in DBCS-Zeichensystemen evtl. verwendetwird.LL_OPTION_EXTENDEDEVALUATIONTRUE: ein "gemischter" Formelmodus - er verbindet die Einfachheit des alten Modusmit den Vorteilen, Formeln verwenden zu können.FALSE: alter Modus. Dieser Modus ist nur noch aus Codekompatibilitätsgründenenthalten und wird nicht mehr unterstützt.Beachten Sie auch die Option LL_OPTION_NEWEXPRESSIONS! LL_OPTION_EXTENDEDEVALUATION auf FALSE setzt auch automatisch LL_OPTION_NEW-EXPRESSIONS auf FALSE, da diese Option nicht mehr unterstützt wird, rufen Siediese Option nicht mit FALSE auf.LL_OPTION_FONTQUALITY(Siehe auch LL_OPTION_FONTPRECISION)282


GrundlagenÜber diese Option kann man den Windows-Fontmapper beeinflussen, um dieWahrscheinlichkeit, dass z.B. eine Druckerschriftart gewählt wird, zu erhöhen.Der hier angegebene Wert wird für das LOGFONT.lfQuality-Feld verwendet, umSchriftart-Instanzen zu erzeugen.Eine Dokumentation der verfügbaren Werte finden Sie in der MSDN. Nicht alleDruckertreiber unterstützen diese Option korrekt, hier müssen Sie im Zweifelsfallbei Ihrem Hersteller nachfragen.Voreinstellung: DEFAULT_QUALITY.LL_OPTION_FONTPRECISION(Siehe auch LL_OPTION_FONTQUALITY)Über diese Option kann man den Windows-Fontmapper beeinflussen, um dieWahrscheinlichkeit, dass z.B. eine Druckerschriftart gewählt wird, zu erhöhen.Der hier angegebene Wert wird für das LOGFONT.lfOutPrecision-Feld verwendet,um Schriftart-Instanzen zu erzeugen.Eine Dokumentation der verfügbaren Werte finden Sie in der MSDN. Nicht alleDruckertreiber unterstützen diese Option korrekt, hier müssen Sie im Zweifelsfallbei Ihrem Hersteller nachfragen.Voreinstellung: OUT_STRING_PRECIS.LL_OPTION_FORCEFONTCHARSETWählt aus, ob man alle auf dem System verfügbaren Fonts angezeigt bekommt(siehe auch LL_OPTION_SCALABLEFONTSONLY), oder nur die, die Zeichen in dereingestellten LCID (siehe LL_OPTION_LCID) anbieten.Voreinstellung: FALSELL_OPTION_HELPAVAILABLETRUE: Hilfe-Buttons anzeigen (Voreinstellung)FALSE: Hilfe-Buttons unterdrückenLL_OPTION_IMMEDIATELASTPAGENormalerweise wird das LastPage()-Flag erst gesetzt, wenn alle Objekte (bis zueiner Tabelle, wenn Tabellendruck) gedruckt wurden. Hier kann mit TRUE forciertwerden, dass, wenn ein Objekt einen Seitenumbruch braucht, sofort LastPage()auf FALSE gesetzt und alle angehängten Objekte dieses Objekts neu berechnetwerden.Voreinstellung: FALSE283


Beschreibung der API-FunktionenLL_OPTION_INCREMENTAL_PREVIEWTRUE: die Vorschau wird sofort nach Erzeugung der ersten Seite angezeigt undweitere Seiten nach und nach der Anzeige hinzugefügt. Wenn der Anwender dasVorschaufenster während des Druckes schließt, erhalten SieLL_ERR_USER_ABORTED von den Druckfunktionen zurück. Dieser Fehlercodemuss also in jedem Falle verarbeitet werden. Wird zum Abschluß des DrucksLlPreviewDisplay() aufgerufen, so kehrt diese API erst dann zurück, wenn derAnwender das Vorschaufenster schließt.FALSE: die Vorschau wird nicht sofort angezeigt, die Anwendung muss explizitLlPreviewDisplay() zur Anzeige aufrufen.Voreinstellung: TRUELL_OPTION_INTERCHARSPACINGTRUE: Wenn Text im Blocksatz dargestellt werden soll, wird der leere Raum nichtnur auf die Leerzeichen, sondern auch zwischen den Zeichen verteilt.FALSE: hier wird der Leerraum nur auf die Leerzeichen verteilt (Voreinstellung)LL_OPTION_INCLUDEFONTDESCENTTRUE: für die Berechnung von Zeilenabständen wird auch der zum Font gehörendeParameter LOGFONT.lfDescent verwendet. Dies führt zu etwas vergrößertenZeilenabständen, verhindert jedoch das Abschneiden von extremen Unterlängen(Voreinstellung ab Version 13).FALSE: kompatibler ModusLL_OPTION_LCIDÜber diese Option setzen Sie die Voreinstellungen für die locale-abhängigen Einträge(Einheit metrisch/Inch, Dezimalpunkt, Tausendertrennzeichen und Währungssymbol)und für Schriften (siehe LL_OPTION_FORCEFONTCHARSET).Außerdem ist dies die Default-Locale für die Formelfunktionen Loc...$() und Date$().Voreinstellung: LOCALE_USER_DEFAULT.LL_OPTION_LOCKNEXTCHARREPRESENTATIONCODEDiese Option bestimmt den Code des "Umbruch-Sperrung"-Zeichens.Dieser Wert muss u.U. für den Einsatz mit anderen Sprachen/ Zeichensätzen geändertwerden, da der Default-Code in DBCS-Zeichensystemen evtl. verwendetwird. Anstelledessen können Sie meist auch Code 160 (NO BREAK SPACE) verwenden.284


GrundlagenLL_OPTION_MAXRTFVERSIONUnter Windows gibt es z.Z. 5 verschiedene RTF-Control Versionen (Versionsnummer1, 2, 3, 4 und 4.1). Diese unterscheiden sich in dem Umfang der Möglichkeitenwie auch in der Art der Hintergrundzeichnung.Sie können über diese Option angeben, welches RTF-Control maximal von <strong>List</strong> &<strong>Label</strong> verwendet werden soll. So bewirkt ein Setzen der Option auf 0x100, dassimmer das Control Version 1 verwendet wird, ein Setzen auf 0x401 verwendet aufaktuellen Systemen (z.B. ab Windows XP, SP1) das Control in Version 4.1.Wenn Sie diese Option mit 0 aufrufen, verhinderten dies, dass das RTF Controlgeladen wird. Dazu müssen sie als Job Handle -1 übergeben, noch bevor der ersteJob geöffnet wird. Vorteil davon ist, dass <strong>List</strong> & <strong>Label</strong> ein bisschen schnellerstartet und weniger Ressourcen verbraucht werden.LL_OPTION_METRICTRUE: Metrisches System wird eingestellt.FALSE:Inch-System wird eingestellt.Voreinstellung: Windowseinstellung. Siehe auch LL_OPTION_UNITS.LL_OPTION_MULTIPLETABLELINESTRUE: Tabellen können mehrere Zeilendefinitionen, bzw. Zeilenlayouts enthalten,die getrennt ein- und ausschaltbar sind (Voreinstellung). Darüber lassen sich bequemUnterberichte erstellen, indem von der Applikation zwischen unterschiedlichenDetailzeilen umgeschaltet wird.FALSE: Tabellenzeilen bestehen nur aus einer Zeilendefinition.LL_OPTION_NEWEXPRESSIONSFALSE: alter Ausdruck-Modus. Dieser Modus wird nicht mehr unterstützt.TRUE: neuer Ausdruck-Modus (Neu: Voreinstellung)Wenn der neue Ausdruckmodus gewählt ist, werden die Dateien in diesen übersetzt,wenn sie im alten Modus erstellt oder gespeichert wurden. Wenn dann beiLlDefineLayout() das LL_EXPRCONVERTQUIET-Flag nicht gesetzt ist, wird der Benutzerdarauf hingewiesen, dass die Datei konvertiert wird.Beachten Sie auch die Option LL_OPTION_EXTENDEDEVALUATION! LL_OPTION_-NEWEXPRESSIONS auf FALSE setzt auch automatisch LL_OPTION_EXTENDED-EVALUATION auf FALSE.LL_OPTION_NOFAXVARSFALSE: Die Variablen für den Faxversand sind im Designer sichtbar (Voreinstellung).285


Beschreibung der API-FunktionenTRUE: Die Variablen für den Faxversand sind im Designer nicht sichtbar.LL_OPTION_NOFILEVERSIONUPGRADEWARNINGDiese Option bestimmt das Verhalten des Designers beim Öffnen und Konvertierenvon Dateien aus älteren Versionen.TRUE: Die Konvertierung erfolgt still im Hintergrund, der Benutzer bemerkt nichtsvom Vorgang.FALSE: Es wird eine Warnmeldung angezeigt, dass das Projekt anschliessendnicht mehr mit der älteren Version bearbeitet werden kann (Voreinstellung).LL_OPTION_NOFOOTERPAGEWRAPStellt ein, ob die letzte Fußzeile, wenn sie umgebrochen werden müsste, auf alleFälle auf einer neuen Seite beginnt (und eine nicht-final Fußzeile auf der momentanenSeite ausgegeben wird).Voreinstellung: FALSELL_OPTION_NOMAILVARSFALSE: Die Variablen für den eMailversand sind im Designer sichtbar (Voreinstellung).TRUE: Die Variablen für den eMailversand sind im Designer nicht sichtbar.LL_OPTION_NONOTABLECHECKTRUE: <strong>List</strong> & <strong>Label</strong> testet bei einem <strong>List</strong>enprojekt nicht, ob mindestens eine Tabellevorhanden istFALSE: Der Check wird beim Laden eines Projekts durchgeführt und ggf. LL_-ERR_NO_TABLEOBJECT zurückgegeben (Voreinstellung).LL_OPTION_NOPARAMETERCHECKTRUE: <strong>List</strong> & <strong>Label</strong> unterdrückt seinen internen Parametercheck bei den Übergabeparameternder API-Funktionen, so dass eine höhere Verarbeitungsgeschwindigkeiterreicht wird.FALSE: Die Funktions-Parameter werden überprüft (Voreinstellung).LL_OPTION_NOTIFICATIONMESSAGEHWNDHier geben Sie das Fenster explizit an, an das <strong>List</strong> & <strong>Label</strong> seine Callbacks sendet(falls Sie nicht die Callback-Prozedur verwendet haben).Normalerweise werden Events an das in der Fensterhierarchie nächste Nicht-Child-Fenster von dem bei LlDefineLayout() oder LlPrintWithBoxStart() übergebenenFenster gesendet, hier können Sie explizit ein Zielfenster angeben.286Voreinstellung: NULL


GrundlagenLL_OPTION_OFNDIALOG_EXPLORERTRUE: Die Dateiauswahl-Dialoge erscheinen im "Explorer"-Stil (bei Win95/98 undNT 4.x Voreinstellung)FALSE: es werden die "alten" Dialoge von Windows 3.x verwendet (bei NT 3.xVoreinstellung)LL_OPTION_OFNDIALOG_NOPLACESBARTRUE: unterdrückt die Darstellungen des "Placement"-Bereichs in den Datei-Dialogen ab Windows 2000.FALSE: Ab Windows 2000 wird der volle Dateidialog angezeigt. (Voreinstellung)LL_OPTION_ONLYONETABLE:TRUE: nur ein Tabellenobjekt zugelassen, es kann kein zweites Tabellenobjekteingefügt werden.FALSE: beliebig viele <strong>List</strong>enobjekte können eingefügt werden (Voreinstellung).Wenn dies vom Code her nicht unterstützt wird, sollte diese Option auf TRUE gesetztwerden.LL_OPTION_PHANTOMSPACEREPRESENTATIONCODEDiese Option bestimmt den Code des "Phantom Space"-Zeichens.Dieser Wert muss u.U. für den Einsatz mit anderen Sprachen/ Zeichensätzen geändertwerden, da der Default-Code in DBCS-Zeichensystemen evtl. verwendetwird.LL_OPTION_PROJECTBACKUPTRUE: beim Bearbeiten eines Projektes im Designer wird eine Sicherungskopieangelegt (Voreinstellung).FALSE: eine Sicherungskopie wird nicht angelegt.LL_OPTION_PRVZOOM_LEFT, LL_OPTION_PRVZOOM_TOP, LL_-OPTION_PRVZOOM_WIDTH, LL_OPTION_PRVZOOM_HEIGHTDie anfängliche Größe des Echtdatenpreview-Fensters in Prozent der Bildschirmfläche.Initiell werden die Positionen genommen, die das Fenster beim letztenBeenden hatte.LL_OPTION_PRVRECT_LEFT, LL_OPTION_PRVRECT_TOP, LL_OPTION_PRV-RECT_WIDTH, LL_OPTION_PRVRECT_HEIGHTDasselbe in Bildschirmkoordinaten.287


Beschreibung der API-Funktionen288LL_OPTION_PRVZOOM_PERCDer initielle Echtdatenpreview-Zoomfaktor in Prozent (Voreinstellung: 100)LL_OPTION_REALTIMETRUE: Die Time() und Now()-Funktionen berechnen immer wieder die Zeit neu.FALSE: Die Zeit wird beim Laden des Projekts genommen und immer wiederverwendet (Voreinstellung).LL_OPTION_RESOLUTIONCOMPATIBLETO9XTRUE: Barcodes werden in <strong>List</strong> & <strong>Label</strong> mit einer höheren Präzision gedruckt alsandere Objekte. Dies kann zu Darstellungs-Problemen von Barcodes unter Windows95/98/ME führen, wenn auf diesen Systemen eine unter WindowsNT/2000/2003/XP/Vista erstellte Vorschaudatei angezeigt wird. Durch diese Optionwird die maximale Auflösung so verringert, dass diese Betriebssysteme dieBarcodes noch darstellen können.FALSE: kompatibler Modus (Voreinstellung)LL_OPTION_RETREPRESENTATIONCODEWert des neuen Zeichens, das einen Zeilenumbruch repräsentiert (Voreinstellung:'').Dieser Wert muss u.U. für den Einsatz mit anderen Sprachen/ Zeichensätzen geändertwerden, da der Default-Code in DBCS-Zeichensystemen evtl. verwendetwird.LL_OPTION_SCALABLEFONTSONLYSollen in den Schriftartdialogen alle (FALSE) oder nur die Vektorschriften (TRUE)auswählbar sein?Rasterschriften haben den Nachteil, nicht gut skalierbar zu sein und daher in derVorschau seltsame Ausgaben zu produzieren.Voreinstellung: TRUELL_OPTION_SETCREATIONINFOTRUE: <strong>List</strong> & <strong>Label</strong> speichert diverse Benutzerdaten (User- und Rechnername sowieDatum/Uhrzeit für Erstellung und letzte Veränderung) in das Projekt und in eineVorschaudatei. Dies kann für Fehlersuche interessant sein (Voreinstellung)FALSE: keine SpeicherungLL_OPTION_SHOWPREDEFVARSTRUE: Die von <strong>List</strong> & <strong>Label</strong> vordefinierten Variablen werden im Formelassistentenangeboten (Voreinstellung).


GrundlagenFALSE: Die von <strong>List</strong> & <strong>Label</strong> vordefinierten Variablen werden im Formelassistentennicht angeboten.LL_OPTION_SKETCH_COLORDEPTHÜber diese Option kann man festlegen, mit welcher Farbtiefe (Bits) die Sketch-Dateien für die Dateidialoge erzeugt bzw. gespeichert werden. Voreinstellung ist8, also 256 Farben. 32 wäre beispielsweise True-Color.LL_OPTION_SKIPRETURNATENDOFRTFAm Ende von RTF-Texten können Zeilenumbrüche stehen.TRUE: Sie werden entfernt (verhindert doppelten Abstand am Ende des RTF)FALSE: beläßt die Daten so, wie sie übergeben werdenLL_OPTION_SORTVARIABLESTRUE: Die Variablen und Felder werden in den Auswahldialogen alphabetisch sortiert.FALSE: Die Variablen und Felder werden in den Auswahldialogen nicht sortiert(Voreinstellung), d.h. die Anmeldereihenfolge ist entscheidend.LL_OPTION_SPACEOPTIMIZATIONTRUE: Die "Leerzeichenoptimierung" ist bei neuen Abschnitten in Textobjektenoder bei neuen Tabellenspalten eingeschaltet (Voreinstellung)FALSE: Sie ist ausgeschaltet.Dies gilt nicht für vorhandene Objekte!LL_OPTION_STORAGESYSTEM<strong>List</strong> & <strong>Label</strong> hat in älteren Versionen die Preview-Daten in mehreren Dateien gespeichert(Verwaltungsinformation in .000, die Druckerdefinition in und die Metafiles in .. Seit Version 5.0unterstützt <strong>List</strong> & <strong>Label</strong> auch den Previewdruck in eine einzige Datei. Vorteile:• einfache Verschickbarkeit (Inter-/Intranet)• Die Daten können automatisch komprimiert werden (siehe LL_OPTION_-COMPRESSSTORAGE)• weniger Platzverbrauch auf der Festplatte• geringeres Risiko von Problemen der Namensgleichheit bei ProjektenMögliche Optionen:LL_STG_COMPAT4: <strong>List</strong> & <strong>Label</strong> verwendet die alte Methode, um die Daten fürden Preview zu speichern. Sollte nicht mehr verwendet werden.289


Beschreibung der API-FunktionenLL_STG_STORAGE: Die Preview-Daten werden in einem einzigen File verwaltet(Voreinstellung).Lesen Sie bitte auch das Kapitel Verwaltung der Preview-Dateien.LL_OPTION_SUPERVISORTRUE: es sind alle Menü-Optionen erlaubt, und auch gesperrte Objekte sind nichtgesperrt. Dieser Modus erlaubt es, ohne große zusätzliche Programmierung diedem "normalen" Benutzer unzugänglichen Teile zu benutzen.FALSE: Eventuelle Einschränkungen sind wirksam. (Voreinstellung)LL_OPTION_SUPPORTPAGEBREAKTRUE: Die "Seitenumbruch"-Checkbox bei Textobjekten wird angezeigt und kannvom Benutzer eingestellt werden.FALSE: Die "Seitenumbruch"-Checkbox ist versteckt (Voreinstellung).LL_OPTION_SUPPORTS_PRNOPTSTR_EXPORTTRUE: Der Benutzer kann im Designer ein Druckziel als "voreingestelltes Ausgabemedium" wählen, der dann im Druckoptionendialog voreingestellt ist.FALSE: Normalerweise setzt die Applikation das voreingestellte Ausgabemedium.Das voreingestellte Ausgabemedium wird im Projekt-File gespeichert.Voreinstellung: FALSELL_OPTION_TABLE_COLORING:LL_COLORING_LL: das Kolorieren von <strong>List</strong>enobjekten wird nur von <strong>List</strong> & <strong>Label</strong>durchgeführt. (Voreinstellung)LL_COLORING_PROGRAM: das Kolorieren von <strong>List</strong>enobjekten wird nur über Notificationsoder Callback durchgeführt (s. Kapitel "Notifications und Callbacks"),Farbeinstellung im Designer ist nicht möglichLL_COLORING_DONTCARE: das Kolorieren wird erst vom Programm über Notificationoder Callback durchgeführt, dann aber bei Bedarf noch von <strong>List</strong> & <strong>Label</strong>.LL_OPTION_TABREPRESENTATIONCODEZeichencode für das Zeichen, das den Tabulator repräsentiert.Dieser Wert muss u.U. für den Einsatz mit anderen Sprachen/ Zeichensätzen geändertwerden, da der Default-Code in DBCS-Zeichensystemen evtl. verwendetwird.290


GrundlagenLL_OPTION_TABSTOPS:LL_TABS_DELETE: Tabulatoren (Zeichen-Code 0x09!) im Text von Textobjektenwerden durch Leerzeichen ersetzt (Voreinstellung)LL_TABS_EXPAND: Tabulatoren im Text werden wie üblich erweitert auf 8-Zeichen-Bündigkeit. Bei Proportionalschriften macht nur ein Tabulator am ZeilenanfangSinn.LL_OPTION_UISTYLEÜber diese Option kann das Look & Feel des Designers gesteuert werden.LL_OPTION_UISTYLE_STANDARD: Office 97® Look & FeelLL_OPTION_UISTYLE_OFFICEXP: Office XP®/Visual Studio .NET® Look & FeelLL_OPTION_UISTYLE_OFFICE2003: Office 2003® Look & FeelLL_OPTION_UNITSLL_UNITS_MM_DIV_10: Metrisches System wird eingestellt.LL_UNITS_INCH_DIV_100: Inch-System wird eingestellt mit einer Auflösung von1/100 inchLL_UNITS_INCH_DIV_1000: Inch-System wird eingestellt mit einer Auflösung von1/1000 inch.Voreinstellung: Einstellung in der Windows-Systemsteuerung, im Inch-Systemwird LL_UNITS_INCH_DIV_1000 benutzt.LL_OPTION_USEBARCODESIZESTRUE: Manche Barcodes haben Standardgrößen oder einen Standardgrößenbereich.Wenn diese Option enabled ist (TRUE), kann der Benutzer im Barcodeobjektdie Einschränkung auf die Standardgrößen einschalten und über die Mausdann keine falschen Größen mehr einstellen.FALSE: Es können alle Größen eingestellt werden (Voreinstellung).LL_OPTION_USECHARTFIELDSTRUE: nach Einschalten dieser Option müssen Charts von der Anwendung herüber die Chart-APIs versorgt werden.FALSE: kompatibler Modus, Charts werden über die Funktion LlPrintFields mitDaten versorgt. (Voreinstellung)Bitte lesen Sie hierzu auch das entsprechende Kapitel in diesem Handbuch.291


Beschreibung der API-FunktionenLL_OPTION_USEHOSTPRINTERTRUE: <strong>List</strong> & <strong>Label</strong> schiebt die Verwaltung des Druckers auf das Anwenderprogrammab (was dann mehr Freiheiten hat, Druckoptionen von sich aus einzustellen,aber auch mehr Pflichten - siehe Callback-Abschnitt in diesem Handbuch)FALSE: <strong>List</strong> & <strong>Label</strong> verwaltet den Drucker (Voreinstellung).LL_OPTION_VARSCASESENSITIVETRUE: Die Variablen- und Feldnamen sind großschreibungssensitiv (Voreinstellung)FALSE: die Groß- oder Kleinschreibung wird ignoriert: "Name" ist gleichwertig mit"NAME".LL_OPTION_XLATVARNAMESTRUE: Sonderzeichen in Variablen- und Feldbezeichnern werden zu einem '_' umgewandelt(Voreinstellung).FALSE: Variablen- und Feldbezeichner werden nicht modifiziert. Dies bedeutet - jenach Zahl der Variablen und Felder - eine nicht unerhebliche Geschwindigkeitssteigerung.nValue: neuer WertRückgabewert:FehlercodeHinweise:Bitte rufen Sie diese Funktion vor LlDefineLayout() und vor den LlPrint...-Start()-Funktionen auf, am besten also direkt nach LlJobOpen()/LlJobOpenLCID().Beispiel:HLLJOB hJob;BOOL b;hJob = LlJobOpen(0);LlSetOption(hJob, LL_OPTION_NEWEXPRESSIONS, TRUE);LlSetOption(hJob, LL_OPTION_STORAGESYSTEM, LL_STG_STORAGE);// ....LlJobClose(hJob);Siehe auch:LlGetOption292


GrundlagenLlSetOptionStringSyntax:INT LlSetOptionString(HLLJOB hJob, INT nMode, LPCTSTR pszValue);Aufgabe:Parameter:Setzt diverse Einstellungen in <strong>List</strong> & <strong>Label</strong>.hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenMode: Folgende Werte sind als Funktionsindex möglich:LL_OPTIONSTR_CARD_PRJEXTDie Dateinamenerweiterung ("Extension") eines Karteikartenprojekts. Voreinstellung:"crd".LL_OPTIONSTR_CARD_PRVEXTDie Dateinamenerweiterung ("Extension") der Bitmap eines Karteikartenprojekts,die im Datei-Lade-Dialog angezeigt wird. Voreinstellung: "crv".LL_OPTIONSTR_CARD_PRNEXTDie Dateinamenerweiterung ("Extension") der Druckereinstellungen eines Karteikartenprojekts.Voreinstellung: "crp".LL_OPTIONSTR_CURRENCYDie Zeichenkette, die als Währungssymbol ("DM", "$", ...) zur Formatierung vonWährungen bei der FStr$()-Funktion verwendet wird.Wird automatisch auf die Benutzer-Einstellungen eingestellt bzw. auf die entsprechendlokalisierte Zeichenkette, wenn LL_OPTION_LCID eingestellt wird.LL_OPTIONSTR_DECIMALDie Zeichenkette, die als Dezimalzeichen bei der FStr$()-Funktion verwendet wird.Wird automatisch auf die Benutzer-Einstellungen eingestellt bzw. auf die entsprechendlokalisierte Zeichenkette, wenn LL_OPTION_LCID eingestellt wird.LL_OPTIONSTR_DEFDEFFONTDiese Option beschreibt die Schriftart, die als Voreinstellung für die Projekt-Schriftart verwendet wird.Die Zeichenkette muss das Format haben:293


Beschreibung der API-Funktionen294"{(R,G,B),H, L}"R = Rotanteil der Farbe, G = Grünanteil der Farbe, B = Blauanteil der Farbe, H =Höhe der Schriftart in Punkten, L = kommaseparierte Felder der LOGFONT-Struktur(siehe SDK)Diese Schriftart kann auch über LL_OPTION_DEFDEFFONT gesetzt oder abgefragtwerden.LL_OPTIONSTR_EXPORTS_ALLOWEDÜber diese Funktion können Sie die möglichen Ausgabemedien beschränken, dieder Benutzer bei LlPrintOptionsDialog() oder LlPrintOptionsDialogTitle() angezeigtbekommt. Im Designer stehen nur die hier erlaubten Exportfotmate unter Projekt> Seitenlayout > Ausgabemedien zur Verfügung.Übergeben Sie hier auch eine semikolonseparierte <strong>List</strong>e mit Kürzeln der Ausgabemedien,siehe LL_OPTIONSTR_EXPORTS_AVAILABLELL_OPTIONSTR_EXPORTS_ALLOWED_IN_PREVIEWÜber diese Funktion können Sie die möglichen Ausgabe-Medien beschränken,die der Benutzer im Vorschaufenster angezeigt bekommt. Übergeben Sie hierauch eine semikolonseparierte <strong>List</strong>e mit Kürzeln der Ausgabemedien, siehe LL_-OPTIONSTR_EXPORTS_AVAILABLELL_OPTIONSTR_EXPORTS_AVAILABLEÜber diese Funktion können Sie die möglichen Ausgabe-Medien abfragen (readonly)Der Rückgabewert ist eine Zeichenkette, die aus den Kürzeln aller verfügbarenAusgabe-Medien besteht, z.B.:"PRN;PRV;FILE;HTML;RTF"Folgende Kürzel sind fest definiert:WertBedeutungPRNAusgabe direkt auf DruckerPRVPreview-(Datei-)DruckFILEDrucker-Ausgabe auf DateiDie weiteren Einträge hängen von der über LlSetOptionString( LL_OPTIONSTR_-LLXPATHLIST) gefundenen <strong>List</strong>e von Exportmodulen ab.Beispiel:LlPrintStart(hJob,..., LL_PRINT_USERSELECT,...);// allow only printer and preview (USERSELECT sets all bits)LlSetOption(hJob, LL_OPTIONSTR_EXPORTS_ALLOWED, "PRN;PRV");// Default should be preview!LlPrintSetOptionString(hJob, LL_PRNOPTSTR_EXPORT, "PRV");


Grundlagen// printer dialog allows user to changeLlPrintOptionsDialog(hJob,....);// get the final medium:LlPrintGetOptionString(hJob, LL_PRNOPTSTR_-EXPORT,sMedium,sizeof(sMedium));// ...print job....// finishedLlPrintEnd(hJob,0);if (strcmp(sMedium, "PRV") == 0) ...LL_OPTIONSTR_EXPORTFILELISTDies ist ein nur-Lese-Wert.Über diese Funktion können Sie nach dem Druck abfragen, in welche Dateienausgegeben wurde. Die Dateinamen sind semikolon-separiert.Insbesondere bei den Exportmodulen gilt: reservieren Sie genug Platz, oder vergrößernSie den Puffer solange, bis Sie von LlGetOptionString() keine Fehlermeldungmehr bekommen (LL_ERR_BUFFERTOOSMALL).Die <strong>List</strong>e ist erst nach LlPrintEnd() verfügbar.LL_OPTIONSTR_HELPFILENAMEÜber diese Funktion können Sie den Namen der Hilfedatei vorgeben, wenn Siez.B. Ihre eigene Hilfedatei angezeigt bekommen möchten.LL_OPTIONSTR_FAX_RECIPNAME,LL_OPTIONSTR_FAX_RECIPNUMBER,LL_OPTIONSTR_FAX_SENDERNAME,LL_OPTIONSTR_FAX_SENDERCOMPANY ,LL_OPTIONSTR_FAX_SENDERDEPT,LL_OPTIONSTR_FAX_SENDERBILLINGCODEMit diesen Optionen können Default-Werte für die Einstellungen im Faxdialog(Projekt > Fax-Variablen) vorgenommen werden. Wenn der Benutzer im Designerandere Formeln für die Einstellungen wählt bzw. im Projekt andere Einstellungengespeichert wurden, so haben diese Vorrang. Wenn das Projekt auf dasFax-Exportmodul ausgedruckt wird, werden die hier bzw. im Projekt gewähltenEinstellungen ausgewertet und das Projekt direkt als Fax verschickt. Alternativbieten viele Faxprogramme die Möglichkeit, die Faxnummer in besonderer Formatierungzu übergeben. Details hierzu müssen Sie bei Ihrem Faxtreiber-Hersteller erfragen.Wenn die Optionen nicht gesetzt werden und der Benutzer im Projekt keine Einstellungengewählt hat, steht das Fax Export-Modul nicht zur Verfügung.295


Beschreibung der API-FunktionenLL_OPTIONSTR_LABEL_PRJDESCR, LL_OPTIONSTR_CARD_PRJDESCR, LL_-OPTIONSTR_LIST_PRJDESCRMit diesem Parameter können Sie die Beschreibung des entsprechenden Projekttypenbestimmen. Diese Beschreibungen erscheint in der Dateityp- Comboboxder Laden- und Speichern-Dialoge.LL_OPTIONSTR_LABEL_PRJEXTDie Dateinamenerweiterung ("Extension") eines Etikettenprojekts. Voreinstellung:"lbl".LL_OPTIONSTR_LABEL_PRVEXTDie Dateinamenerweiterung ("Extension") der Bitmap eines Etikettenprojekts, dieim Datei-Lade-Dialog angezeigt wird. Voreinstellung: "lbv".LL_OPTIONSTR_LABEL_PRNEXTDie Dateinamenerweiterung ("Extension") der Druckereinstellungen eines Etikettenprojekts.Voreinstellung: "lbp".LL_OPTIONSTR_LICENSINGINFOMit dieser Option wird der persönliche Lizensierungsschlüssel übergeben, derauch den Lizenzumfang bestimmt.Diese Option muss unbedingt gesetzt werden, bevor ein Projekt distributiertwird. Weitere Informationen finden sich in der Datei "perslic.txt" sowie "redist.txt"im <strong>List</strong> & <strong>Label</strong>-Installationsverzeichnis. In der Trialversion ist das Setzen dieserOption nicht notwendig.LL_OPTIONSTR_LIST_PRJEXTDie Dateinamenerweiterung ("Extension") eines <strong>List</strong>enprojekts. Voreinstellung:"lst".LL_OPTIONSTR_LIST_PRVEXTDie Dateinamenerweiterung ("Extension") der Bitmap eines <strong>List</strong>enprojekts, die imDatei-Lade-Dialog angezeigt wird. Voreinstellung: "lsv".LL_OPTIONSTR_LIST_PRNEXTDie Dateinamenerweiterung ("Extension") der Druckereinstellungen eines <strong>List</strong>enprojekts.Voreinstellung: "lsp".LL_OPTIONSTR_LLFILEDESCR296hierüber wird die Beschreibung für die <strong>List</strong> & <strong>Label</strong> Preview-Dateien übergeben,die in der Dateityp-Combobox des Speichern-Dialogs im Preview angezeigt wird.


GrundlagenLL_OPTIONSTR_LLXPATHLISTDiese Option bestimmt die zu ladenden externen LLX-Module. Übergeben Siehier eine semikolonseparierte <strong>List</strong>e mit den Pfadnamen der Export-Module, dieSie in Ihrer Applikation eingebunden haben möchten.Als Voreinstellung, also beim Öffnen eines Jobs bzw. bei jedem Aufruf dieser Option,werden folgende Erweiterungen automatisch geladen:CMLL13PW.LLXCMLL13HT.LLXCMLL13EX.LLXCMLL13OC.LLXsowie in der Professional-Edition zusätzlichCMLL13BC.LLXAls Pfad dieser Dateien wird der Pfad der <strong>List</strong> & <strong>Label</strong>-DLL verwendet.Sie können Wildcards als Dateimasken verwenden, um mehrere Module auf einmalzu laden.Um eine Erweiterung zu unterdrücken, geben Sie den Dateinamen mit einem vorangestelltenDach-Symbol an, also "^CMLL13PW.LLX". Um alle voreingestelltenErweiterungen zu unterdrücken, geben Sie "^*" als ersten 'LLX-Namen' an, bespielsweiseum einen anderen Pfad zu verwenden.Bei der Abfrage über LlGetOptionString() wird eine semikolonseparierte <strong>List</strong>e dergeladenen Module zurückgegeben.Bei eingeschaltetem Debug-Modus gibt <strong>List</strong> & <strong>Label</strong> aus, welche Module aufGrund welcher Regeln geladen oder entladen werden.LL_OPTIONSTR_MAILTOHier kann eine Adresse übergeben werden, die als voreingestellter Empfänger beidem Senden aus der Vorschau in die eMail eingetragen wird. Mehrere Adressenkönnen semikolonsepariert übergeben werden.LL_OPTIONSTR_MAILTO_CCHier kann eine Adresse übergeben werden, die als voreingestellter Empfänger beidem Senden aus der Vorschau in die eMail als CC (Carbon Copy) eingetragenwird. Mehrere Adressen können semikolonsepariert übergeben werden.LL_OPTIONSTR_MAILTO_BCCHier kann eine Adresse übergeben werden, die als voreingestellter Empfänger beidem Senden aus der Vorschau in die eMail als BCC (Blind Carbon Copy) eingetragenwird. Mehrere Adressen können semikolonsepariert übergeben werden.297


Beschreibung der API-FunktionenLL_OPTIONSTR_MAILTO_SUBJECTHier kann ein Text übergeben werden, der bei dem Senden aus der Vorschau indie eMail als Betreff eingetragen wird.LL_OPTIONSTR_NULLVALUEHier kann ein Text übergeben werden, der im Druck als Darstellung eines NULL-Wertes ausgegeben wird. Voreistellung: Leer ("").LL_OPTIONSTR_PREVIEWFILENAMEÜber diese Option kann der Name vorgegeben werden, der für die Erstellung vonPreviewdateien verwendet wird. Per Voreinstellung werden die Dateien im Verzeichnisdes Projektes bzw. in einem alternativen Verzeichnis (s. LlPreviewSet-TempPath()) mit dem Namen .LL angelegt. Mit dieser Optionkann ein anderer Dateiname gewählt werden, der dann ersetzt.LL_OPTIONSTR_PRINTERALIASLISTÜber diese Option kann eine Übersetzungstabelle für Drucker übergeben werden.Um die Tabelle zu löschen, übergibt man NULL oder einen Leerstring.Danach übergibt man für jeden Quelldrucker eine Übersetzungstabelle mit altemund einem oder mehreren neuen Druckern. Entweder geschieht das durch mehrereAufrufe dieser Funktion hintereinander, oder man trennt die verschiedenenTabellen mit '\n'.Die Form einer Tabelle selbst ist:"alter Drucker=neuer Drucker1[;neuer Drucker2[;...]]"also beispielsweise"\\server\eti=\\server\eti1;\\server_eti2""\\server\a4fast=\\server\standard"Wenn nun der Drucker \\server\eti nicht benutzt werden kann, wird die Alias-<strong>List</strong>e(in der definierten Reihenfolge) durchlaufen, bis einer der Drucker benutzt werdenkann (oder die <strong>List</strong>e zu Ende ist). Dabei bleibt das gewählte Seitenformat erhalten.Die Groß-/Kleinschreibung ist nicht signifikant.LL_OPTIONSTR_PROJECTPASSWORDErlaubt es, Projekte zu verschlüsseln, um sie vor Verwendung in anderen Applikationenzu schützen. Das hier übergebene Passwort dient als Schlüssel, daher solltenSie ein möglichst langes Passwort mit einer Vielzahl verschiedener Zeichenwählen, um die Verschlüsselung sicherer zu machen.298


GrundlagenIm Designer ist es auch, beispielsweise zu Support-Zwecken, möglich, das Projektunverschlüsselt zu speichern. Halten Sie hierzu die "SHIFT"-Taste gedrücktund speichern Sie das Projekt. Es erscheint ein Passwort-Dialog, in dem Sie dasPasswort eingeben müssen.Die Qualität der Verschlüsselung ist von der Passwort-Länge abhängig. Die Maximallängesind 5 Zeichen, das entspricht 40 bit Verschlüsselung, vorausgesetztdass die ASCII-Werte der Zeichen frei zwischen 1 und 255 verteilt sind. DasPasswort ist nicht (!) absolut sicher, da es per API übergeben wird. Die Hürde fürden Projekt-Diebstahl ist aber sicherlich recht hoch.LL_OPTIONSTR_SAVEAS_PATHDer hierüber übergebene Parameter wird als voreingestellter Pfad für den "SpeichernAls"-Vorgang im Preview benutzt. Der Pfad beinhaltet Verzeichnis und Dateiname.LL_OPTIONSTR_SHORTDATEFORMATDie Zeichenkette, die zur automatischen Umwandlung eines Datums in eine Zeichenketteverwendet wird bei:date$(, "%x")automatischer Typkonvertierung (LlExprEval(), Concat$())Format und Voreinstellung: Siehe Windows API GetLocaleInfo(LOCALE_USER_-DEFAULT, LOCALE_SSHORTDATE,...)LL_OPTIONSTR_THOUSANDDie Zeichenkette, die als Tausenderzeichen bei der fstr$()-Funktion verwendetwird.Wird automatisch auf die Benutzer-Einstellungen eingestellt bzw. auf die entsprechendlokalisierte Zeichenkette, wenn LL_OPTION_LCID eingestellt wird.LL_OPTIONSTR_VARALIASDiese Option ermöglicht es, die in einem Projekt verwendeten Variablen- undFeldnamen zu lokalisieren, indem für den Namen ein Alias angegeben wird. ImDesigner wird immer nur der Alias angezeigt, während im Projektfile immer nurder tatsächliche Name gespeichert wird. So kann durch Austausch des Alias' einelokalisierte Version der Variablen- und Feldliste erreicht werden. Die Option mußfür jede zu lokalisierende Variable einmal in der Form "=" gesetztwerden, also z.B.LlSetOptionString(hJob, LL_OPTIONSTR_VARALIAS, "Vorname=FirstName");LlDefineVariable(hJob, "FirstName", "John");um eine Variable "FirstName" anzumelden, die im Designer als "Vorname" angezeigtwird.299


Beschreibung der API-FunktionenUm alle angemeldeten Alias-Namen wieder zu löschen, rufen Sie einfachLlSetOptionString(hJob, LL_OPTIONSTR_VARALIAS, "");Auf.Die .NET, OCX und VCL-Komponenten bieten eine eigene Dictionary-API an, mitder Ihnen das Setzen der Option komfortabel abgenommen wird. Details findenSie in der Online-Hilfe der Komponenten.pszValue: neuer WertRückgabewert:FehlercodeBeispiel:HLLJOB hJob;hJob = LlJobOpen(0);LlSetOptionString(hJob, LL_OPTIONSTR_LIST_PRJEXT, "list");// ....LlJobClose(hJob);Siehe auch:LlGetOptionStringLlSetPrinterDefaultsDirSyntax:INT LlSetPrinterDefaultsDir(HLLJOB hJob, UINT LPCTSTR pszDir);Aufgabe:Setzt den Pfad für die Druckerbeschreibungsdatei (P-Datei), um z.B. im Netzwerkbetriebbenutzerspezifische Druckereinstellungen speichern zu können.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-Handle300pszDir: Der Pfadname des gewünschten VerzeichnissesRückgabewert:FehlercodeBeispiel:HLLJOB hJob;hJob = LlJobOpen(0);LlSetPrinterDefaultsDir(hJob, "c:\\temp\\user");if (LlPrintStart(hJob, LL_PROJECT_LIST, "c:\\test.lst", LL_PRINT_NORMAL)== 0){


GrundlagenLlPrintEnd(hJob);}elseMessageBox(NULL, "Fehler", "<strong>List</strong> & <strong>Label</strong>",MB_OK);LlJobClose(hJob);Siehe auch:LlSetPrinterToDefault, LlPrintStart, LlPrintWithBoxStart, LlPrintCopyPrinterConfiguration,LlSetPrinterInPrinterFileLlSetPrinterInPrinterFileSyntax:INT LlSetPrinterInPrinterFile(HLLJOB hJob, UINT nObjType,LPCTSTR pszObjName, INT nPrinter, LPCTSTR pszPrinter, DEVMODE* pDM);Aufgabe:Ermöglicht die Veränderung von Druckerkonfigurationen in der Druckerbeschreibungsdatei.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenObjType: LL_PROJECT_LABEL, LL_PROJECT_LIST oder LL_PROJECT_CARDpszObjName: Dateiname des ProjektsnPrinter: Druckerindex (0 für Erstseiten-Drucker, 1 für Folgeseiten-Drucker, -1 fürbeide)pszPrinter: DruckernamepDM: Zeiger auf die neue DEVMODE-Struktur. Kann NULL sein, dann wird derDrucker mit seinen momentanen Voreinstellungen eingetragen.Rückgabewert:FehlercodeHinweise:Diese Funktion ermöglicht es Ihnen, einen (oder beide) Drucker in der Druckerkonfigurationsdateieinzutragen. Wenn keine existiert, wird sie angelegt.Da diese Datei von LlPrintStart() und LlPrintWithBoxStart() eingelesen wird, mussder Befehl VOR dem Aufruf dieser Funktionen durchgeführt werden.Die DEVMODE-Struktur ist in der Windows-API definiert.Siehe auch:LlSetPrinterToDefault, LlPrintCopyPrinterConfiguration, LlSetPrinterDefaultsDir,LlGetPrinterFromPrinterFile301


Beschreibung der API-FunktionenLlSetPrinterToDefaultSyntax:INT LlSetPrinterToDefault(HLLJOB hJob, UINT nObjType,LPCTSTR lpszObjName);Aufgabe:Löscht die Druckerbeschreibungsdatei, so dass <strong>List</strong> & <strong>Label</strong> bei der nächsten Benutzungdes Projekts den in Windows voreingestellten Drucker verwendet.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-HandlenObjType: LL_PROJECT_LABEL, LL_PROJECT_LIST oder LL_PROJECT_CARDlpszObjName: Der Dateiname des ProjektsRückgabewert:FehlercodeBeispiel:HLLJOB hJob;hJob = LlJobOpen(0);LlSetPrinterToDefault(hJob, LL_PROJECT_LIST, "test.lst");if (LlPrintStart(hJob, LL_PROJECT_LIST, "test", LL_PRINT_NORMAL) == 0){LlPrintEnd(hJob);}elseMessageBox(NULL, "Fehler", "<strong>List</strong> & <strong>Label</strong>", MB_OK);LlJobClose(hJob);Siehe auch:LlSetPrinterDefaultsDir, LlPrintStart, LlPrintWithBoxStart, LlCopyPrinterConfiguration,LlSetPrinterInPrinterFileLlViewerProhibitActionSyntax:INT LlViewerProhibitAction(HLLJOB hJob, INT nMenuID);Aufgabe:Entfernt Buttons aus dem Echtdatenpreview.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-Handle302


GrundlagennMenuID: Menü-ID des Buttons, der entfernt werden soll. Die entsprechendenIDs finden Sie (für die englische Version) in der Datei MENUID.TXT in Ihrer <strong>List</strong> &<strong>Label</strong> Installation.Rückgabewert:Hinweise:Siehe auch:FehlercodeEine 0 als Menü-ID löscht die <strong>List</strong>e der zu unterdrückenden IDs.LlPreviewDisplay, LlPreviewDisplayExLlXGetParameterSyntax:INT LlXGetParameter(HLLJOB hJob, INT nExtensionType,LPCTSTR pszExtensionName, LPCTSTR pszKey, LPTSTR pszBuffer,UINT nBufSize);Aufgabe:Gibt Einstellungen des entsprechenden Erweiterungsmoduls zurück.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-handlenExtensionType: Art des Erweiterungsmoduls:WertLL_LLX_EXTENSIONTYPE_EXPORTLL_LLX_EXTENSIONTYPE_BARCODEBedeutungExport ModulPDF 417 / Maxicode ModulpszExtensionName: Name des Moduls ("HTML", "RTF", "PDF417", ...)pszKey: Der Name der Option (z.B. "Export.File")pszBuffer: Zeiger auf einen PuffernBufSize: Größe des PuffersRückgabewert:FehlercodeHinweise:Die Namen der Optionen sind spezifisch für ein Erweiterungsmodul. Bitte benutzenSie die <strong>Referenz</strong> des entsprechenden Moduls.303


Beschreibung der API-FunktionenSiehe auch:LlXSetParameterLlXSetParameterSyntax:INT LlXSetParameter(HLLJOB hJob, INT nExtensionType,LPCTSTR pszExtensionName, LPCTSTR pszKey, LPCTSTR pszValue);Aufgabe:Setzt Parameter in einem Erweiterungsmodul.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> Job-handlenExtensionType: Art des Erweiterungsmoduls:WertLL_LLX_EXTENSIONTYPE_EXPORTLL_LLX_EXTENSIONTYPE_BARCODEBedeutungExport ModulPDF 417 / Maxicode ModulpszExtensionName: Name des Moduls ("HTML", "RTF", "PDF417", ...)pszKey: Der Name der OptionpszValue: Der zuzuweisende InhaltRückgabewert:FehlercodeHinweise:Mit dieser Funktion kann man Optionen setzen wie beispielsweise den Ausgabepfadfür HTML oder RTF, Schwärzungsgrad von Barcodes etc.Die Namen und die Bedeutung der Werte sind spezifisch für ein Erweiterungsmodul.Bitte benutzen Sie die <strong>Referenz</strong> des entsprechenden Moduls.Siehe auch:LlXGetParameter304


Die Zugriffsfunktionen13. Verwaltung der PreviewdateienDer in <strong>List</strong> & <strong>Label</strong> enthaltene Previewdruck schreibt die Druckdaten in eine Datei, wodurcheine Weiterverarbeitung der Vorschau möglich wird.Es werden alle Informationen in einer einzigen Datei gespeichert. Durch die optionaleKompression, die Sie mitLlSetOption(hJob, LL_OPTION_COMPRESSSTORAGE,1);einschalten können, wird die Druckdatei in der Größe um, je nach Daten, etwa 2/3 odermehr verringert! Die Kompression verlangsamt den Druckprozess etwas, ist aber sehrwichtig, wenn Sie die Datei z.B. im Internet zu implizitem (über das ActiveX-Control) oderexplizitem Download zur Verfügung stellen oder per eMail verschicken.Die Datei erhält die Namensendung ".LL". Der interne Aufbau ist nicht freigegeben, damittechnische Änderungen durchgeführt werden können, ohne mit existierenden ApplikationenKonflikte zu bekommen.13.1. Die ZugriffsfunktionenSie müssen sich nicht mehr um die internen Details kümmern. Die ZugriffsfunktionenLlStgsysxxx() erledigen dies für Sie völlig transparent.Diese Funktionen sind in der Datei CMLS13.DLL vorhanden. Diese DLL, die bei Internet-Anwendungen üblicherweise mitgeliefert werden sollte, ist möglichst klein gehalten.Wenn Sie Funktionen aus dieser DLL über eine Import-Bibliothek verwenden wollen, somüssen Sie die Datei CMLS13.LIB unter den Linkereinstellungen hinzufügen. In anderenProgrammiersprachen reicht das Hinzufügen der entsprechenden Deklarationsdatei.Nachfolgend die Auflistung der Funktionen:LlStgsysAppendSyntax:INT LlStgsysAppend(HLLSTG hStg, HLLSTG hStgToAppend);Aufgabe:Hängt einen weiteren Druckjob an.Parameter:hStg: Das von LlStgsysStorageOpen() zurückgelieferte HandlehStgToAppend: Handle der anzuhängenden Preview-DateiRückgabewert:=0: okay,


Verwaltung der PreviewdateienHinweise:Diese Funktion setzt voraus, dass beide Dateien im LL_STG_STORAGE-Format erstelltwurden!Beispiel:HLLSTG hStgOrg;HLLSTG hStgAppend;hStgOrg = LlStgsysStorageOpen("c:\\test\\label1.ll", "", FALSE, TRUE);hStgAppend = LlStgsysStorageOpen("c:\\test\\label2.ll", "", FALSE, TRUE);LlStgsysAppend(hStgOrg,hStgAppend);LlStgsysStorageClose(hStgOrg);LlStgsysStorageClose(hStgAppend);LlStgsysConvertSyntax:INT LlStgsysConvert(HLLSTG hStg, LPCTSTR pszDstFilename,LPCTSTR pszFormat);Aufgabe:Konvertiert eine Vorschaudatei in ein anderes Format.Parameter:hStg: Das von LlStgsysStorageOpen() zurückgelieferte HandlepszDstFilename: Name der Zieldatei. Dieser kann auch den Formatierungsplatzhalter%d enthalten (z.B. "Seite %d"). Dies ist wichtig z.B. für JPEG-Konvertierung,da sonst nur eine einzige Seite erzeugt werden würde.pszFormat: Gewünschtes Zielformat. Erlaubte Werte:"TIFF" (auch als "PICTURE_MULTITIFF")"JPEG" (auch als "PICTURE_JPEG")"EMF""TTY""PDF"Über diesen Parameter können zudem eine semikolonseparierte <strong>List</strong>e von weiteren,exporterspezifische Optionen für die Konvertierung gesetzt werden. Diemöglichen Parameter finden Sie im Kapitel über die Exportmodule dokumentiert.Ein Beispiel wäre die Übergabe von "PDF; PDF.Encryption.EncryptFile=1". Zudemkönnen Sie einen Seitenbereich auswählen. Ein Beispiel hierfür wäre die Verwendungvon "PDF;Export.PageIndexRange.Min=2;Export.PageIndexRange.Max=3".Damit werden lediglich die Seiten 2 und 3 in das erzeugte PDF aufgenommen.Rückgabewert:=0: okay,


Die ZugriffsfunktionenHinweise:-Beispiel:HLLSTG hStgOrg;hStgOrg = LlStgsysStorageOpen("c:\\test\\label1.ll", "", FALSE, TRUE);LlStgsysConvert(hStgOrg, "c:\\test\\label2.pdf", "PDF");LlStgsysStorageClose(hStgOrg);Siehe auch:LlStgsysStorageOpen, LlStgsysStorageConvertLlStgsysDeleteFilesSyntax:INT LlStgsysDeleteFiles(HLLSTG hStg);Aufgabe:Löschen der Preview-Datei(en).Parameter:hStg: Das von LlStgsysStorageOpen() zurückgelieferte HandleRückgabewert:


Verwaltung der PreviewdateienBeispiel:Siehe LlStgsysGetPageMetafileSiehe auch:LlStgsysGetPageMetafile, LlStgsysGetPageMetafile16LlStgsysDrawPageSyntax:INT LlStgsysDrawPage(HLLSTG hStg, HDC hDC, HDC hPrnDC, BOOL bAskPrinter,PCRECT pRC, INT nPageIndex, BOOL bFit, LPVOID pReserved);Aufgabe:Ausgabe einer Seite auf Bildschirm oder Drucker.Parameter:hStg: Das von LlStgsysStorageOpen() zurückgelieferte Handle308hDC: DC, in den gezeichnet werden soll (meist Drucker- oder Bildschirm-DC).Darf NULL sein (s.u.)hPrnDC: <strong>Referenz</strong>-DC, über den Seitenränder etc. bestimmt werden sollen. BeiDruck auf Drucker ist dies meist gleich hDC, bei Druck auf Bildschirm der Default-Drucker-DC. Darf NULL sein (s.u.)bAskPrinter: Wenn hPrnDC NULL ist, entscheidet dieses Flag, ob der Benutzergefragt wird, welchen Drucker er als <strong>Referenz</strong> verwenden will (TRUE), oder ob derDefault-Drucker verwendet werden soll (FALSE).pRC: Rechteck in Device-Koordinaten, in dem die Ausgabe erfolgen soll. Wenndieser Wert NULL ist, wird bei Ausgabe auf Drucker dessen Druckbereich angenommen.Darf für Bildschirmausgabe nicht NULL sein!nPageIndex: Index (1..) der gewünschten SeitebFit: Soll die Ausgabe in das Rechteck von pRC optimal eingepasst werden(TRUE), oder soll die absolute Größe erhalten bleiben (FALSE)?pReserved: NULLRückgabewert:


Die ZugriffsfunktionenLlStgsysGetAPIVersionSyntax:INT LlStgsysGetAPIVersion(HLLSTG hStg);Aufgabe:Parameter:Gibt die Version der Stgsys-Funktionsschnittstelle zurück.hStg: Das von LlStgsysStorageOpen() zurückgelieferte HandleRückgabewert:Hinweise:Die Versionsnummer der Stgsys-API in <strong>List</strong> & <strong>Label</strong> C?LL13.DLL und C?LS13.DLL.Die gegenwärtige Version ist 1 (Stand: 2007).Diese Funktion sollte immer verwendet werden, um die Version der API vor demAufruf zu testen, da zukünftige APIs oft mehr Funktionalität zur Verfügung stellen.Siehe auch:LlStgsysGetFileVersionLlStgsysGetFilenameSyntax:INT LlStgsysGetFilename(HLLSTG hStg, INT nJob, INT nFile,LPTSTR pszBuffer, UINT nBufSize);Aufgabe:Gibt die Information über die Dateinamen der Preview-Datei(en).Parameter:hStg: Das von LlStgsysStorageOpen() zurückgelieferte HandlenJob: Job-Nummer. 1: erster Job, ... (1..LlStgsysGetJobCount())nFile: Seitennummer für DateinamenWertBedeutung-1 Previewdaten-Dateiname0 Druckerkonfigurationsdateiname>0 Seitennr. (1..LlStgsysGetPageCount())lpszBuffer: Puffer für DateinamenBufSize: Größe des Puffers309


Verwaltung der PreviewdateienRückgabewert:0: okay,


Die ZugriffsfunktionenLlStgsysGetJobCountSyntax:INT LlStgsysGetJobCount(HLLSTG hStg);Aufgabe:Parameter:Liefert die Zahl der in einer Vorschaudatei gespeicherten DruckjobshStg: Das von LlStgsysStorageOpen() zurückgelieferte HandleRückgabewert:Hinweise:Beispiel:Siehe auch:>0: Zahl der Druckjobs (bei LL_STG_COMPAT4 immer 1),


Verwaltung der PreviewdateienWertLS_OPTION_-PRINTERCOUNTLS_OPTION_-EMFRESOLUTIONBedeutungMM_DIV_10 oder LL_UNITS_INCH_DIV_100)Anzahl der verwendeten Drucker: 1: ErstseitenundFolgeseitendrucker sind gleich, 2: sie wurdenverschieden eingestellt.Enthält den Wert der EMF-Rechtecks-Auflösung(Standard ist 100 für 1/100 mm, abweichend,wenn eine Seitenkoordinate größer als 32.6 cm).Die Werte sind für eine selbstprogrammierte Ausgabe der Preview-Dateien aufvom Originaldrucker verschiedenen Druckern wichtig.Rückgabewert:>=0: Wert,


Die ZugriffsfunktionenParameter:hStg: Das von LlStgsysStorageOpen() zurückgelieferte HandleRückgabewert:Hinweise:>0: Seitenzahl,


Verwaltung der Previewdateienret = LL_ERR_STG_CANNOTGETMETAFILE;else{POINT ptPixels;POINT ptPixelsOffset;POINT ptPixelsPhysical;POINT ptPixelsPerInch;ptPixels.x = LlStgsysGetPageOptionValue(hStg, nPageIndex,LS_OPTION_PRN_PIXELS_X);ptPixels.y = LlStgsysGetPageOptionValue(hStg, nPageIndex,LS_OPTION_PRN_PIXELS_Y);ptPixelsOffset.x = LlStgsysGetPageOptionValue(hStg, nPageIndex,LS_OPTION_PRN_PIXELSOFFSET_X);ptPixelsOffset.y = LlStgsysGetPageOptionValue(hStg, nPageIndex,LS_OPTION_PRN_PIXELSOFFSET_Y);ptPixelsPhysical.x = LlStgsysGetPageOptionValue(hStg, nPageIndex,LS_OPTION_PRN_PIXELSPHYSICAL_X);ptPixelsPhysical.y =LlStgsysGetPageOptionValue(hStg, nPageIndex,LS_OPTION_PRN_PIXELSPHYSICAL_Y);ptPixelsPerInch.x = LlStgsysGetPageOptionValue(hStg, nPageIndex,LS_OPTION_PRN_PIXELSPERINCH_X);ptPixelsPerInch.y = LlStgsysGetPageOptionValue(hStg, nPageIndex,LS_OPTION_PRN_PIXELSPERINCH_Y);LlStgsysDestroyMetafile(hMF);}Siehe auch:LlStgsysGetPageMetafile16, LlStgsysDestroyMetafileLlStgsysGetPageOptionStringSyntax:INT LlStgsysGetPageOptionString(HLLSTG hStg, INT nPageIndex,INT nOption, LPTSTR pszBuffer, UINT nBufSize);Aufgabe:Abfrage diverser Zeichenketten.Parameter:hStg: von LlStgsysStorageOpen() geliefertes HandlenPageIndex: Seitenindex (1..LlStgsysGetPageCount())nOption: bestimmt die Art des Rückgabewerts:WertLS_OPTION_PROJECTNAMELS_OPTION_JOBNAMELS_OPTION_PRTNAMELS_OPTION_PRTDEVICEBedeutungName der Projektdatei, von der die SeitestammtName des Jobs (siehe LlPrintWithBoxStart())Druckername (z.B. "PSCRIPT")Devicename (z.B. "HP Laserjet 4L")314


Die ZugriffsfunktionenWertBedeutungLS_OPTION_PRTPORT Drucker-Port (z.B. "LPT1" oder"\\prntsrv\laser1")LS_OPTION_USERbenutzerspezifisch (siehe LlStgsysPageSet-OptionString())LS_OPTION_CREATIONErstellungsdatumLS_OPTION_CREATIONAPP Erstellungs-ApplikationLS_OPTION_CREATIONDLL Erstellungs-DLLLS_OPTION_CREATIONUSER Benutzer- und Computer-Name bei derErstellungLS_OPTION_PRINTERALIASLIST Siehe LL_OPTIONSTR_PRINTERALIASLIST:Die zum Zeitpunkt der Erstellung der Vorschaudateigültige Druckerersetzungstabelle(eine Zeichenkette; die einzelnen Zeilensind durch Zeilenumbruch getrennt)pszBuffer: Adresse des Puffers für den gewünschten WertnBufSize: Größe des Puffers (inkl. 0-Terminierung)Rückgabewert:0: okay,


Verwaltung der PreviewdateienRückgabewert:Hinweise:Siehe auch:0: okay,


Die ZugriffsfunktionenWertLS_OPTION_PRN_PIXELS_XLS_OPTION_PRN_PIXELS_YLS_OPTION_PRN_-PIXELSPHYSICAL_XLS_OPTION_PRN_-PIXELSPHYSICAL_YLS_OPTION_PRN_-PIXELSPERINCH_XLS_OPTION_PRN_-PIXELSPERINCH_YLS_OPTION_PRN_INDEXBedeutungOriginaldrucker)Die horizontale Größe des bedruckbarenBereichs (beim Originaldrucker)Die vertikale Größe des bedruckbarenBereichs (beim Originaldrucker)Die horizontale Größe der Druckseite(beim Originaldrucker)Die vertikale Größe der Druckseite (beimOriginaldrucker)Die horizontale Drucker-AuflösungDie vertikale Drucker-AuflösungDie Index des für diese Seite verwendetenOriginaldruckers (0 für Erstseiten-, 1 fürFolgeseitendrucker)Rückgabewert:>=0: Wert,


Verwaltung der PreviewdateienParameter:hStg: Das von LlStgsysStorageOpen() zurückgelieferte HandlenPageIndex: Der Seitenindex (1..LlStgsysGetPageCount())pszDeviceName: Zeiger auf Puffer für Device-NamennDeviceNameSize: Größe des PuffersphDevmode: Zeiger auf globales Handle für die DEVMODE-Struktur. Kann NULLsein, wenn die DEVMODE-Struktur nicht abgefragt werden soll. Das Handle mußinitialisiert sein (NULL oder ein gültiges Handle für einen globalen Block).Rückgabewert:FehlercodeHinweise:Siehe auch:LlGetPrinterFromPrinterFile, LlSetPrinterInPrinterFileBeispiel:HGLOBAL dev;TCHAR* pszPrinter = new TCHAR[1024];dev = GlobalAlloc(GPTR,sizeof(DEVMODE));LlStgsysGetPagePrinter(m_hStgOrg, 1, pszPrinter, 1024, &dev);...GlobalFree(dev);LlStgsysPrintSyntax:HLLSTG LlStgsysPrint(HLLSTG hStg, LPCTSTR pszPrinterName1,LPCTSTR pszPrinterName2, INT nStartPageIndex, INT nEndPageIndex,INT nCopies, UINT nFlags, LPCSTR pszMessage, HWND hWndParent);Aufgabe:Druckt Seiten aus einer geöffneten DruckvorschaudateiParameter:hStg: Das von LlStgsysStorageOpen() zurückgelieferte Handle318pszPrinterName1: Name des Druckers, der für die erste Seite verwendet wird(NULL -> s.u.)pszPrinterName2: Name des Druckers, der für Folgeseiten verwendet wird(NULL -> s.u.)nStartPageIndex: Index der ersten zu druckenden SeitenEndPageIndex: Index der letzten zu druckenden Seite


Die ZugriffsfunktionennCopies: Zahl der KopiennFlags: Verknüpfung folgender Flags:WertLS_PRINTFLAG_FITLS_PRINTFLAG_-STACKEDCOPIESLS_PRINTFLAG_-TRYPRINTERCOPIESLS_PRINTFLAG_METERLS_PRINTFLAG_-ABORTABLEMETERBedeutungEinpassen auf die maximale bedruckbare Flächedes DruckersDie Kopien werden pro Blatt, nicht pro Jobausgeführt (111222333 statt 123123123)Kopien werden über Druckerfeature gedruckt,wenn vorhandenmit Fortschrittsdialogmit Fortschrittsdialog mit Abbrechen-ButtonpszMessage: Wird im Titel eines optionalen Fortschrittsdialogs angezeigt und alsDokumentname für den Druck verwendet. Wenn pszMessage NULL oder auf eineleere Zeichenkette zeigt, wird der Eintrag aus der Vorschaudatei (Parameter vonLlPrintStart()) genommenhWndParent: Fensterhandle, das als Parent für den optionalen Fortschrittsdialoggenommen wird.Rückgabewert:FehlercodeHinweise:Diese Routine druckt den gewählten Seitenbereich aus dem momentan eingestelltenStorage-Job auf den/die angegebenen Drucker.Wichtig: Der Job müß gültig sein, d.h. Sie müssenLlStgsysSetJob(hStg,1);(oder einen anderen Job, falls nötig) vor dem Aufruf durchführen.Wenn ein Druckername NULL ist, versucht <strong>List</strong> & <strong>Label</strong>, den Drucker inklusive derzugehörigen Einstellungen aus der Preview-Datei zu lesen. Wenn dies nicht gelingt,d.h. der Drucker im System nicht existiert (der Device-Name ist der bestmmendeFaktor), wird der im System eingestellte Default-Drucker genommen.Siehe auch:LlStgsysStoragePrint, LlStgsysSetJob319


Verwaltung der PreviewdateienLlStgsysSetJobSyntax:INT LlStgsysSetJob(HLLSTG hStg, INT nJob);Aufgabe:Parameter:Auswahl des Jobs für zukünftige AufrufehStg: Das von LlStgsysStorageOpen() zurückgelieferte HandlenJob: Die Nummer des Jobs (1..LlStgsysGetJobCount())Rückgabewert:Hinweise:0: okay,


Die ZugriffsfunktionenHinweise:Hierüber können Sie Werte in das LL-File schreiben (wenn es nicht READ-ONLYgeöffnet wurde). Bitte vermeiden Sie Optionsnamen, die mit "LL." anfangen.Siehe auch:LlStgsysGetJobOptionStringExLlStgsysSetPageOptionStringSyntax:INT LlStgsysSetPageOptionString(HLLSTG hStg, INT nPageIndex,INT nOption, LPTSTR pszBuffer);Aufgabe:Setzen diverser Zeichenketten.Parameter:hStg: Das von LlStgsysStorageOpen() zurückgelieferte HandlenPageIndex: Seitenindex (1..LlStgsysGetPageCount())nOption: bestimmt die Art des Inhalts:WertLS_OPTION_JOBNAMELS_OPTION_USERBedeutungName des JobsEin benutzerspezifischer Wert, der dazu geeignet,eigene Informationen (z.B. Druckdatum,Benutzer o.ä.) in der Datei unterbringen zukönnen.pszBuffer: Adresse des nullterminierten Puffers mit dem InhaltRückgabewert:0: okay,


Verwaltung der PreviewdateienLlStgsysStorageCloseSyntax:void LlStgsysStorageClose(HLLSTG hStg);Aufgabe:Parameter:Siehe auch:Beendet den Zugriff auf die Druckvorschaudatei.hStg: Das von LlStgsysStorageOpen() zurückgelieferte HandleLlStgsysStorageOpenLlStgsysStorageConvertSyntax:INT LlStgsysStorageConvert(LPCTSTR pszStgFilename,LPCTSTR pszDstFilename, LPCTSTR pszFormat);Aufgabe:Konvertiert eine Vorschaudatei in ein anderes Format.Parameter:pszStgFilename: Name der AusgangsdateipszDstFilename: Name der ZieldateipszFormat: Gewünschtes Zielformat. Erlaubte Werte und erweiterte Optionensiehe LlStgsysConvert().Rückgabewert:=0: okay,


Die ZugriffsfunktionenLlStgsysStorageOpenSyntax:HLLSTG LlStgsysStorageOpen(LPCTSTR lpszFilename, LPCTSTR pszTempPath,BOOL bReadOnly, BOOL bOneJobTranslation);Aufgabe:Öffnet eine DruckvorschaudateiParameter:lpszFilename: Der Dateiname der Druckvorschaudatei oder der Projektdatei (<strong>List</strong>& <strong>Label</strong> setzt die Dateiextension immer auf .LL).pszTempPath: Ein Dateipfad (kann NULL oder leer sein). Ist ein Pfad angegeben,wird eine evtl. Pfadangabe in lpszFilename überschrieben.bReadOnly: TRUE: Die Datei wird im ReadOnly-Modus geöffnet, FALSE: Die Dateikann auch geschrieben werdenbJobTranslation: TRUE: Die Stgsys-Funktionen verheimlichen es, wenn die Preview-Dateiaus mehreren Jobs besteht, FALSE: Sie können (und müssen!) dieJobs getrennt verwaltenRückgabewert:Job-Handle für alle LlStgsys-Funktionen, 0 für FehlerHinweise:Wenn Sie einen Temporärpfad angeben, wird dieser als Pfad benutzt, ansonstenwird der Pfad der Projektdatei verwendet.Diese Art des Aufrufs ist kompatibel mit dem Aufruf für die Previewanzeige LlPreviewDisplay().Die Dateiendung wird immer auf ".LL". gesetzt.Es ist für die Funktionen LlStgsysAppend() und LlStgsysPageSetOptionString()wichtig, dass die Datei mit bReadOnly=FALSE geöffnet wird!bJobTranslation ist sehr praktisch, wenn man die Verwaltung der Jobs der APIüberlassen möchte. Auf FALSE wird man es setzen, wenn die Anwender sehensollen, dass die Datei möglicherweise aus mehreren Jobs besteht.Siehe auch:LlStgsysCloseLlStgsysStoragePrintSyntax:HLLSTG LlStgsysStoragePrint(LPCTSTR lpszFilename, LPCTSTR pszTempPath,LPCTSTR pszPrinterName1, LPCTSTR pszPrinterName2, INT nStartPageIndex,323


Verwaltung der PreviewdateienINT nEndPageIndex, INT nCopies, UINT nFlags, LPCSTR pszMessage,HWND hWndParent);Aufgabe:Druckt eine DruckvorschaudateiParameter:lpszFilename: Der Dateiname der Druckvorschaudatei oder der Projektdatei (<strong>List</strong>& <strong>Label</strong> setzt die Dateiextension immer auf .LL).pszTempPath: Ein Temporärpfad (kann NULL oder leer sein)pszPrinterName1: Name des Druckers, der für die erste Seite verwendet wird(NULL -> s.u.)pszPrinterName2: Name des Druckers, der für Folgeseiten verwendet wird(NULL -> s.u.)nStartPageIndex: Index der ersten zu druckenden SeitenEndPageIndex: Index der letzten zu druckenden SeitenCopies: Zahl der KopiennFlags: Verknüpfung folgender Flags:WertLS_PRINTFLAG_FITLS_PRINTFLAG_-STACKEDCOPIESLS_PRINTFLAG_-TRYPRINTERCOPIESLS_PRINTFLAG_METERLS_PRINTFLAG_-ABORTABLEMETERBedeutungEinpassen auf die maximale bedruckbare Flächedes DruckersDie Kopien werden pro Blatt, nicht pro Jobausgeführt (111222333 statt 123123123)Kopien werden über Druckerfeature gedruckt,wenn vorhandenmit Fortschrittsdialogmit Fortschrittsdialog mit AbbruchbuttonpszMessage: Wird im Titel eines optionalen Fortschrittsdialogs angezeigt und alsDokumentname für den Druck verwendet. Wenn pszMessage NULL oder auf eineleere Zeichenkette zeigt, wird der Eintrag aus der Vorschaudatei genommenhWndParent: Fensterhandle, das als Parent für den optionalen Fortschrittsdialoggenommen wird.Rückgabewert:Fehlercode324


Die ZugriffsfunktionenHinweise:Diese Routine öffnet die Vorschaudatei und druckt den gewählten Bereich aufden/die angegebenen Drucker.Wenn ein Druckername NULL ist, versucht <strong>List</strong> & <strong>Label</strong>, den Drucker inklusive derzugehörigen Einstellungen aus der Preview-Datei zu lesen. Wenn dies nicht gelingt,d.h. der Drucker im System nicht existiert (der Device-Name ist der bestmmendeFaktor), wird der im System eingestellte Default-Drucker genommen.Siehe auch:LlStgsysPrintLsMailConfigurationDialogSyntax:INT LsMailConfigurationDialog(HWND hWndParent, LPCTSTR pszSubkey,UINT nFlags, INT nLanguage);Aufgabe:Öffnet einen Dialog zur Konfiguration der eMailversandparameter, wenn der e-Mailversand über das Modul CMMX02.DLL abgewickelt werden soll (s. Kapitel"14.15. Exportdateien per eMail verschicken").Die Einstellungen werden unter "HKEY_CURRENT_USER\software\<strong>combit</strong>\-cmbtmx\\" gespeichert.Parameter:hWndParent: Parent Fenster-Handle für den DialogpszSubkey: Subkey, der für das Speichern der Werte in der Registry verwendetwird. Hier sollte der Name der ausführbaren Datei der Applikation übergebenwerden, dann werden die gewählten Werte bei einem Versand für diese Applikationautomatisch gesetzt.nFlags: eins oder mehrere der folgenden FlagsWertLS_MAILCONFIG_USERLS_MAILCONFIG_GLOBALLS_MAILCONFIG_PROVIDERBedeutungbenutzerspezifische Datencomputerspezifische DatenAuch Provider-Auswahl (SMAPI, SMTP, ...)Alle Daten werden benutzerspezifisch gespeichert (auch die computerspezifischenDaten), die Flags definieren nur eine logische Trennung für den Dialog(Servereinstellungen und Benutzerdaten).nLanguage: gewählte Sprache für den Dialog325


Verwaltung der PreviewdateienWertBedeutungCMBTLANG_DEFAULT im System voreingestellte SpracheCMBTLANG_GERMAN DeutschCMBTLANG_ENGLISH EnglischWeitere Konstanten in den Deklarationsdateien.Rückgabewert:FehlercodeSiehe auch:-LsMailGetOptionStringSyntax:INT LsMailGetOptionString(HLSMAILJOB hJob, LPCTSTR pszKey,LPTSTR pszBuffer, UINT nBufSize);Aufgabe:Liest die im Moment des Aufrufs gültigen eMail-Einstellungen für <strong>List</strong> & <strong>Label</strong>aus.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> eMail-API Job-HandlepszKey: Optionsname. Mögliche Werte siehe LsMailSetOptionString().lpszBuffer: Zeiger auf Puffer, in den der Inhalt gespeichert werden sollnBufSize: Größe des PuffersRückgabewert:FehlercodeSiehe auch:LsMailSetOptionStringLsMailJobCloseSyntax:INT LsMailJobClose(HLSMAILJOB hJob);Aufgabe:Schließen des DLL-Jobs.326


Die ZugriffsfunktionenParameter:Hinweise:hJob: <strong>List</strong> & <strong>Label</strong> eMail-API Job-HandleDiese Funktion muss nach Benutzung der eMail-Funktionen der <strong>List</strong> & <strong>Label</strong>-DLLoder bei Beendigung Ihres Programms aufgerufen werden (paarweise mit LsMail-JobOpen().Beispiel:HLSMAILJOBhMailJob;hMailJob = LsMailJobOpen(CMBTLANG_DEFAULT);...LsMailJobClose(hMailJob)Siehe auch:LsMailJobOpenLsMailJobOpenSyntax:INT LsMailJobOpen(INT nLanguage);Aufgabe:Öffnet einen eMail-API Job.Parameter:nLanguage: gewählte Sprache für Benutzer-InteraktionenWertBedeutungCMBTLANG_DEFAULT im System voreingestellte SpracheCMBTLANG_GERMAN DeutschCMBTLANG_ENGLISH EnglischWeitere Konstanten in den Deklarationsdateien.Rückgabewert:Ein Handle, das bei den meisten Funktionen als Parameter benötigt wird, um aufdie applikationsspezifischen Daten zugreifen zu können.Ein gültiger Wert ist größer als 0.Beispiel:HLSMAILJOB hMailJob;hMailJob = LsMailJobOpen(0);Siehe auch:LsMailJobClose327


Verwaltung der PreviewdateienLsMailSendFileSyntax:INT LsMailSendFile(HLSMAILJOB hJob, HWND hWndParent);Aufgabe:Versendet eine eMail mit den aktuellen Einstellungen.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> eMail-API Job-HandlehWndParent: Parent-Fensterhandle für den eMaildialog. Wenn als Fensterhandle"0" angegeben wird, wird kein Versendedialog angezeigt und die eMail - wennmöglich - ohne Benutzerinteraktion versendet.Rückgabewert:FehlercodeBeispiel:HLSMAILJOBhMailJob;hMailJob = LsMailJobOpen(0);LsMailSetOptionString(hMailJob, "Export.Mail.To", "test@domainname.de");LsMailSetOptionString(hMailJob, "Export.Mail.Subject", "Test!");LsMailSetOptionString(hMailJob, "Export.Mail.Attachment<strong>List</strong>","c:\\test.txt");LsMailSendFile(hMailJob, 0);LsMailJobClose(hMailJob)Siehe auch:LsMailSetOptionStringLsMailSetOptionStringSyntax:INT LsMailSetOptionString(HLSMAILJOB hJob, LPCTSTR pszKey,LPCTSTR pszValue);Aufgabe:Setzt diverse eMail-Einstellungen in <strong>List</strong> & <strong>Label</strong>.Parameter:hJob: <strong>List</strong> & <strong>Label</strong> eMail-API Job-HandlepszKey: Folgende Werte sind möglich:WertExport.Mail.ToExport.Mail.CCBedeutungEmpfänger eMail Adressen, ggf. auch mehrereper Semikolon getrenntCC Empfänger eMail Adressen, ggf. auch mehrere328


Die ZugriffsfunktionenWertExport.Mail.BCCExport.Mail.SubjectExport.Mail.BodyExport.Mail.Body:text/htmlExport.Mail.Attachment<strong>List</strong>pszValue: neuer WertRückgabewert:FehlercodeBeispiel:HLSMAILJOBhMailJob;Bedeutungper Semikolon getrenntBCC Empfänger eMail Adressen, ggf. auch mehrereper Semikolon getrenntBetreffzeile der eMailNachrichtentext der eMailHTML-Nachrichtentext der eMail. Angabe optional,ansonsten wird die Nachricht als reine Textnachrichtmit dem unter Export.Mail.Body angegebenenText versendet.Tabulator-separierte <strong>List</strong>e von DateianhängenhMailJob = LsMailJobOpen(0);LsMailSetOptionString(hMailJob, "Export.Mail.To","test@domainname.de ");...LsMailJobClose(hMailJob)Siehe auch:LsMailGetOptionStringLsSetDebugSyntax:void LsSetDebug(BOOL bOn);Aufgabe:Schaltet den Debug-Modus der LS-API ein oder aus.Parameter:bOn: gibt den gewünschten Zustand anSiehe auch:-329


Die Export-Module14. Die Export-ModuleNeben der Ausgabe in die Vorschaudatei bietet <strong>List</strong> & <strong>Label</strong> weitere Zielformate, um dasDruckergebnis weiterzuverwenden. Die Ausgabe in diese Zielformate geschieht überspezielle Export-Module, welche als <strong>List</strong> & <strong>Label</strong> Erweiterung in Erweiterungsdateien mitder Endung .LLX (= <strong>List</strong> & <strong>Label</strong> Extension) vorliegen. Dabei können auch mehrere Export-Modulein derselben Erweiterungsdatei untergebracht sein. Die von <strong>List</strong> & <strong>Label</strong>standardmäßig bereitgestellten Exportmodule unterstützen die Formate HTML, MHTML,RTF, PDF, XML, XLS, TXT, TTY, JPEG, EMF, TIFF und BMP.14.1. Das FunktionsprinzipUm die Exportmodule zu aktivieren, muss <strong>List</strong> & <strong>Label</strong> mitgeteilt werden, wo es dieErweiterungsdateien finden und laden kann. Anschließend stehen die Export-Moduleneben den Standard-Ausgabemedien Drucker ("PRN"), Vorschau ("PRV") und Datei ("FILE")unter einem bestimmten, eindeutigen Namen ("HTML", "RTF", "PICTURE_JPEG","PICTURE_EMF", "PICTURE_BMP") zur Verfügung. Der eigentliche Export in das jeweiligeFormat läuft aus Entwicklersicht daher auch analog zum sonstigen Druck.Ob und wenn ja welche Export-Module überhaupt dem Endanwender angeboten werdensollen, oder ob ein Druck fest auf ein bestimmtes Export-Modul durchgeführt werdensoll, kann ebenso programmiertechnisch festgelegt werden, wie einzelne exportformat-spezifischeOptionen.14.2. Die Programmierschnittstelle der Export-Module14.2.1. Export-Module global (de)aktivierenStandardmäßig versucht <strong>List</strong> & <strong>Label</strong>, die Datei cmll13ex.llx aus dem Verzeichnis der DLLzu laden. Damit stehen Ihnen automatisch alle Exportformate zur Verfügung, die <strong>List</strong> &<strong>Label</strong> anbietet, sobald Sie als Druckziel bei LlPrint(WithBox)Start LL_PRINT_EXPORT angeben.Möchten Sie die Exportmodule deaktivieren, so können Sie dies über die OptionLL_OPTIONSTR_LLXPATHLIST erreichen. Geben Sie dazu den Dateinamen mit einemDach davor an, also "^CMLL13EX.LLX".Um die Exportmodule aus einem anderen Verzeichnis zu laden, verwenden Sie ebenfallsdiese Option. Als Beispiel können Sie "c:\Programme\\cmll13ex.llx",angeben, um die Exportmodule aus Ihrem Applikationsverzeichnis zu laden.14.2.2. Einzelne Export-Module ein- und ausschaltenEine semikolonseparierte <strong>List</strong>e der verfügbaren Ausgabemedien erhalten Sie durch Abfrageder Option LL_OPTIONSTR_EXPORTS_AVAILABLE. Dies schließt die Standard-330


Die Programmierschnittstelle der Export-ModuleAusgabemedien Drucker, Vorschau und Datei mit ein. Durch Setzen der Option LL_-OPTIONSTR_EXPORTS_ALLOWED können die verfügbaren Ausgabemedien eingeschränktwerden. Dies betrifft dann die Auswahlmöglichkeit des Ausgabemediums fürden Endanwender im LlPrintOptionsDialog(). Beachten Sie, dass die verfügbaren Ausgabemediendurch den Ausgabemedium-Parameter bei LlPrint[WithBox]Start() beeinflusstwerden (wenn dort bspw. Druck auf Vorschau forciert wird), daher sollten Sie LL_-OPTIONSTR_EXPORTS_ALLOWED am besten erst danach verwenden.Beispiel zur Einschränkung der Export-Module:LlPrintWithBoxStart(..., LL_PRINT_EXPORT, ...);//Erlaube lediglich Druck auf Vorschau und HTML-Export:LlSetOptionString(hJob, LL_OPTIONSTR_EXPORTS_ALLOWED, "PRV;HTML");//...LlPrintOptionsDialog(...);Beispiel zum Ausschalten der Export-Module:LlPrintWithBoxStart(..., LL_PRINT_EXPORT, ...);//Verbiete alle Export-Module:LlSetOptionString(hJob, LL_OPTIONSTR_EXPORTS_ALLOWED, "PRN;PRV;FILE");//...LlPrintOptionsDialog(...);14.2.3. Ausgabemedium festlegen/abfragenDie Festlegung/Abfrage des Ausgabemediums kann zum einen über einen Parameterbeim Funktionsaufruf von LlPrint[WithBox]Start() erfolgen. Hier können verschiedeneWerte übergeben werden:WertLL_PRINT_NORMALLL_PRINT_PREVIEWLL_PRINT_FILELL_PRINT_EXPORTBedeutungAusgabemedium "Drucker" wird voreingestellt.Ausgabemedium "Vorschau" wird voreingestellt.Ausgabemedium "Druckdatei" wird voreingestellt.Als Ausgabemedium wird ein Export-Modul voreingestellt, welchesanschließend über LlPrintSetOptionString(LL_PRNOPTSTR_-EXPORT) festgelegt werden kann.Zum anderen kann über LlPrintSetOptionString(LL_PRNOPTSTR_EXPORT) ein bestimmtesAusgabemedium eingestellt werden, welches gleichzeitig im LlPrintOptionsDialog() alsAuswahl voreingestellt wird.Beispiel zur Festlegung das Ausgabemediums auf RTF-Export:LlPrintWithBoxStart(..., LL_PRINT_EXPORT, ...);LlPrintSetOptionString(hJob, LL_PRNOPTSTR_EXPORT, "RTF");LlPrintOptionsDialog(...);Falls der Endanwender kein anderes Ausgabemedium im LlPrintOptionsDialog() auswählenkönnen soll, dann müssen diese über LL_OPTIONSTR_EXPORTS_ALLOWED vorher331


Die Export-Moduleexplizit deaktiviert werden. Dies geschieht, indem dort ausschließlich das gewünschteAusgabemedium übergeben wird.Der Endanwender kann allerdings auch im Designer über Projekt > Seitenlayout bei denAusgabemedien ein Export-Modul voreinstellen. Das gewählte Export-Modul wird durch<strong>List</strong> & <strong>Label</strong> über die LL_PRNOPTSTR_EXPORT Option voreingestellt. Das Anwendungsprogrammsollte dies berücksichtigen und entweder selbst in diesem Falle keine Voreinstellungvornehmen oder die Möglichkeit der Voreinstellung im Designer verbieten.Ansonsten würde der Endanwender ziemlich verwirrt werden, wenn er im Designerexplizit "RTF" als Standard-Exportmedium auswählt, das Anwendungsprogramm aberbeim Druck fest "HTML" vorschlägt.Beispiel zur Berücksichtigung eines evtl. bereits eingestellten Export-Mediums (wennkeine Voreinstellung seitens des Endanwenders im Designer, dann als VoreinstellungDruck auf Vorschau einstellen):LlPrintGetOptionString(hJob, LL_PRNOPTSTR_EXPORT, sMedia.GetBuffer(256),256);sMedia.ReleaseBuffer();if (sMedia == "") //keine Voreinstellung vorhanden LlPrintSetOptionString(hJob,LL_PRNOPTSTR_EXPORT, TEXT("PRV"));LlPrintOptionsDialog(...);Beispiel zum Ausschalten der Voreinstellungsmöglichkeit durch den Endanwender imDesigner:LlSetOption(hJob, LL_OPTION_SUPPORTS_PRNOPTSTR_EXPORT, FALSE);//...LlDefineLayout(...);Die Abfrage des letztlich vom Endanwender gewählten Ausgabemediums geschiehtnach erfolgtem LlPrintOptionsDialog() ebenfalls über diese Option.Beispiel zur Abfrage des Ausgabemediums://...LlPrintOptionsDialog(...);LlPrintGetOptionString(hJob, LL_PRNOPTSTR_EXPORT, sMedia.GetBuffer(256),256);sMedia.ReleaseBuffer();//...if (sMedia == "PRV"){LlPreviewDisplay(...);LlPreviewDeleteFiles(...); //optional}14.2.4. Export-spezifische Optionen setzenDie Export-spezifischen Optionen werden über die Funktion LlXSetParameter gesetztund über LlXGetParameter abgefragt. Die Optionen sind Export-Modul spezifisch, dahermuss bei diesen Funktionen auch explizit der Name des Export-Moduls übergeben werden.Wo sinnvoll können die Optionen auch simultan für alle Export-Module gesetztwerden (z.B. "Export.ShowResult"), indem einfach ein Leerstring ("") als Name für das332


HTML Export-ModulExport-Modul übergeben wird. Die jeweils unterstützten Optionen und ihre Bedeutungwerden in den nachfolgenden Kapiteln bei den einzelnen Export-Modulen erläutert.Ein Teil der Optionen kann auch durch den Endanwender interaktiv im Eigenschaftsdialogdes jeweiligen Export-Moduls eingestellt werden (entweder im Designer oder imDruckoptionsdialog). Diese Optionen werden dann automatisch in der Druckerdefinitionsdatei(das "P-File") gespeichert und sind demnach Projektdatei-spezifisch.14.2.5. Export ohne Benutzerinteraktion durchführenSoll ein Export ohne Benutzerinteraktion durchgeführt werden, so kann dies durch denEinsatz der bisher besprochenen Funktionen realisiert werden.Beispiel:Angenommen, die Anwendung möchte ohne Benutzerinteraktion das <strong>List</strong>enprojekt'Artikel.lst' in das HTML-Dokument 'export.htm' im Verzeichnis 'c:\temp' exportieren://...LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_EXPORT, "HTML","Export.File", "export.htm");LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_EXPORT, "HTML","Export.Path", "c:\\temp\\");LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_EXPORT, "HTML","Export.Quiet", "1");LlPrintWithBoxStart(hJob, LL_PROJECT_LIST, "Artikel.lst",LL_PRINT_EXPORT, LL_BOXTYPE_BRIDGEMETER, hWnd,"HTML");LlPrintSetOptionString(hJob, LL_PRNOPTSTR_EXPORT, "HTML");//... Normale Druckschleife ...Das war es schon! Die Bedeutung der HTML-Export-spezifischen Optionen entnehmenSie bitte dem nachfolgenden Kapitel.14.2.6. Export-Ergebnis abfragenUm das Export-Ergebnis weiterzuverarbeiten, können über die OptionLL_OPTIONSTR_EXPORTFILELIST alle durch den Druck/Export generierten Dateien ermitteltwerden: Wenn diese Option per LlGetOptionString() nach LlPrintEnd(), also nacheinem durchgeführten Druck, abgefragt wird, so erhält man eine Semikolon-separierte<strong>List</strong>e aller Dateien (inkl. Verzeichnis), die durch den Druck generiert wurden. Bei einemHTML-Export wären dies bspw. alle erzeugten HTML- und JPEG-Dateien, bei einemDruck auf Vorschau lediglich die eine generierte LL-Vorschaudatei.Die beim Export generierten Dateien werden nicht automatisch gelöscht, sondern müssenggf. durch das Anwendungsprogramm entfernt werden.14.3. HTML Export-ModulDas HTML Export-Modul erzeugt (mit wenigen Einschränkungen, s.u.) HTML Code gemäßHTML 4.01 Spezifikation.333


Die Export-Module14.3.1. Vorgehensweise des Export-ModulsDas Export-Modul sammelt alle <strong>List</strong> & <strong>Label</strong> Objekte einer soeben gedruckten Seitezusammen und ordnet diese dann in einer großen HTML-Tabelle (dem sog. Layout-Grid)gemäß ihrer optischen Anordnung auf der Seite an. Die einzelnen Spaltenbreiten undZeilenhöhen dieses Layout-Grids ergeben sich aus den gesamten X- und Y-Koordinatenaller Objektrechtecke.Der Endanwender kann durch die HTML-Export Eigenschaften wählen, ob die Spaltenbreitendes Layout-Grids durch das Export-Modul prozentual (bezogen auf die aktuelleBrowser-Fenstergröße) oder absolut (in Pixel) erfolgen soll. Eine absolute Anordnung hatden Vorteil einer optisch genaueren Umsetzung des Designer-Layouts in HTML, was beiprozentualem Layout nicht immer möglich ist. Eine prozentuale Anordnung hat denVorteil, dass das Ergebnis hinterher vom Browser in der Regel besser ausdruckbar ist,da hier der Browser den Inhalt in der Größe anpassen kann, um seine eigenen Kopf-/Fußzeilen u.ä. zu drucken, was bei einem absolutem Layout nicht möglich ist und worausoftmals mehrere ungewollte Seiten resultieren.Da jede unterschiedliche X- bzw. Y-Koordinate eine neue Spalte bzw. Zeile im Layout-Grid bewirkt, sollte man im Designer darauf achten, die Objekte möglichst an gleichenKanten auszurichten. Dies resultiert dann zum einen in einem weniger komplexen (unddamit auch vom Browser schneller darstellbaren) Layout-Grid, zum anderen (insbesonderebei der prozentualen Spaltenanordnung) verhindert es ggf. eine unvorhergesehenehorizontale Anordnung von Objekten, da sich kleine Lücken zwischen Objekten prozentualunterschiedlich stark niederschlagen können (im Gegensatz zu absolutem, pixelgenauemLayout).HTML unterstützt in der Version 4.01 keine überlappenden Objekte, so dass hier Einschränkungenbeim Export gegeben sind: Wenn Objekte sich im Design überlappen,dann exportiert das HTML Export-Modul lediglich das Objekt, welches in der Objektanordnung"am tiefsten" liegt, also zuerst gedruckt wird. Die anderen Objekte, welchedurch <strong>List</strong> & <strong>Label</strong> darüber gedruckt würden, werden ignoriert. Einzige Ausnahme: GefüllteRechteckobjekte im Hintergrund; diese werden durch "Einfärben" der Zelle desdarüberliegenden Objektes realisiert. Daneben gibt es natürlich diverse, durch das Zielformatbedingte Einschränkungen. Die wichtigsten werden im folgenden Kapitel genannt.14.3.2. Einschränkungen• Überlappende Objekte (abgesehen von Rechtecken) werden nicht unterstützt undignoriert• Rechtecke können keinen Rahmen haben und transparente Rechtecke (egal ob mitRahmen oder ohne) werden ignoriert.• Der Dezimaltabulator in Textobjekten und Tabellen wird auf 'rechtsbündig' umgesetzt.334


HTML Export-Modul• Tabulatoren und mehrere aufeinanderfolgende Leerzeichen werden nicht unterstützt.• Zeilen- und Absatzabstände werden nicht unterstützt.• Die Option 'Wortumbruch' in Textobjekten und Tabellenspalten ist bei HTML immeraktiv (auch wenn 'abschneiden' im Designer gewählt wurde)• die Tabellen-Objekt Option "Separatoren Durchziehen" wird nicht unterstützt.• In Tabellenzeilen wird der ggf. vorhandene Abstand von links für die 1. Spalte ignoriert.• Die Tabellenoption "fixe Größe“ wird nicht unterstützt.• Das Chart -Objekt wird als Bild exportiert und kann daher nicht transparent erscheinen.• Die Umsetzung von formatiertem RTF-Text in HTML-Code erfolgt über einen RTF-Parser, der die wichtigsten Absatz- und Zeichenformatierungen interpretiert undentsprechend umsetzt. Erweiterte Formatierungen, autom. Nummerierungen, sowieeingebettete Objekte und Grafiken werden ignoriert.• Linien werden als Grafik realisiert. Dies geschieht allerdings lediglich für genauvertikale und horizontale Linien, alle diagonalen Linien werden ignoriert.• Gradientenfüllungen werden nicht unterstützt.• Gedrehte Texte werden nicht unterstützt.• Gedrehter RTF-Text wird nicht unterstützt.• Objekte die als Bild exportiert werden dürfen nicht aus ihrem Objektrahmen ragen.Daher müssen z.B. Barcodeobjekte mit fester Balkenbreite im Designer so gestaltetwerden, dass der Inhalt in jedem Fall im Objektrechteck Platz findet.• Selbst in einem Callback gezeichnete Ausgaben werden nicht exportiert.• Abstände vor Tabellenzeilen werden nicht unterstützt.• Rahmen von benachbarten Zellen werden nicht übereinander, sondern nebeneinandergemalt. Dadurch kann sich die Rahmendicke verdoppeln. Bitte berücksichtigenSie dies bereits beim Layout.• Die Funktion TotalPages$() kann nicht in gedrehten Textobjekten verwendet werden.Folgende über den HTML 4.01 Standard hinaus verwendete Tags oder Attribute werdenverwendet:335


Die Export-Module• Das Ausschalten des Seitenrandes für die HTML Seiten wird über jeweils zweiBrowserspezifische Tags orientiert, um unter Netscape und Internet Explorer optimaleErgebnisse zu erzielen:


HTML Export-ModulPicture.JPEGQuality: Spezifiziert die Qualität und den davon abhängigen Kompressionsfaktorder generierten JPEG Grafiken. Der Wert liegt zwischen 0..100, wobei 100 derhöchsten JPEG Qualität (und damit vergleichsweise schlechtesten Kompression) entspricht.Default: 100Picture.BitsPerPixel: Gibt die Farbtiefe der generierten Grafiken an. In der Regel reichenfür HTML Export 256 Farben aus, man sollte beachten, dass bei einer höheren Farbtiefedie Grafikdateien sehr schnell sehr groß werden können.Wert Bedeutung1 Schwarz-Weiß4 16 Farben8 256 Farben24 24bit True Color32 32bit True ColorDefault 8Verbosity.Rectangle: Konfiguriert die Art und Weise, wie Rechteck-Objekte exportiertwerden sollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als JPEG (und zusätzlich als komplettes Rechteckobjekt, für farblichhinterlegte Objekte)Default 1Verbosity.Barcode: Konfiguriert die Art und Weise, wie Barcode-Objekte exportiertwerden sollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als JPEGDefault 1Verbosity.Drawing: Konfiguriert die Art und Weise, wie Grafik-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als JPEG337


Die Export-ModuleWertDefault 1BedeutungVerbosity.Ellipse: Konfiguriert die Art und Weise, wie Ellipsen-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als JPEGDefault 1Verbosity.Line: Konfiguriert die Art und Weise, wie Linien-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als JPEGDefault 1Verbosity.Text: Konfiguriert die Art und Weise, wie Text-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als komplettes Textobjekt2 Objekt als JPEGDefault 1Verbosity.Text.Frames: Konfiguriert die Art und Weise, wie Rahmen um Textobjekteexportiert werden sollen.Wert Bedeutung0 einzelne Rahmen für oben, unten, links, rechts erzeugen (verwendet CSS)1 kompletter Rahmen als BoxDefault 0338


HTML Export-ModulVerbosity.RTF: Konfiguriert die Art und Weise, wie RTF-Objekte exportiert werden sollen.Wert Bedeutung0 Objekt ignorieren1 als formatierter RTF-Text (wird interpretiert und nach HTML gewandelt)2 als unformatierter Text (als Schriftart wird die beim Projekt eingestellte Default-Schriftartverwendet)3 Objekt als JPEGDefault 1Verbosity.RTF.Frames: Konfiguriert die Art und Weise, wie Rahmen um RTF-Objekteexportiert werden sollen.Wert Bedeutung0 einzelne Rahmen für oben, unten, links, rechts erzeugen (verwendet CSS)1 kompletter Rahmen als BoxDefault 0Verbosity.Table: Konfiguriert die Art und Weise, wie Tabellen-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 als komplettes TabellenobjektDefault 1Verbosity.Table.Cell: Konfiguriert die Art und Weise, wie die Tabellen-Zellen exportiertwerden sollen.Wert Bedeutung0 Zellen ignorieren1 als komplettes Zellenobjekt (gemäß den Verbosity-Einstellungen der jeweiligenObjekttypen)2 Zellen als JPEGDefault 1339


Die Export-ModuleVerbosity.Table.Frames: Konfiguriert die Art und Weise, wie Tabellen-Rahmen exportiertwerden sollen.Wert Bedeutung0 keine Tabellenrahmen zeichnen1 nur horizontalen Tabellenrahmen als horizontale Linie berücksichtigen2 komplette Tabellenzeile mit allen Rahmen, sofern irgendein vertikaler Rahmenvorhanden, ansonsten wie 13 Zellenspezifische Rahmen zeichnen (verwendet CSS)Default 3Verbosity.LLXObject: Konfiguriert die Art und Weise, wie LLX-Objekte (z.B. Chart-Objekt) exportiert werden sollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als JPEGDefault 1Verbosity.LLXObject.HTMLObj: Konfiguriert die Art und Weise, wie das HTML Objektexportiert werden soll.Wert Bedeutung0 Objekt ignorieren1 Objekt als JPEG2 Objekt im HTML Format. Dabei werden nur die HTML Anweisungen zwischen und exportiert. Bitte beachten Sie die o.g. Einschränkungen.Default 2HTML.Charset: Gibt den Zeichensatz an, der in die zu generierenden HTML Seiten eingetragenwird und dem Web-Browser die Interpretation des Seiteninhalts vorgibt. Wirdnur berücksichtigt, wenn nicht das Unicode-Exportmodul verwendet wird, andernfalls istdie Codierung fest auf UTF-16 voreingestellt.Wird im Nicht-Unicodefall durch die Anwendung kein Charset vorgegeben, dann wird erin Abhängigkeit von der eingestellten Codepage automatisch ermittelt. Folgende Tabelleliefert die Übersicht der automatischen Zuordnung von Codepage zu Charset:340


HTML Export-ModulWertBedeutung1250 Charset wird auf ISO-8859-2 ("Latin-2") gesetzt.1251 Charset wird auf ISO-8859-5 ("Kyrillisch") gesetzt.1252 Charset wird auf ISO-8859-1 ("Latin-1") gesetzt.1253 Charset wird auf ISO-8859-7 ("Neugriechisch") gesetzt.1254 Charset wird auf ISO-8859-9 ("Latin-5, Türkisch") gesetzt.1255 Charset wird auf ISO-8859-8 ("Hebräisch") gesetzt.1256 Charset wird auf ISO-8859-6 ("Arabisch") gesetzt.1257 Charset wird auf ISO-8859-4 ("Latin-4") gesetzt.932 Charset wird auf ISO-2022-JP ("Japanisch") gesetzt.936 Charset wird auf GB2312 ("Chinesisch") gesetzt.Default Der in der aktiven LNG-Datei hinterlegte Default-Charset für die aktive Sprache.HTML.Title: Spezifiziert den Titel des zu generierenden HTML-Dokuments. Default: Titel,der bei LlPrintWithBoxStart() dem Druckjob übergeben wird.Layouter.Percentaged: Gibt an, ob das Layout absolut oder prozentual zur Seitenbreiteerfolgen soll.Wert Bedeutung0 Layout in X-Richtung absolut in Pixel1 Layout in X-Richtung überall prozentual auf SeitenbreiteDefault 0Layouter.FixedPageHeight: Gibt an, ob der Layouter auf allen Seiten die Original-Seitenhöhe erzwingen soll.Wert Bedeutung0 Layout kann z.B. auf letzter Seite zu kleinerer Seitenhöhe führen (wenn keineObjekte am Seitenfuss platziert sind)1 Die Seitenhöhe wird exakt beachtetDefault 1Export.Path: Definiert den Zielpfad für den Export. Ist er leer, so erfolgt in jedem Fall einZielpfad-Auswahldialog.341


Die Export-ModuleExport.File: Gibt den Dateinamen für die erste zu generierende HTML-Seite an. Default:"index.htm". Sie können im Dateinamen auch printf-Platzhalter wie z.B. "%08d" verwenden(z.B. "Export Seite %d.htm"). In diesem Falle werden die erste Seite und die Folgeseitendurch Ersetzung des Platzhalters durch die entsprechend formatierte Seitenzahlbenannt. Ansonsten erhalten die Seiten eine einfache Nummerierung.Export.AllInOneFile: Konfiguriert das Export-Resultat.Wert Bedeutung0 Das Ergebnis sind n verschiedene HTML-Dateien, für jede gedruckte Seiteeine HMTL-Datei.1 Das Ergebnis ist eine einzige HTML Datei (Export.File), in der alle gedrucktenSeiten aneinander hängen.Default 1Export.Quiet: Gibt an, ob der Exportvorgang mit Benutzerinteraktion durchgeführt werdensoll.Wert Bedeutung0 Interaktivität/Dialoge erlaubt1 Es erfolgt kein Zielpfad-Auswahldialog (sofern Export.Path gesetzt ist) undkeine "Überschreiben?" Rückfrage. Ebenso wird keine Zusammenfassungder überlappenden Objekte, die ignoriert wurden, angezeigt.Default 0Export.ShowResult: Spezifiziert, ob im Anschluss an den Export die mit der Dateiendungverknüpfte Anwendung automatisch gestartet werden soll.Wert Bedeutung0 Keine Anzeige des Ergebnisses1 Führt ein ShellExecute() auf Export.File aus, so dass üblicherweise ein Web-Browser gestartet wirdDefault 0Export.ShowResultAvailable: Hiermit kann die entsprechende Auswahlbox im Fileauswahldialogversteckt werden.Wert Bedeutung0 Auswahlbox versteckt1 Benutzerauswahl möglichDefault 1342


HTML Export-ModulHTML.Form.Header: Definiert einen HTML-Formular-Tag der Art "


Die Export-ModuleTextobjekteWertBedeutung@EDIT: Erzeugt ein 1-zeiliges Eingabefeld. Der Inhalt des 1.Absatzes des Objekts ergibt die Vorbelegung.@MULTIEDIT:@LISTBOX:@COMBOBOX:@RADIOBUTTON:,@CHECKBOX:,@BUTTON:@SUBMIT:@RESET: ist der Name des Controls im HTML-Formular.Erzeugt ein mehrzeiliges Eingabefeld. Der Inhalt derAbsätze des Objekts ergibt die Vorbelegung.Erzeugt ein <strong>List</strong>box. Der Inhalt der Absätze des Objektsergibt die einzelnen Einträge in der <strong>List</strong>e.Erzeugt ein Combobox. Der Inhalt der Absätze desObjekts ergibt die einzelnen Einträge in der <strong>List</strong>e.Erzeugt einen Radiobutton. Ist der Inhalt des 1. Absatzes'T', 'X' oder '1', dann wird der Radiobutton aktiviert.Erzeugt eine Checkbox. Ist der Inhalt des 1. Absatzes'T', 'X' oder '1', dann wird die Checkbox aktiviert.Erzeugt einen Button. Der Inhalt des 1. Absatzes ergibtden Button-Text.Erzeugt einen Submit-Button. Der Inhalt des 1. Absatzesergibt den Button-Text.Erzeugt einen Reset-Button. Der Inhalt des 1. Absatzesergibt den Button-Text.BildobjekteWert@RADIOBUTTON:,@CHECKBOX:,@IMAGE:BedeutungErzeugt einen Radiobutton. Ist der Inhalt des 1. Absatzes'T', 'X' oder '1', dann wird der Radiobutton aktiviert.Erzeugt eine Checkbox. Ist der Inhalt des 1. Absatzes'T', 'X' oder '1', dann wird die Checkbox aktiviert.Erzeugt ein Image-Control (welches dem Submit-Buttonentspricht)RechteckobjekteWert@RADIOBUTTON:,@CHECKBOX:,BedeutungErzeugt einen Radiobutton. Ist der Inhalt des 1. Absatzes'T', 'X' oder '1', dann wird der Radiobutton aktiviert.Erzeugt eine Checkbox. Ist der Inhalt des 1. Absatzes'T', 'X' oder '1', dann wird die Checkbox aktiviert.344


MHTML Export-ModulFür die betreffenden Objekte wird als Objektrechteck für das Layout die im Designereingestellte Größe herangezogen, nicht wie bei allen anderen Objekten die sich durchdie Daten erst ergebende Objektgröße. Diverse Eingabecontrols erlauben keine pixelgenaueGrößenangabe, sondern die Größe hängt bspw. von der Länge der Einträge ab.Eine genaue Abbildung 1:1 in HTML ist hier natürlich nicht möglich.Generell ist zu beachten, dass nur die Einträge, welche durch <strong>List</strong> & <strong>Label</strong> auch infolgeder Objektgröße im Designer gedruckt werden können, an das Export-Modul übergebenwerden. Dies hat zu Folge, dass bei einer Combobox, das Textobjekt im Designer sogroß sein muss, dass alle Absätze gedruckt werden können (und damit in die Comboboxaufgenommen werden), auch wenn nachher im HTML Formular das Objekt nur 1-zeilighoch ist.14.4. MHTML Export-ModulDas MHTML (Multi Mime HTML) Export-Modul funktioniert analog zum HTML Export-Modul, mit dem Unterschied, dass Bilder direkt MIME codiert in die Exportdatei eingebettetwerden und das Ergebnis somit nur aus einer einzigen (.MHT) Datei besteht. Diesist bspw. nützlich, um die Datei per eMail zu versenden, da der Empfänger dann perDoppelklick den Report direkt öffnen und ansehen kann, ohne dass noch weitere (externe)Bilddateien notwendig wären.14.4.1. Die ProgrammierschnittstelleEs gelten die Optionen des HTML Export-Moduls analog, als Export Modulname muss"MHTML" angegeben werden. Die Option Export.AllInOneFile wird ignoriert, da diesesFormat immer nur eine Ergebnisdatei erzeugt.14.5. XML Export-ModulMit dem XML Export-Modul kann der Report im XML Format erzeugt werden. Dies ermöglichteine flexible Weiterverarbeitung durch Anwendungen. Sämtliche verfügbarenObjektinformationen werden dabei exportiert. Sind nur die Daten innerhalb einer Tabelleinteressant, so kann der Export auf diese reduziert werden, so dass sämtliche Koordinatenangaben,Objekteigenschaften u.ä. entfallen.14.5.1. Die ProgrammierschnittstelleNachfolgend finden Sie eine Beschreibung aller vom XML Export-Modul unterstütztenOptionen. Diese Optionen können durch das Anwendungsprogramm über die FunktionLlXSetParameter(..."XML"...) gesetzt und über LlXGetParameter(..."XML"...) abgefragt werden.345


Die Export-ModuleResolution: Definiert die Auflösung in dpi für Koordinatenumrechnung und Grafikgenerierung.Default: 96dpi, Bildschirmauflösung.Picture.JPEGQuality: Spezifiziert die Qualität und den davon abhängigen Kompressionsfaktorder generierten JPEG Grafiken. Der Wert liegt zwischen 0..100, wobei 100 derhöchsten JPEG Qualität (und damit vergleichsweise schlechtesten Kompression) entspricht.Default: 100Picture.JPEGEncoding: Gibt an, wie die JPEG Bilder codiert werden sollenWert Bedeutung0 JPEG Bilder werden als (externe) Dateien gespeichert1 JPEG Bilder werden MimeEncoded innerhalb der XML Datei gespeichert2 JPEG Bilder werden gar nicht gespeichertDefault 0Picture.BitsPerPixel: Gibt die Farbtiefe der generierten Grafiken an. In der Regel reichenfür XML Export 256 Farben aus, man sollte beachten, dass bei einer höheren Farbtiefedie Grafikdateien sehr schnell sehr groß werden können.Wert Bedeutung1 Schwarz-Weiß4 16 Farben8 256 Farben24 24bit True Color32 32bit True ColorDefault 8Verbosity.Rectangle: Konfiguriert die Art und Weise, wie Rechteck-Objekte exportiertwerden sollen.Wert Bedeutung0 Objekt ignorieren1 Komplettinformation des Objekts2 Objekt als JPEGDefault 1Verbosity.Barcode: Konfiguriert die Art und Weise, wie Barcode-Objekte exportiertwerden sollen.WertBedeutung346


XML Export-ModulWert Bedeutung0 Objekt ignorieren1 Komplettinformation des Objekts inkl. als JPEGDefault 1Verbosity.Drawing: Konfiguriert die Art und Weise, wie Grafik-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Komplettinformation des Objekts inkl. als JPEGDefault 1Verbosity.Ellipse: Konfiguriert die Art und Weise, wie Ellipsen-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Komplettinformation des Objekts2 Objekt als JPEGDefault 1Verbosity.Line: Konfiguriert die Art und Weise, wie Linien-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Komplettinformation des Objekts2 Objekt als JPEGDefault 1Verbosity.Text: Konfiguriert die Art und Weise, wie Text-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als komplettes Textobjekt2 Objekt als JPEG347


Die Export-ModuleWertDefault 1BedeutungVerbosity.RTF: Konfiguriert die Art und Weise, wie RTF-Objekte exportiert werden sollen.Wert Bedeutung0 Objekt ignorieren1 als RTF-Stream2 als unformatierter Text3 Objekt als JPEGDefault 1Verbosity.Table: Konfiguriert die Art und Weise, wie Tabellen-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 als komplettes TabellenobjektDefault 1Verbosity.Table.Cell: Konfiguriert die Art und Weise, wie die Tabellen-Zellen exportiertwerden sollen.Wert Bedeutung0 Zellen ignorieren1 als komplettes Zellenobjekt (gemäß den Verbosity-Einstellungen der jeweiligenObjekttypen)2 Zellen als JPEGDefault 1Verbosity.LLXObject: Konfiguriert die Art und Weise, wie LLX-Objekte (z.B. HTML Objekt,Chart-Objekt) exportiert werden sollen.Wert Bedeutung0 Objekt ignorieren1 Komplettinformation des Objekts inkl. als JPEGDefault 1348


XML Export-ModulXML.Charset: Gibt den Zeichensatz an, der in die zu generierenden XML Seiten eingetragenwird und dem XML Parser die Interpretation des Seiteninhalts vorgibt. Wird nurberücksichtigt, wenn nicht das Unicode-Exportmodul verwendet wird, andernfalls ist dieCodierung fest auf UTF-16 voreingestellt.Wird im Nicht-Unicodefall durch die Anwendung kein Charset vorgegeben, dann wird erin Abhängigkeit von der eingestellten Codepage automatisch ermittelt. Folgende Tabelleliefert die Übersicht der automatischen Zuordnung von Codepage zu Charset:Wert Bedeutung1250 Charset wird auf ISO-8859-2 ("Latin-2") gesetzt.1251 Charset wird auf ISO-8859-5 ("Kyrillisch") gesetzt.1252 Charset wird auf ISO-8859-1 ("Latin-1") gesetzt.1253 Charset wird auf ISO-8859-7 ("Neugriechisch") gesetzt.1254 Charset wird auf ISO-8859-9 ("Latin-5, Türkisch") gesetzt.1255 Charset wird auf ISO-8859-8 ("Hebräisch") gesetzt.1256 Charset wird auf ISO-8859-6 ("Arabisch") gesetzt.1257 Charset wird auf ISO-8859-4 ("Latin-4") gesetzt.932 Charset wird auf ISO-2022-JP ("Japanisch") gesetzt.936 Charset wird auf GB2312 ("Chinesisch") gesetzt.Default Der in der aktiven LNG-Datei hinterlegte Default-Charset für die aktive Sprache.XML.Title: Spezifiziert den Titel des zu generierenden XML-Dokuments. Default: Titel,der bei LlPrintWithBoxStart() dem Druckjob übergeben wird.Export.Path: Definiert den Zielpfad für den Export. Ist er leer, so erfolgt in jedem Fall einZielpfad-Auswahldialog.Export.File: Gibt den Dateinamen für die erste zu generierende XML-Seite an. Default:"export.xml". Sie können im Dateinamen auch printf-Platzhalter wie z.B. "%08d" verwenden(z.B. "Export Seite %d.xml"). In diesem Falle werden die erste Seite und die Folgeseitendurch Ersetzung des Platzhalters durch die entsprechend formatierte Seitenzahlbenannt. Ansonsten erhalten die Seiten eine einfache Nummerierung.349


Die Export-ModuleExport.AllInOneFile: Konfiguriert das Export-Resultat.WertBedeutung0 Das Ergebnis sind n verschiedene XML-Dateien, für jede gedruckte Seiteeine XML-Datei. Die Dateinamen werden (außer der Export.File Startdatei)fortlaufend durchnummeriert. Enthält der Dateiname der Startdatei denFormatidentifier "%d", so wird dieser durch die jeweilige Seitenzahl ersetzt.1 Das Ergebnis ist eine einzige XML Datei (Export.File), in der alle gedrucktenSeiten aneinander hängen.Default 1Export.Quiet: Gibt an, ob der Exportvorgang mit Benutzerinteraktion durchgeführt werdensoll.Wert Bedeutung0 Interaktivität/Dialoge erlaubt1 Es erfolgt kein Zielpfad-Auswahldialog (sofern Export.Path gesetzt ist) undkeine "Überschreiben?" Rückfrage.Default 0Export.ShowResult: Spezifiziert, ob im Anschluss an den Export die mit der Dateiendungverknüpfte Anwendung automatisch gestartet werden soll.Wert Bedeutung0 Keine Anzeige des Ergebnisses1 Führt ein ShellExecute() auf Export.File aus, so dass üblicherweise ein Web-Browser gestartet wirdDefault 0Export.ShowResultAvailable: Hiermit kann die entsprechende Auswahlbox im Fileauswahldialogversteckt werden.Wert Bedeutung0 Auswahlbox versteckt1 Benutzerauswahl möglichDefault 1350


RTF Export-ModulExport. OnlyTableData: Ermöglicht, dass nur die Daten aus Tabellenzellen exportiertwerden.Wert Bedeutung0 Alle Objekte werden exportiert1 Nur Tabellenzellen werden mit Ihren Daten exportiertDefault 014.6. RTF Export-ModulDas RTF Export-Modul erzeugt Dokumente im Rich Text Format nach der SpezifikationVersion 1.5/1.7 von Microsoft. Die Export-Ergebnisse wurden in erster Linie für MicrosoftWord sowie Lotus Word Pro optimiert. Die Ergebnisse werden jedoch häufig von Textverarbeitungzu Textverarbeitung gewisse Unterschiede aufweisen.U.a. sind folgende Einschränkungen und Hinweise beim RTF Export-Modul zu beachten:• Es kann max. eine Farbtiefe von 24bit eingestellt werden.• Bei Rechteck-Objekten werden keine Schatten unterstützt.• Tabulatoren in Textobjekten werden durch Leerzeichen ersetzt.• Objekte sollten nicht zu nahe zum Randbereich einer Seite platziert werden. MancheTextverarbeitungen führen ansonsten vor diesen Objekten automatische Seitenumbrücheein. Diese Umbrüche bewirken dann, dass alle folgenden Objekteauch auf der nächsten Seite platziert werden.• Die Tabellen-Objekt Option "Separatoren Durchziehen" wird nicht unterstützt.• Die Tabellenoption "fixe Größe“ wird nicht unterstützt.• Nicht alle Hintergrundmuster die auch in <strong>List</strong> & <strong>Label</strong> eingestellt werden können,sind auch auf den RTF Text übertragbar, in RTF stehen weniger Muster zur Verfügung.• Das Chart- und HTML-Objekt werden als Bilder exportiert und können daher nichttransparent erscheinen.• gedrehte RTF-Objekte und Bilder werden nicht unterstützt.• Rahmen um Objekte werden nicht unterstützt.• Gradientenfüllungen werden nicht unterstützt.• Gedrehte Texte werden nicht unterstützt.351


Die Export-Module• Objekte die als Bild exportiert werden dürfen nicht aus ihrem Objektrahmen ragen.Daher müssen z.B. Barcodeobjekte mit fester Balkenbreite im Designer so gestaltetwerden, dass der Inhalt in jedem Fall im Objektrechteck Platz findet.• Selbst in einem Callback gezeichnete Ausgaben werden nicht exportiert.• Die Funktion TotalPages$() kann nicht in gedrehten Textobjekten verwendet werden.• Absatzabstände werden nicht unterstützt.Bekannte Besonderheiten allgemein:• Rahmen die kleiner als 1/2 Pt (ca. 0,4 mm in <strong>List</strong> & <strong>Label</strong>) sind, werden nicht richtigdargestellt.• Positionsrahmen werden mit Word97/Word2000 unüblich zu anderen Textverarbeitungenbehandelt. Trotz gleicher Kantenlänge kann es passieren, dass Kanten unterschiedlichlang erscheinen. Die Längenangaben bei Positionsrahmen werden alsofalsch interpretiert.• Bei schmalen Linienobjekten kann es passieren, dass diese scheinbar nicht sichtbarsind. Dieses Problem zeigt sich hauptsächlich bei horizontalen Linienobjekten. DerPositionsrahmen des Objektes wird zwar an der richtigen Position mit der richtigenGröße dargestellt, aber die enthaltene Bitmap bekommt einen Offset und liegt somitaußerhalb des sichtbaren Bereichs des Positionsrahmens.• ab Word 2000 und dessen Folgeversionen werden Tabellenrahmen nicht immerkorrekt dargestellt.• Abstände innerhalb von Zellen werden nicht unterstützt.• Einige mit <strong>List</strong> & <strong>Label</strong> darstellbare Farben können zwar exportiert, aber in Wordnicht eingestellt werden. Deshalb kann es sein, dass Word diese in eine andere Farbekonvertiert, z.B. Hellgelb wird zu Grau.14.6.1. Die ProgrammierschnittstelleNachfolgend finden Sie eine Beschreibung aller vom RTF Export-Modul unterstütztenOptionen. Diese Optionen können durch das Anwendungsprogramm über die FunktionLlXSetParameter(..."RTF"...) gesetzt und über LlXGetParameter(..."RTF"...) abgefragt werden.Resolution: Definiert die Auflösung in dpi für Koordinatenumrechnung und Grafikgenerierung.Default: 96dpi, Bildschirmauflösung.352


RTF Export-ModulPicture.BitsPerPixel: Gibt die Farbtiefe der generierten Grafiken an. In der Regel reichenfür RTF Export 256 Farben aus, man sollte beachten, dass bei einer höheren Farbtiefedie Grafikdateien sehr schnell sehr groß werden können.Wert Bedeutung1 Schwarz-Weiß4 16 Farben8 256 Farben24 24bit True ColorDefault 8UsePosFrame: Beeinflusst die Positionierung von Texten.Wert Bedeutung0 Es werden Textboxen zur Positionierung genutzt1 Es werden Positionsrahmen zur Positionierung genutztDefault 0Verbosity.Rectangle: Konfiguriert die Art und Weise, wie Rechteck-Objekte exportiertwerden sollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als PositionsrahmenDefault 1Verbosity.Barcode: Konfiguriert die Art und Weise, wie Barcode-Objekte exportiertwerden sollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als GrafikDefault 1Verbosity.Drawing: Konfiguriert die Art und Weise, wie Grafik-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als Grafik353


Die Export-ModuleWertDefault 1BedeutungVerbosity.Ellipse: Konfiguriert die Art und Weise, wie Ellipsen-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als Grafik2 Objekt als Shape-Objekt (ab Word 97)Default 2Verbosity.Line: Konfiguriert die Art und Weise, wie Linien-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als Grafik2 Objekt als Shape-Objekt (ab Word 97)Default 2Verbosity.Text: Konfiguriert die Art und Weise, wie Text-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als komplettes Textobjekt2 Objekt als GrafikDefault 1Verbosity.RTF: Konfiguriert die Art und Weise, wie RTF-Objekte exportiert werden sollen.Wert Bedeutung0 Objekt ignorieren1 als formatierter RTF-Text2 Objekt als GrafikDefault 1354


RTF Export-ModulVerbosity.Table: Konfiguriert die Art und Weise, wie Tabellen-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 als komplettes TabellenobjektDefault 1Verbosity.LLXObject: Konfiguriert die Art und Weise, wie LLX-Objekte (z.B. HTML Objekt,Chart-Objekt) exportiert werden sollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als GrafikDefault 1Export.Path: Definiert den Zielpfad für den Export.Export.File: Gibt den Dateinamen für das zu generierende RTF-Dokument an. Wenn leer, dann wird der Dateiauswahl-Dialog angezeigt.Export.Quiet: Gibt an, ob der Exportvorgang mit Benutzerinteraktion durchgeführt werdensoll.Wert Bedeutung0 Interaktivität/Dialoge erlaubt1 Es erfolgt keinen Dateiauswahl-Dialog (sofern Export.File gesetzt) und keine"Überschreiben?" Rückfrage.Default 0Export.ShowResult: Spezifiziert, ob im Anschluss an den Export, die mit der Dateiendungverknüpfte Anwendung automatisch gestartet werden soll.Wert Bedeutung0 Keine Anzeige des Ergebnisses1 Führt ein ShellExecute() auf Export.File aus, so dass üblicherweise eine Textverarbeitungo.ä. gestartet werden sollteDefault 0355


Die Export-ModuleExport.ShowResultAvailable: Hiermit kann die entsprechende Auswahlbox im Fileauswahldialogversteckt werden.Wert Bedeutung0 Auswahlbox versteckt1 Benutzerauswahl möglichDefault 114.7. PDF Export-ModulDas PDF-Exportmodul erzeugt Dokumente im Portable Document Format. Dieses Formatkann plattformunabhängig mit dem frei verfügbaren Adobe Acrobat Reader® angezeigtwerden.U.a. sind folgende Einschränkungen und Hinweise beim PDF Export-Modul zu beachten:• Derzeit (Stand 2007) werden nicht alle Unicode/Multibyte-Codepages unterstützt.Japanische und Chinesische Zeichen können aber meist – die entsprechenden AdobeFontPackages vorausgesetzt – ausgegeben werden. Wichtig hierbei ist, dass imDesigner der Charset des jeweiligen Textes auf den benötigten Wert gesetzt wird,d.h. es gibt keine automatische Unicode-Zeichen/Charset Konvertierung. In RTF-Textobjekten verwendete Right-to-Left-Zeichensätze werden u.U. nicht korrekt exportiert.• gedrehte fette/kursive TrueType-Schriftarten können evtl. eine abweichende Laufweitehaben• Fonts mit abweichender Laufweite werden nicht unterstützt• Linienenden werden immer mit runden Enden dargestellt• nicht alle EMF-Records können korrekt wiedergegeben werden – wenn Sie sehrkomplexe EMFs verwenden, sollten diese ggf. z.B. als Bitmap übergeben werdenbzw. im Designer die Option "Export als Bild" aktiviert werden14.7.1. Die ProgrammierschnittstelleNachfolgend finden Sie eine Beschreibung aller vom PDF Export-Modul unterstütztenOptionen. Diese Optionen können durch das Anwendungsprogramm über die FunktionLlXSetParameter(..."PDF"...) gesetzt und über LlXGetParameter(..."PDF"...) abgefragt werden.PDF.Title: Spezifiziert den Titel des zu generierenden PDF-Dokuments. Default: Titel,der bei LlPrintWithBoxStart() dem Druckjob übergeben wird.PDF.Subject: Spezifiziert das Thema des zu generierenden PDF-Dokuments. Default:leer.356


PDF Export-ModulPDF.Keywords: Spezifiziert die Stichwörter des zu generierenden PDF-Dokuments.Default: leer.PDF.Encryption.EncryptFile: Wenn dieser Parameter gesetzt ist, wird die Ergebnisdateiverschlüsselt. Dann stehen diverse weitere Optionen zur Verfügung, die im folgendenerläutert werden.Wert Bedeutung0 Datei nicht verschlüsseln1 Datei verschlüsselnDefault 0PDF.Encryption.EnablePrinting: Wenn dieser Parameter gesetzt ist, kann die Dateitrotz Verschlüsselung gedruckt werden. Nur wirksam, wenn PDF.Encryption.EncryptFileauf "1" gesetzt wird.Wert Bedeutung0 Drucken ist nicht möglich1 Drucken ist möglichDefault 0PDF.Encryption.EnableChanging: Wenn dieser Parameter gesetzt ist, kann die Dateitrotz Verschlüsselung bearbeitet werden. Nur wirksam, wennPDF.Encryption.EncryptFile auf "1" gesetzt wird.Wert Bedeutung0 Bearbeiten ist nicht möglich1 Bearbeiten ist möglichDefault 0PDF.Encryption.EnableCopying: Wenn dieser Parameter gesetzt ist, können Teile derDatei trotz Verschlüsselung in die Zwischenablage übernommen werden. Nur wirksam,wenn PDF.Encryption.EncryptFile auf "1" gesetzt wird.Wert Bedeutung0 Kopieren ist nicht möglich1 Kopieren ist möglichDefault 0357


Die Export-ModulePDF.Encryption.Level: Bestimmt die Verschlüsselungsstärke. Nur wirksam, wennPDF.Encryption.EncryptFile auf "1" gesetzt wird.Wert Bedeutung0 40 Bit Verschlüsselung1 128 Bit Verschlüsselung (benötigt Acrobat Reader ab Version 5)Default 0PDF.OwnerPassword: Das Besitzerpasswort für die verschlüsselte Datei. Dieses wirdbenötigt, um die Datei bearbeiten zu können. Wenn kein Passwort angegeben wird, wirddie Datei mit einem zufälligen Passwort verschlüsselt. Wir empfehlen, immer ein geeignetesPasswort explizit zu wählen.PDF.UserPassword: Das Benutzerpasswort für die verschlüsselte Datei. Dieses wirdbenötigt, um auf eine verschlüsselte Datei zugreifen zu können. Wenn kein Passwortangegeben wird, ist der Zugriff ohne Passwort möglich (evtl. mit Einschränkungen, s.o.).PDF.FontMode: Bestimmt, wie TrueType-Schriftarten behandelt werden.Wert Bedeutung0 Die TrueType-Schriftarten des Zielrechners werden - wenn vorhanden -verwendet bzw. durch den Fontmapper ersetzt. Es findet keine Einbettungstatt.1 Alle TrueType-Schriftarten werden eingebettet2 Symbol-TrueType-Schriftarten werden eingebettet3 Keine Einbettung von TrueType-Schriftarten. Es werden die Standard PostScript–Schriftarten verwendet.4 Subset-Einbettung: Es werden nur die Unterzeichen der TrueType-Schriftarten eingebettet, die in der eingestellten Codepage vorhanden sind.5 Subset-Einbettung: Es werden nur die Unterzeichen der TrueType-Schriftarten eingebettet, die tatsächlich verwendet werden.Default 5PDF.ExcludedFonts: Bestimmt, welche Schriftarten nicht eingebettet werden sollen.Einige Schriftarten (z.B. Arial, Courier) können identisch durch PostScript-Schriftartenersetzt werden. Durch diese Option können einzelne Schriftarten explizit von der Einbettungausgenommen werden. Bsp. "Arial;Courier;...". Default: "Arial".PDF.CompressStreamMethod: Bestimmt, inwieweit die Ergebnisdatei komprimiertwird..358


PDF Export-ModulWert Bedeutung0 Keine Kompression.1 Flate-Kompression2 Run-Length-Kompression3 FastFlate-KompressionDefault 1PDF.JPEGQuality: Bestimmt, die Kompressionsqualität von eingefügten Bildern. Sehrgute Qualität bedingt natürlich auch größere Dateien.Wert Bedeutung0 Minimale Dateigröße1 25% Qualität2 50% Qualität3 75% Qualität4 100% QualitätDefault 3Export.File: Gibt den Dateinamen für das zu generierende PDF-Dokument an. Wennleer, dann wird der Dateiauswahl-Dialog angezeigt.Export.Path: Gibt den Pfad für das zu generierende PDF-Dokument an.Export.Quiet: Gibt an, ob der Exportvorgang mit Benutzerinteraktion durchgeführt werdensoll.Wert Bedeutung0 Interaktivität/Dialoge erlaubt1 Es erfolgt keinen Dateiauswahl-Dialog (sofern Export.File gesetzt) und keine"Überschreiben?" Rückfrage.Default 0Export.ShowResult: Spezifiziert, ob im Anschluss an den Export, die mit der Dateiendungverknüpfte Anwendung automatisch gestartet werden soll.Wert Bedeutung0 Keine Anzeige des Ergebnisses1 Führt ein ShellExecute() auf Export.File aus, so dass üblicherweise der AcrobatReader® o.ä. gestartet werden sollte359


Die Export-ModuleWertDefault 0BedeutungExport.ShowResultAvailable: Hiermit kann die entsprechende Auswahlbox im Fileauswahldialogversteckt werden.Wert Bedeutung0 Auswahlbox versteckt1 Benutzerauswahl möglichDefault 114.8. Excel Export-ModulDas Excel-Exportmodul erzeugt Dokumente im Microsoft Excel® Format. Die Erzeugungläuft unabhängig von einer Installation dieses Produktes ab, es handelt sich alsoum eine native Unterstützung. Wahlweise kann ein voller layouterhaltender Exportdurchgeführt werden oder nur die Daten aus Tabellenobjekten unformatiert in die generierteDatei übernommen werden.U.a. sind folgende Einschränkungen und Hinweise beim Excel Export-Modul zu beachten:• Texte laufen unter Excel etwas höher als bei der Standardausgabe. Daher werdendie Schriftarten um einen einstellbaren Faktor skaliert. Diesen Faktor können Sieüber die Option XLS.FontScalingPercentage beeinflussen.• Die Druckfläche kann unter Excel nicht auf den nicht-bedruckbaren Rand ausgeweitetwerden, so dass die Projekte etwas breiter erscheinen. Dies kann durch einenZoom beim Druck (vgl. XLS.PrintingZoom) ausgeglichen werden.• RTF-Texte werden – bei entsprechend gesetzter Option - als JPEG-Dateien eingebettet.Dadurch wird der Exportvorgang sehr verlangsamt und die Dateien vergrößernsich rasch sehr stark. Wir empfehlen, weitestgehend auf die Verwendung vonRTF-Text zu verzichten, bzw. ggf. die Auflösung der Bilddateien (s.u.) zurückzusetzen.Defaultmässig werden RTF-Texte ohne Formatierung exportiert. (siehe Verbosity.RTF).• Tabulatoren in Textobjekten werden durch Leerzeichen ersetzt.• Die Tabellen-Objekt Option "Separatoren Durchziehen" wird nicht unterstützt.• Die Tabellenoption "fixe Größe“ wird nicht unterstützt.• Hintergrundmuster die in <strong>List</strong> & <strong>Label</strong> eingestellt werden können, werden nichtberücksichtigt. Es wird immer eine Vollfüllung vorgenommen.360


Excel Export-Modul• Das Chart- und HTML-Objekt werden als Bilder exportiert und können daher nichttransparent erscheinen.• Druckreihenfolge Linie/Rechteck wird nicht berücksichtigt; Linien erscheinen immerim Vordergrund. Dieses gilt auch für Rechteckrahmen.• Druckreihenfolge Text/Rechteck wird nicht berücksichtigt; Text erscheint immer imVordergrund.• Linien, die Textobjekte einschneiden werden unterbrochen.• Textobjekte, die nur halb in gefülltes Rechteck hineinlappen werden nicht teilgefüllt.• sich überlappende Text- bzw. Bildobjekte werden ignoriert.• Linien, die weder horizontal noch vertikal sind werden ignoriert.• Bildobjekte erhalten einen weißen Rahmen.• Große gefüllte Bereiche in Projekten mit vielen verschiedenen Koordinaten könnendie Arbeitsgeschwindigkeit beeinträchtigen.• Linienbreiten können nicht exportiert werden, Linien erscheinen immer mit Standardbreite.• Rechteckschatten können nicht exportiert werden.• wenn Koordinaten von verschiedenen Objekten sehr dicht beieinander liegen, abernicht identisch sind, können Rahmenlinien unsichtbar werden, da Excel diese nichtmehr darstellen kann.• gedrehte RTF-Objekte und Bilder werden nicht unterstützt.• um 180° gedrehte Texte werden nicht unterstützt und mit 0° Drehung dargestellt• Gradientenfüllungen werden nicht unterstützt.• Objekte die als Bild exportiert werden dürfen nicht aus ihrem Objektrahmen ragen.Daher müssen z.B. Barcodeobjekte mit fester Balkenbreite im Designer so gestaltetwerden, dass der Inhalt in jedem Fall im Objektrechteck Platz findet.• Selbst in einem Callback gezeichnete Ausgaben werden nicht exportiert.• Zeilen- und Absatzabstände werden nicht exportiert.14.8.1. Die ProgrammierschnittstelleNachfolgend finden Sie eine Beschreibung aller vom XLS Export-Modul unterstütztenOptionen. Diese Optionen können durch das Anwendungsprogramm über die FunktionLlXSetParameter(..."XLS"...) gesetzt und über LlXGetParameter(..."XLS"...) abgefragt werden.361


Die Export-ModuleResolution: Definiert die Auflösung in dpi für Grafikgenerierung. Default: 300dpi.Picture.BitsPerPixel: Gibt die Farbtiefe der generierten Grafiken an. In der Regel reichenfür XLS Export 256 Farben aus, man sollte beachten, dass bei einer höheren Farbtiefedie Grafikdateien sehr schnell sehr groß werden können.Wert Bedeutung1 Schwarz-Weiß4 16 Farben8 256 Farben24 24bit True ColorDefault 8Verbosity.Rectangle: Konfiguriert die Art und Weise, wie Rechteck-Objekte exportiertwerden sollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als Rechteck2 Objekt als GrafikDefault 1Verbosity.Barcode: Konfiguriert die Art und Weise, wie Barcode-Objekte exportiertwerden sollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als GrafikDefault 1Verbosity.Drawing: Konfiguriert die Art und Weise, wie Grafik-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als GrafikDefault 1362


Excel Export-ModulVerbosity.Ellipse: Konfiguriert die Art und Weise, wie Ellipsen-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als GrafikDefault 1Verbosity.Line: Konfiguriert die Art und Weise, wie Linien-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als Linie2 Objekt als GrafikDefault 1Verbosity.Text: Konfiguriert die Art und Weise, wie Text-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als Textobjekt2 Objekt als GrafikDefault 1Verbosity.RTF: Konfiguriert die Art und Weise, wie RTF-Objekte exportiert werden sollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als normaler Text ohne Formatierungen2 Objekt als GrafikDefault 1363


Die Export-ModuleVerbosity.Table: Konfiguriert die Art und Weise, wie Tabellen-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 als komplettes TabellenobjektDefault 1Verbosity.LlXObject: Konfiguriert die Art und Weise, wie LLX-Objekte (OLE, HTML,Chart) exportiert werden sollen.Wert Bedeutung0 Objekt ignorieren1 als GrafikDefault 1XLS.FontScalingPercentage: Skalierungsfaktor, um den Schriftgrößen korrigiert werden.Dies ist notwendig, weil die Texte unter Excel etwas höher laufen als bei Normalausgabe.Default: 89 (=89% Schriftgröße)XLS.PrintingZoom: Skalierungsfaktor, um den das Gesamtprojekt korrigiert wird. Dies istnotwendig, weil unter Excel immer der nichtbedruckbare Rand des Druckers freigehaltenwird. Default: 88 (=88% Zoom)XLS.Title: Spezifiziert den Titel des zu generierenden XLS-Dokuments. Default: Titel, derbei LlPrintWithBoxStart() dem Druckjob übergeben wird.XLS.IgnoreGroupLines: Erlaubt Gruppenkopf- und Fußzeilen zu ignorieren, wenn diesenicht in der resultierenden Exceldatei erscheinen sollen. Wirkt sich nur aus, wenn Export.OnlyTabledatagesetzt ist.Wert Bedeutung0 Gruppenzeilen werden exportiert1 Gruppenzeilen werden ignoriertDefault 1364


Excel Export-ModulXLS.IgnoreHeaderFooterLines: Erlaubt Kopf- und Fußzeilen zu ignorieren, wenn diesenicht in der resultierenden Textdatei erscheinen sollen. Wirkt sich nur aus, wenn Export.OnlyTabledatagesetzt ist.Wert Bedeutung0 Kopf- und Fußzeilen werden exportiert1 Kopf- und Fußzeilen werden ignoriertDefault 1XLS.IgnoreLinewrapForDataOnlyExport: Ermöglicht das ignorieren von Zeilenumbrüchen.Wirkt sich nur aus, wenn Export.OnlyTabledata gesetzt ist.Wert Bedeutung0 Zeilenumbrüche werden nach Excel übernommen1 Zeilenumbrüche werden ignoriertDefault 1XLS.ConvertNumeric: Hierüber kann die automatische Formatierung von Zahlenwertenin der erzeugten Excel-Datei ein- bzw. ausgeschaltet werden.Wert Bedeutung0 Es findet keine automatische Formatierung statt1 Zahlenwerte werden nach der Einstellung im Designer unter Projekt > Optionenformatiert2 Nur Spalten, die tatsächlich numerische Werte enthalten (also z.B. Preis)werden konvertiert. Wird eine numerische Spalte explizit innerhalb von <strong>List</strong> &<strong>Label</strong> formatiert (z.B. Str$(Preis,0,0)), so wird diese nicht konvertiert.Default 1XLS.AllPagesOneSheet: Erlaubt es, in der erzeugten Excel-Datei pro Seite ein eigenesWorksheet anzulegen.Wert Bedeutung0 Pro Seite wird ein eigenes Worksheet angelegt1 Alle Seiten werden im gleichen Worksheet erzeugtDefault 1365


Die Export-ModuleXLS.WorksheetName: Gibt den Namen für das bzw. die Worksheet(s) in der erzeugtenExcel-Datei an. Sie können im Namen den Format-Identifier "%d" verwenden, dieser wirdzur Laufzeit durch die Seitenzahl ersetzt (z.B. "Bericht Seite %d").Export.File: Gibt den Dateinamen für das zu generierende XLS-Dokument an. Wennleer, dann wird der Dateiauswahl-Dialog angezeigt.Export.Path: Gibt den Pfad für das zu generierende XLS-Dokument an.Export.Quiet: Gibt an, ob der Exportvorgang mit Benutzerinteraktion durchgeführt werdensoll.Wert Bedeutung0 Interaktivität/Dialoge erlaubt1 Es erfolgt keinen Dateiauswahl-Dialog (sofern Export.File gesetzt) und keine"Überschreiben?" Rückfrage.Default 0Export.ShowResult: Spezifiziert, ob im Anschluss an den Export, die mit der Dateiendungverknüpfte Anwendung automatisch gestartet werden soll.Wert Bedeutung0 Keine Anzeige des Ergebnisses1 Führt ein ShellExecute() auf Export.File aus, so dass üblicherweise MicrosoftExcel® o.ä. gestartet werden sollteDefault 0Export.ShowResultAvailable: Hiermit kann die entsprechende Auswahlbox im Fileauswahldialogversteckt werden.Wert Bedeutung0 Auswahlbox versteckt1 Benutzerauswahl möglichDefault 1Export.OnlyTableData: Ermöglicht, dass nur die Daten aus Tabellenzellen exportiertwerden.Wert Bedeutung0 Alle Objekte werden exportiert1 Nur Tabellenzellen werden mit Ihren Daten exportiertDefault 0366


XPS Export-Modul14.9. XPS Export-ModulDas XPS Exportformat ist verfügbar, sobald das .NET Framework 3.0 auf dem Rechnerinstalliert wurde. Das Exportmodul benutzt den dadurch installierten XPS Druckertreibervon Microsoft für die Ausgabe.Auch hier sind einige Einschränkungen zu beachten, u.a. unterstützt der Treiber derzeit(Stand 2007) nicht alle Clippingmöglichkeiten des Windows GDI. Dadurch kann es in derXPS-Datei zu Darstellungsfehlern beim Export von Charts und ganz allgemein abgeschnittenen/geclipptenObjekten kommen. Wir empfehlen Ihnen sicherheitshalber, dieXPS-Ausgabe vor der Auslieferung an Ihre Kunden sorgfältig zu prüfen.14.9.1.Die ProgrammierschnittstelleNachfolgend finden Sie eine Beschreibung aller vom XPS Export-Modul unterstütztenOptionen. Diese Optionen können durch das Anwendungsprogramm über die FunktionLlXSetParameter(..."XPS"...) gesetzt und über LlXGetParameter(..."XPS"...) abgefragt werden.Export.File: Gibt den Dateinamen für die zu generierende PRN-Datei an. Wenn leer,dann wird der Dateiauswahl-Dialog angezeigt.Export.Path: Gibt den Pfad für die zu generierende PRN-Datei an.Export.Quiet: Gibt an, ob der Exportvorgang mit Benutzerinteraktion durchgeführt werdensoll.Wert Bedeutung0 Interaktivität/Dialoge erlaubt1 Es erfolgt kein Zielpfad-Auswahldialog (sofern Export.Path gesetzt ist) undkeine "Überschreiben?" Rückfrage.Default 0Export.ShowResult: Spezifiziert, ob im Anschluss an den Export, die mit der Dateiendungverknüpfte Anwendung automatisch gestartet werden soll.Wert Bedeutung0 Keine Anzeige des Ergebnisses1 Führt ein ShellExecute() auf Export.File aus, so dass üblicherweise der XPS-Viewer gestartet werden sollteDefault 0367


Die Export-ModuleExport.ShowResultAvailable: Hiermit kann die entsprechende Auswahlbox im Fileauswahldialogversteckt werden.Wert Bedeutung0 Auswahlbox versteckt1 Benutzerauswahl möglichDefault 114.10. Text Export-ModulDas Text Export-Modul kann in zwei unterschiedlichen Modi verwendet werden (s. Export.OnlyTableData).Der reine Datenmodus liefert die Daten aus Tabellenobjekten ineinem Textformat zurück. Dabei können Eigenschaften wie Spalteneinrahmung undSpaltentrennung frei bestimmt werden. Einzelne Datensätze werden durch einen Zeilenumbruchgetrennt. Das Ergebnis ist eine einzelne Textdatei, die die Daten aus allenTabellenobjekten enthält. Diese kann dann zur Weiterverarbeitung in anderen Applikationenverwendet werden. Beachten Sie bitte, dass in diesem Modus nur Daten aus Tabellenexportiert werden und keinerlei Layout-Informationen ausgewertet werden. Diesbedeutet auch, dass z.B. layoutbedingte Umbrüche aus dem exportierten Text gefiltertwerden. Dieser Modus steht nur bei Tabellenprojekten zur Verfügung.Alternativ kann auch eine Textdatei erzeugt werden, die – soweit es das Format zulässt –die Formatierung des Originalprojektes widerspiegelt. Beachten Sie, dass die Schriftgrößeso gewählt sein sollte, dass die einzelnen Zeilen im Textexport noch aufgelöstwerden können. Zu kleine Schriftarten können zu überschriebenen Zeilen führen, d.h. esgehen Zeilen in der Ausgabedatei verloren.14.10.1. Die ProgrammierschnittstelleNachfolgend finden Sie eine Beschreibung aller vom Text Export-Modul unterstütztenOptionen. Diese Optionen können durch das Anwendungsprogramm über die FunktionLlXSetParameter(..."TXT"...) gesetzt und über LlXGetParameter(...TXT"...) abgefragt werden.Die Verbosity-Einstellungen beziehen sich nur auf den Datenmodus (s. Einführung)Verbosity.Text: Konfiguriert die Art und Weise, wie Text-Objekte in Tabellenspaltenexportiert werden sollen.Wert Bedeutung0 Objekt ignorieren1 Objekt als komplettes TextobjektDefault 1368


Text Export-ModulVerbosity.RTF: Konfiguriert die Art und Weise, wie RTF-Objekte in Tabellenspalten exportiertwerden sollen.Wert Bedeutung0 Objekt ignorieren1 als RTF-Stream2 als unformatierter TextDefault 2Verbosity.Table: Konfiguriert die Art und Weise, wie Tabellen-Objekte exportiert werdensollen.Wert Bedeutung0 Objekt ignorieren1 Als komplettes TabellenobjektDefault 1Verbosity.Table.Cell: Konfiguriert die Art und Weise, wie die Tabellen-Zellen exportiertwerden sollen.Wert Bedeutung0 Zellen ignorieren1 Als komplettes Zellenobjekt (gemäß den Verbosity-Einstellungen der jeweiligenObjekttypen)Default 1Export.Path: Definiert den Zielpfad für den Export. Ist er leer, so erfolgt in jedem Fall einZielpfad-Auswahldialog.Export.File: Gibt den Dateinamen an. Default: "export.txt"Export.Quiet: Gibt an, ob der Exportvorgang mit Benutzerinteraktion durchgeführt werdensoll.Wert Bedeutung0 Interaktivität/Dialoge erlaubt1 Es erfolgt kein Zielpfad-Auswahldialog (sofern Export.Path gesetzt ist) undkeine "Überschreiben?" Rückfrage.Default 0369


Die Export-ModuleExport.ShowResult: Spezifiziert, ob im Anschluss an den Export die mit der Dateiendungverknüpfte Anwendung automatisch gestartet werden soll.Wert Bedeutung0 Keine Anzeige des Ergebnisses1 Führt ein ShellExecute() auf Export.File aus, so dass üblicherweise ein Text-Editor gestartet wirdDefault 0Export.ShowResultAvailable: Hiermit kann die entsprechende Auswahlbox im Fileauswahldialogversteckt werden.Wert Bedeutung0 Auswahlbox versteckt1 Benutzerauswahl möglichDefault 1Export.OnlyTableData: Ermöglicht, dass nur die Daten aus Tabellenzellen exportiertwerden.Wert Bedeutung0 Alle Objekte werden exportiert1 Nur Tabellenzellen werden mit Ihren Daten exportiert ("Datenmodus")Default 1Export.AllInOneFile: Konfiguriert das Export-Resultat. Diese Einstellung ist im Datenmodusnicht aktiv (s. Export.OnlyTableData).Wert Bedeutung0 Das Ergebnis sind n verschiedene TXT-Dateien, für jede gedruckte Seiteeine. Die Dateinamen werden (außer der Export.File Startdatei) fortlaufenddurchnummeriert. Enthält der Dateiname der Startdatei den Formatidentifier"%d", so wird dieser durch die jeweilige Seitenzahl ersetzt.1 Das Ergebnis ist eine einzige TXT Datei (Export.File), in der alle gedrucktenSeiten aneinander hängen.Default 1370


Text Export-ModulTXT.FrameChar: Diese Zeichenkette spezifiziert das Spalteneinrahmungszeichen. DieseEinstellung ist nur im Datenmodus (s. Export.OnlyTableData) aktiv.Wert BedeutungNONE Keine Spalteneinrahmung" " als Spalteneinrahmung' ' als SpalteneinrahmungTXT.SeparatorChar: Diese Zeichenkette spezifiziert das Spaltentrennzeichen. DieseEinstellung ist nur im Datenmodus (s. Export.OnlyTableData) aktiv.Wert BedeutungNONE Keine SpaltentrennungTAB Tabulator als SpaltentrennungBLANK Leerzeichen als Spaltentrennung, , als Spalteneintrennung; ; als SpaltentrennungTXT.IgnoreGroupLines: Erlaubt Gruppenkopf- und Fußzeilen zu ignorieren, wenn diesenicht in der resultierenden Textdatei erscheinen sollen. Diese Einstellung ist nur im Datenmodus(s. Export.OnlyTableData) aktiv.Wert Bedeutung0 Gruppenzeilen werden exportiert1 Gruppenzeilen werden ignoriertDefault 1TXT.IgnoreHeaderFooterLines: Erlaubt Kopf- und Fußzeilen zu ignorieren, wenn diesenicht in der resultierenden Textdatei erscheinen sollen. Diese Einstellung ist nur im Datenmodus(s. Export.OnlyTableData) aktiv.Wert Bedeutung0 Kopf- und Fußzeilen werden exportiert1 Kopf- und Fußzeilen werden ignoriertDefault 1371


Die Export-ModuleTXT.Charset: Bestimmt den Zeichensatz der Ergebnisdatei. Wenn Export.OnlyTableDataden Wert 1 hat, muss zusätzlich die Codepage (z.B. 932 für Japanisch) perLL_OPTION_CODEPAGE gesetzt werden.WertANSIASCIIUNICODEDefaultBedeutungAnsi-ZeichensatzAscii-ZeichensatzUnicode-ZeichensatzANSI14.11. TTY Export-ModulDas TTY-Exportformat kann verwendet werden, um z.B. mit Nadeldruckern direkt zukommunizieren. Die Umgehung des Windows-Treibers bringt große Performance-Vorteile mit sich, was gerade im Etikettendruck bei großen Stückzahlen wichtig ist.14.11.1.Die ProgrammierschnittstelleNachfolgend finden Sie eine Beschreibung aller vom TTY Export-Modul unterstütztenOptionen. Diese Optionen können durch das Anwendungsprogramm über die FunktionLlXSetParameter(..."TTY"...) gesetzt und über LlXGetParameter(..."TTY"...) abgefragt werden.Export.File: Gibt den Dateinamen für die zu generierende PRN-Datei an. Wenn leer,dann wird der Dateiauswahl-Dialog angezeigt.Export.Path: Gibt den Pfad für die zu generierende PRN-Datei an.Export.Quiet: Gibt an, ob der Exportvorgang mit Benutzerinteraktion durchgeführt werdensoll.Wert Bedeutung0 Interaktivität/Dialoge erlaubt1 Es erfolgt kein Zielpfad-Auswahldialog (sofern Export.Path gesetzt ist) undkeine "Überschreiben?" Rückfrage.Default 0372


Grafik Export-ModulTTY.AdvanceAfterPrint: Bestimmt das Vorschub-Verhalten nach Druckende.WertFormFeedToNext<strong>Label</strong>AfterNext<strong>Label</strong>BedeutungSeitenvorschub nach AusgabeVorschub auf Anfang des nächsten EtikettsVorschub auf Anfang des übernächsten Etiketts (ein leeres Etikettals "Abtrennbereich")TTY.Emulation: Bezeichnet die Emulation, die für den Export verwendet wird.Wert BedeutungESC/P ESC/P-EmulationESC/P 9Pin ESC/P-Emulation für 9-NadeldruckerTTY.Destination: Ziel für den Export. Mögliche Werte sind z.B. "LPT1:", "LPT2:",..."FILE:"bzw. "FILE:". Wenn "FILE:" verwendet wird, bekommt der Benutzer einenDateiauswahl-Dialog angezeigt.TTY.DefaultFilename: Vorschlagsname für diesen Dialog14.12. Grafik Export-ModulDas Grafik Export-Modul erzeugt für jede gedruckte Seite eine JPEG-, BMP-, EMF- oderTIFF Grafikdatei, welche die komplette Seite enthält bzw. eine Multi-TIFF-Datei. Die Dateinamenwerden dabei fortlaufend durchnummeriert. Enthält der Dateiname der Startdateiden Formatidentifier "%d", so wird dieser durch die jeweilige Seitenzahl ersetzt.14.12.1.Die ProgrammierschnittstelleNachfolgend finden Sie eine Beschreibung aller vom Grafik Export-Modul unterstütztenOptionen. Diese Optionen können durch das Anwendungsprogramm über die FunktionLlXSetParameter(...""...) gesetzt und über LlXGet-Parameter(...""...) abgefragt werden. istentweder "PICTURE_JPEG", "PICTURE_BMP", "PICTURE_EMF", "PICTURE_TIFF" oder"PICTURE_MULTITIFF", je nach Zielformat.Resolution: Definiert die Auflösung in dpi für die Grafikgenerierung. Default: 96dpi,Bildschirmauflösung.Picture.JPEGQuality: Spezifiziert die Qualität und den damit abhängigen Kompressionsfaktorder generierten JPEG Grafiken. Der Wert liegt zwischen 0..100, wobei 100 der373


Die Export-Modulehöchsten JPEG Qualität (und damit vergleichsweise schlechtesten Kompression) entspricht.Default: 100Picture.BitsPerPixel: Gibt die Farbtiefe der generierten Grafiken an. In der Regel reichen256 Farben aus, man sollte beachten, dass bei einer höheren Farbtiefe die Grafikdateiensehr schnell sehr groß werden können.Wert Bedeutung1 Schwarz-Weiß4 16 Farben8 256 Farben24 24bit True Color32 32bit True ColorDefault 8Export.Path: Definiert den Zielpfad für den Export. Ist er leer, so erfolgt in jedem Fall einZielpfad-Auswahldialog.Export.File: Gibt den Dateinamen für die Dateien an. Wenn die Option gesetzt ist, müssenSie im Dateinamen printf-Platzhalter wie z.B. "%08d" verwenden (z.B. "Export Seite%d.htm"). In diesem Falle werden die erste Seite und die Folgeseiten durch Ersetzungdes Platzhalters durch die entsprechend formatierte Seitenzahl benannt. Ansonstenerhalten die Seiten eine einfache Nummerierung.Export.Quiet: Gibt an, ob der Exportvorgang mit Benutzerinteraktion durchgeführt werdensoll.Wert Bedeutung0 Interaktivität/Dialoge erlaubt1 Es erfolgt kein Zielpfad-Auswahldialog (sofern Export.Path gesetzt) und keine"Überschreiben?" Rückfrage.Default 0Export.ShowResult: Spezifiziert, ob im Anschluss an den Export, die mit der Dateiendungverknüpfte Anwendung automatisch gestartet werden soll.Wert Bedeutung0 Keine Anzeige des Ergebnisses1 Führt ein ShellExecute() auf die erste generierte Bilddatei aus, so dass üblicherweiseein Bildbearbeitungsprogramm o.ä. gestartet wirdDefault 0374


Fax Export-ModulExport.ShowResultAvailable: Hiermit kann die entsprechende Auswahlbox im Fileauswahldialogversteckt werden.Wert Bedeutung0 Auswahlbox versteckt1 Benutzerauswahl möglichDefault 1TIFF.CompressionType: Legt den Kompressionstyp für die erzeugte TIFF-Datei fest.Beachten Sie, dass nicht alle Viewer Kompression unterstützen.WertNoneCCITTRLECCITT3CCITT4JPEGZIPDefault:BedeutungKeine KompressionCCITT Modified Huffmann RLECCITT Group 3 Fax CodierungCCITT Group 4 Fax CodierungJPEG DCT KompressionZIP KompressionNoneTIFF.CompressionQuality: Legt die Kompressionsqualität für die erzeugte TIFF-Dateifest. Wertebereich 0...100. Default: 7514.13. Fax Export-ModulSie können über dieses Exportmodul <strong>List</strong> & <strong>Label</strong> Dokumente direkt als Fax über denWindows Faxdienst verschicken. Der entsprechende Druckertreiber wird (unter Windows2000, XP und einigen Vista-Editionen) dann automatisch eingerichtet, wenn Sie einfaxtaugliches Modem an Ihrem Rechner installiert haben. Beim Versenden eines Faxeswerden aber zusätzliche Informationen gebraucht, um das Fax adressieren zu können.Über LL_OPTIONSTR_FAX... können Sie diese aus Ihrer Applikation heraus vorgeben (s.LlSetOptionString()).Beispiel:HLLJOB hJob;hJob = LlJobOpen(0);LlSetOptionString(hJob, LL_OPTIONSTR_FAX_RECIPNAME,"<strong>combit</strong>");375


Die Export-ModuleLlSetOptionString(hJob, L_OPTIONSTR_FAX_RECIPNUMBER,"+497531906018");LlSetOptionString(hJob, LL_OPTIONSTR_FAX_SENDERNAME,"Max Mustermann");LlSetOptionString(hJob, LL_OPTIONSTR_FAX_SENDERCOMPANY,"Sunshine <strong>GmbH</strong>");LlSetOptionString(hJob, LL_OPTIONSTR_FAX_SENDERDEPT,"Development");LlSetOptionString(hJob, LL_OPTIONSTR_FAX_SENDERBILLINGCODE,"4711");// ...LlJobClose(hJob);Wenn die Optionen nicht gesetzt werden und der Benutzer im Projekt keine Einstellungengewählt hat, steht das Fax Export-Modul nicht zur Verfügung.Dieses Exportmodul bietet Ihnen keine weitergehende Programmierschnittstelle.Viele herkömmliche Faxprogramme können von <strong>List</strong> & <strong>Label</strong> aus auch direkt über denzugehörigen Druck(/Fax)-Treiber angesprochen werden. Sofern das entsprechende FaxprogrammMöglichkeiten vorsieht, dass die Faxnummer über das Dokument übergebenwird, kann in den meisten Fällen somit auch der Nummerneingabedialog unterdrücktwerden. Um z.B. David der Firma Tobit anzusprechen, können Sie die sog. @@-Befehleverwenden. Platzieren Sie ein Textobjekt im Designer und fügen Sie die Zeile"@@NUMMER "++"@@"als Inhalt ein. Der Faxtreiber erkennt diese Syntax und versendet den Druckauftrag ohneweitere Benutzerinteraktion an die angegebene Faxnummer. Andere Faxprogrammebieten ähnliche Möglichkeiten – wir empfehlen Ihnen einen Blick in die DokumentationIhres Faxprogrammes.14.14. Exportdateien digital signierenIn Zusammenarbeit mit den Signaturprodukten digiSeal® office der secrypt <strong>GmbH</strong> oderOPENLiMiT® SignCubes Software mit Lizenzschlüsseln der e•siqia Holding AG ist esmöglich, mit <strong>List</strong> & <strong>Label</strong> erstellte Exportdateien für die Formate PDF, TXT (wenn dieOption "Export.AllInOneFile" gesetzt ist) und Multi-TIFF digital zu signieren. Sie benötigendafür neben der Software einen Kartenleser und eine Karte mit einem digitalenZertifikat. Details zur Hard- und Software finden Sie in der Dokumentation zum jeweiligenSignaturprovider (digiSeal® office oder OPENLiMiT® SignCubes Software).Im Lieferumfang von digiSeal® office findet sich die digiSealAPI.dll, welche zusätzlichausgeliefert werden muß (mindestens Windows NT wird voraussetzt).376


Exportdateien digital signierenFür OPENLiMiT® SignCubes Software wird eine Koppel-DLL benötigt, welche ebenfallsnicht im Lieferumfang von <strong>List</strong> & <strong>Label</strong> enthalten ist. Die benötigte DLL wird von dere•siqia Holding AG zur Verfügung gestellt.14.14.1. Signaturvorgang startenAktivieren Sie die Checkbox "Exportdateien digital signieren" im Auswahldialog für dasExportziel. Beachten Sie, dass Ihnen diese nur dann zur Verfügung steht, wenn Sie auchdie benötigte Signatursoftware installiert haben.Nach Erstellung der Ergebnisdatei wird der Signaturvorgang wie gewohnt gestartet.Bitte beachten Sie, dass sich durch die Signatur die Dateiendung der Ergebnisdateiändern kann. Wenn der Signaturvorgang abgebrochen wird oder nicht erfolgreich durchgeführtwerden kann, wird der Export (ggf. nach einer Anzeige des Fehlergrundes) ohnedigitale Signatur fortgesetzt.Aus rechtlichen Gründen ist eine Signatur im "Quiet"-Mode nicht möglich, d.h. es mussimmer die PIN interaktiv eingegeben werden!14.14.2. ProgrammierschnittstelleDer Signaturvorgang kann über eine Reihe von Parametern gesteuert werden.Export.SignResult: Aktiviert die digitale Signatur der Exportdateien. Diese Option entsprichtder Checkbox für den Endanwender "Exportdateien digital signieren". Der Wertwird nur dann ausgewertet, wenn eines der unterstützten Produkte auf dem Zielrechnerinstalliert ist.Wert Bedeutung0 Es erfolgt keine Signatur1 Die Exportdateien werden digital signiertDefault 1Export.SignResultAvailable: Hiermit kann die entsprechende Auswahlbox im Dateiauswahl-Dialogversteckt werden.Wert Bedeutung0 Auswahlbox versteckt1 Benutzerauswahl möglichDefault 1377


Die Export-ModuleExport.SignatureProvider: Hiermit kann die gewünschte Software für die digitale Signaturausgewählt werden, falls mehrere Produkte auf einem System installiert sind.WertBedeutung0 Default, d.h. keine explizite Auswahl des Produkts1 Signatur über secrypt digiSeal® office2 Signatur über OPENLiMiT® SignCubes SoftwareDefault 0Export.SignatureFormat: Hiermit kann das Signaturformat gewählt werden. Die verfügbarenWerte hängen vom Exportformat ab:Wertpk7p7sp7mPDFDefaultBedeutungSignatur im pk7-Format (Containerformat, das den Signaturgegenstand unddie Signatur in einer Datei kapselt). Verfügbar für Multi-TIFF, TXT und PDF(letzteres nur für SignCubes). Die Ergebnisdatei hat nach der Signatur dieEndung "pk7".Signatur im p7s-Format. Dabei wird neben der Exportdatei eine zweite Datei*.p7s erstellt, die die Signatur enthält. Verfügbar für Multi-TIFF, TXT und PDF(letzteres nur für SignCubes). Bei einem Mailversand des Exportergebnisseswerden beide Dateien angehängt.Signatur im p7m-Format (Containerformat, das den Signaturgegenstand unddie Signatur in einer Datei kapselt). Verfügbar für Multi-TIFF, TXT und PDF(letzteres nur für SignCubes). Die Ergebnisdatei hat nach der Signatur dieEndung "p7m".PDF-Signatur. Verfügbar für PDF und Multi-TIFF (nur für digiSeal® office undSchwarz-Weiss-TIFFs). Ein Multi-TIFF wird hierbei in eine PDF-Datei überführtund mit einem speziellen Barcode signiert, der eine Prüfung des Dokumentsauch nach dem Ausdruck erlaubt.p7s für TXT und Multi-TIFF, PDF für PDF14.15. Exportdateien per eMail verschickenDie durch einen Exportvorgang generierten Dateien können automatisch per eMail mitüber die MAPI Schnittstelle, über Extended MAPI oder auch direkt SMTP verschicktwerden. Diese Funktion steht für alle Export-Module zur Verfügung.14.15.1. eMail Parameter per Programm setzenAnalog zu den übrigen Export-Optionen können auch die Parameter für das Verschickenper eMail gesetzt werden. Im Dialog unter Projekt > Einstellungen können vom Benutzer378


Exportdateien per eMail verschickenbereits einige Vorgaben gemacht werden, die automatisch berücksichtigt werden. WeitereInformationen hierzu finden Sie im Kapitel "Projekt-Parameter". Einige weitere Optionenkönnen Sie über LlXSetParameter(...""...) / LlXGet-Parameter(...""...) setzen bzw. auslesen. Bitte beachten Sie, dass auch ein Leerstring sein darf. In diesem Falle werden die Optionenan alle Exportmodule weitergereicht.Export.SendAsMail: Aktiviert das Versenden der Exportdateien per eMail. Diese Optionentspricht der Checkbox für den Endanwender "Exportdateien per eMail versenden".Wert Bedeutung0 Es erfolgt kein eMailversand1 Die Exportdateien werden per eMail verschicktDefault 0Export.SendAsMailAvailable: Hiermit kann die entsprechende Auswahlbox im Dateiauswahl-Dialogversteckt werden.Wert Bedeutung0 Auswahlbox versteckt1 Benutzerauswahl möglichDefault 1Export.Mail.Provider: Mit dieser Option kann der eMail-Provider für den Versand bestimmtwerden. Für alle Versandarten außer Simple MAPI wird hierfür die DateiCMMX02.DLL benötigt.WertSMAPIXMAPISMTPMSMAPIDefaultBedeutungSimple MAPIExtended MAPISMTPSystem-MAPI (Default MAPI-Client wird verwendet)Der Default-Wert bestimmt sich aus den Systemeinstellungen bzw. denapplikationsspezifischen Einstellungen (s.u.)Wenn die DLL nicht gefunden werden kann, wird die eMail per Simple MAPI (MSSMAPI)versandt.Der Provider wird bestimmt, indem Sie entweder explizit die Option "Export.Mail.Provider"auf einen der obigen Typen setzen, oder indem Sie den Benutzerüber LsMailConfigurationDialog() diese selbst bestimmen lassen.379


Die Export-ModuleBeim Versand wird erst versucht, die unter dem Applikationsnamen in der Registry gespeichertenParameter zu finden, ansonsten werden globale Einstellungen verwendet.Diese können über das Systemsteuerungs-Applet (CMMX02.CPL) oder über LsMailConfigurationDialog()vorgenommen werden.Export.Mail.Body: Nachrichtentext der eMail.Export.Mail.Attachment<strong>List</strong>: Ggf. neben dem Exportergebnis zusätzlich anzuhängendeDateien, durch Tabulator ("\t", ASCII-Code 9) getrennt.Export.Mail.ShowDialog: Gibt an, ob ein eMaildialog angezeigt werden soll.Wert Bedeutung0 Die eMail wird direkt verschickt, ohne weitere Benutzer-Interaktion (mindestensein Empfänger muss angegeben sein)1 Es wird der entsprechend den anderen eMail-Optionen bereits ausgefüllteMAPI Standard-eMaildialog angezeigt, der Benutzer muss das Versendenüber den Dialog selbst auslösenDefault 0 (wenn Empfänger nicht leer ist, sonst 1)Export.Mail.SendResultAs: Über diese Option können Sie beim HTML-Export bestimmen,dass das Exportresultat in den HTML-Text der eMail übernommen wird.Werttext/htmlSonst/LeerDefaultBedeutungWenn SMTP als Versandprovider eingestellt wurde, wird das Exportresultatals HTML-Text der eMail verwendet. Wenn ein anderer Versandprovidergewählt wurde, wird diese Option ignoriert und das Exportergebnis alsDateianhang versendet.Das Exportergebnis wird als Dateianhang versendet.LeerSpeziell beim Versand per SMTP stehen noch weitere Optionen zur Verfügung. Diesebrauchen in der Regel nicht explizit gesetzt werden, sondern können per Dialog applikationsspezifisch(s. LsMailConfigurationDialog()) bzw. global mit Hilfe des Systemsteuerungs-Appletsvom Benutzer gewählt werden.Export.Mail.SMTP.ServerTimeout: Socket-Timeout, in MillisekundenExport.Mail.SMTP.ServerAddress: IP-Adresse oder URL des SMTP-ServersExport.Mail.SMTP.ServerPort: Port des SMTP-ServersExport.Mail.SMTP.User: Benutzerkennung für die Authentifizierung am SMTP-Server(falls nötig)380


Exportdateien per eMail verschickenExport.Mail.SMTP.Password: Passwort für die Authentifizierung am SMTP-Server (fallsnötig)Export.Mail.SMTP.ProxyType: Typ des Proxy (0=keiner, 1=Socks4, 2=Socks5)Export.Mail.SMTP.ProxyAddress: IP-Adresse oder URL des ProxyExport.Mail.SMTP.ProxyPort: Port des ProxyExport.Mail.SMTP.ProxyUser: Benutzerkennung für die Authentifizierung am Proxy (nurSocks5)Export.Mail.SMTP.ProxyPassword: Passwort für die Authentifizierung am Proxy (nurSocks5)Export.Mail.SMTP.SenderAddress: Adresse des eMailversenders (xyz@abc.def) – wirdauch für das SMTP-Protokoll verwendetExport.Mail.SMTP.SenderName: Klartext-Name des eMailabsendersExport.Mail.SMTP.ReplyTo: Rücksendeadresse (optional)Export.Mail.SMTP.From: ersetzt die Absendeadresse (aus "Export.Mail.SMTP.Sender-Name" und "Export.Mail.SMTP.SenderAddress" gebildet) in der eMail durch diesen Parameter."Export.Mail.SMTP.SenderAddress" wird aber weiterhin für das SMTP-Protokollverwendet.Beispiel:LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_EXPORT, "", "Export.SendAsMail","1");Dadurch wird das Exportergebnis automatisch per eMail an den unter Projekt > Einstellungengewählten Empfänger versendet. Dafür werden die global vorgenommeneneMaileinstellungen verwendet. Wenn Sie dem Benutzer einen Wert vorgeben möchten,so können Sie diesen z.B. überLlSetDefaultProjectParameter(hJob,"LL.Mail.To", "EMAIL", 0);vorgeben, wenn Ihr Datenbankfeld mit der eMail-Adresse den Namen EMAIL trägt. WollenSie eine konkrete Adresse vorgeben, so beachten Sie bitte, dass Sie diese mit doppeltenAnführungszeichen umgeben müssen, da der an <strong>List</strong> & <strong>Label</strong> übergebene Wertals Formel interpretiert wird:LlSetDefaultProjectParameter(hJob,"LL.Mail.To", "'abc@xyz.de'", 0);381


Die Export-Module14.16. Exportdateien in ZIP-Archiv komprimierenSollen z.B. die Ergebnisse eines Bild- oder HTML-Exports per Mail verschickt werden, soist es häufig praktischer, das gesamte Ergebnis des Exports als ZIP-Archiv zu versenden.Alle Exportformate unterstützen eine Programmierschnittstelle zu diesem Zweck. DieKompression kann entweder interaktiv durch den Benutzer im Dialog aktiviert werden,indem er aus der <strong>List</strong>e der verfügbaren Dateifilter den Filter "ZIP-Archiv (*.zip)" auswählt.Alternativ kann die Ausgabe natürlich auch vollständig per Code gesteuert werden. FolgendeOptionen stehen zur Verfügung:Export.SaveAsZIP: Aktiviert das Komprimieren der Exportdateien. Wenn diese Optiongesetzt ist, wird der ZIP-Filter im Dialog vorausgewählt.Wert Bedeutung0 Es erfolgt keine Kompression1 Die Exportdateien werden in ein ZIP-Archiv komprimiertDefault 0Beachten Sie, dass der Benutzer die hier voreingestellte Auswahl im Dialog wieder verändernkann. Wenn Sie dies nicht wünschen, setzen Sie die Option "Export.Quiet" auf"1".Export.SaveAsZIPAvailable: Hiermit kann der ZIP-Archiv-Filter im Dateiauswahl-Dialogversteckt werden.Wert Bedeutung0 Filter versteckt1 Benutzerauswahl möglichDefault 1Export.ZIPFile: (Default-)Name der zu erstellenden ZIP-Datei, z.B. "export.zip". Für denNamen der Dateien im ZIP-Archiv gelten folgende Regeln:• wenn per "Export.File" kein Name vorgegeben wurde, wird der Name des ZIP-Archivs mit angepasster Endung verwendet (z.B. "export.htm")• wenn per "Export.File" ein Name vergeben wurde, so wird dieser verwendet. Dabeikann bei den Formaten, die pro Seite eine eigene Datei erzeugen, auch der Platzhalter"%d" für die Seitenzahl verwendet werden, z.B. "Rechnung Seite %d.bmp" imBitmapexporterExport.ZIPPath: Pfad der zu erstellenden ZIP-Datei382


Übersicht15. Das Viewer-OCX-Control15.1. ÜbersichtDas Control CMLL13V.OCX kann dazu verwendet werden, <strong>List</strong> & <strong>Label</strong>-Preview-Dateienanzusehen und zu drucken.Eingefügt werden kann es z.B.• in eigenen Projekten• auf einer Internet-SeiteBeim Druck werden die Preview-Dateien so gedruckt, dass sie optimal auf die Drucker-Seite eingepasst werden. Dabei werden die Eigenschaften wie "physikalische Seite" unddas Breiten-Höhen-Verhältnis beachtet, um ein möglichst genaues Abbild des Originalsauch auf anderen Druckern zu erzeugen.Wenn statt eines Dateinamens eine Internet-URL angegeben wird, lädt das Control diesetemporär auf die Festplatte (in den Internet-Cache) und zeigt sie dann an (sofern eineregistrierte URLMON.DLL auf dem System vorhanden ist, s.u.).15.2. RegistrierungDas OCX-Control können Sie auf dem üblichen Weg mit "REGSVR32 CMLL13V.OCX"registrieren oder über Ihre Entwicklungsumgebung anmelden. Vor der Registrierungmüssen die abhängigen Module registriert worden sein.Oft wird die Registrierung auch über Ihr SETUP-Programm vorgenommen.15.3. EigenschaftenAsyncDownload [in, out] BOOL: Gibt an, ob ein eventueller (Internet-) Download asynchrondurchgeführt wird oder nicht. Ein asynchroner Download hat den Vorteil, dass dasProgramm die Seite mit dem OCX-Control schon anzeigen kann, allerdings muss danndarauf geachtet werden, dass direkte Befehle an das Control (GotoFirst etc.) nicht sofortnach der URL-Zuweisung gesendet werden können (siehe Event LoadFinished). DieEinstellung wirkt sich nicht auf lokale Dateien aus. Voreinstellung: TRUEEnabled [in, out] BOOL: Gibt an, ob das Control enabled oder disabled ist. Dies wirktsich auf die Benutzerschnittstelle aus, die dann keine Aktionen zulässt. Voreinstellung:TRUEBackColor [in, out] OLE_COLOR: Hintergrundfarbe, das ist die Farbe, die• den gesamten Hintergrund einnimmt, wenn das Control im Design-State ist oder diePreview-Datei nicht gefunden wird383


Das Viewer-OCX-Control• den Hintergrund einnimmt, der außerhalb des Papiers angezeigt wird.Voreinstellung: COLOR_BTNFACE [Systemfarbe: Dialoghintergrund]FileURL [in, out] BSTR: Diese Eigenschaft ist der Name der anzuzeigenden Preview-Datei. Dies kann entweder ein Dateiname oder eine URL sein. Voreinstellung: Pages [out] LONG Die Gesamtanzahl der in der Preview-Datei enthaltenen Seiten.CurrentPage [in, out] LONG: Hierüber kann die anzuzeigende Seite gesetzt oder abgefragtwerden. Voreinstellung: 1ToolbarEnabled [in, out] BOOL: Gibt an, ob die Toolbar angezeigt werden soll. DieToolbar ist nicht unbedingt notwendig, da die gesamte Funktionalität extern aufgerufenwerden kann (siehe LLVIEW13.EXE und das Menü). Sie können also leicht eine eigeneToolbar hinzufügen. Voreinstellung: TRUEToolbarButtons [out] LPDISPATCH: Gibt ein ToolbarButtons Objekt zurück, das denStatus der einzelnen Toolbarbuttons lesen und setzen kann. Das Objekt stellt folgendeMethoden bereit:• GetButtonState([in] nButtonID) LONG Bei Übergabe einer TLB_ Konstante wirdder Status des Buttons zurückgegeben.Wert Bedeutung Konstante-1 Versteckt TLBS_PRV_HIDE0 Default TLBS_PRV_DEFAULT1 Aktiviert TLBS_PRV_ENABLED2 Deaktiviert TLBS_PRV_DISABLEDBeispiel:Dim oTlb as ToolbarButtonsSet oTlb = LlViewCtrl1.ToolbarButtonsMsgBox oTlb.GetButtonState(TLB_PRV_FILEEXIT)• SetButtonState([in] nButtonID, [in] nButtonState) Setzt den Status des angegebenenButtons. Die zulässigen Werte sind analog zu oben.Beispiel:Dim oTlb as ToolbarButtonsSet oTlb = LlViewCtrl1.ToolbarButtonsoTlb.SetButtonState TLB_PRV_FILEEXIT, TLBS_PRV_HIDEDie entsprechenden IDs finden Sie in der Datei MENUID.TXT in Ihrer <strong>List</strong> & <strong>Label</strong> Installation.384


MethodenShowThumbnails[in, out] BOOL: Gibt an, ob die Seitenvorschau im Control angezeigtwird. Voreinstellung: TRUESaveAsFilePath [in, out] BSTR: Hierüber kann ein Pfad angegeben werden, der imDateiauswahl-Dialog als Voreinstellung angezeigt werden soll.CanClose[out] BOOL: Gibt an, ob das Control beendet werden darf. Liefert die Eigenschaftden Wert FALSE zurück, darf das Control noch nicht beendet werden.Version [out] LONG: Gibt die Versionsnummer des OCX-Controls zurück(MAKELONG(lo,hi)).15.4. MethodenGotoFirst: Springt zur ersten SeiteGotoPrev: Eine Seite zurückGotoNext: Eine Seite vorwärtsGotoLast: Springt zur letzten SeiteZoomTimes2: Erhöht den Zoom-Faktor auf das doppelteZoomRevert: Geht auf die letzte Zoom-EinstellungZoomReset: Setzt den Zoom auf 1-fach ("einpassen") zurückSetZoom ([in] long nPercentage) : Setzt den Zoom-Faktor anhand des übergebenenWertes. (1-30)PrintPage ([in] long nPage, [in] long hDC ): Druckt die angegebene Seite (mit Druckerdialog,wenn hDC = 0)PrintCurrentPage ([in] long hDC ): Druckt die momentan angezeigte Seite (mit Druckerdialog,wenn hDC=0)PrintAllPages ([in] BOOL bShowPrintOptions ): Druckt alle Seiten im Projekt (mit Druckerdialog,wenn bShowPrintOptions = TRUE)SendTo: Startet das "Senden"SaveAs: Startet das "Speichern Als"RefreshToolbar: Aktualisiert die ToolbarGetOptionString([in] BSTR sOption) BSTR: Gibt die Einstellungen des eMailversandeszurück. Diese können in der Systemsteuerung unter "<strong>combit</strong> Mail Einstellungen“ konfiguriertwerden385


Das Viewer-OCX-ControlSetOptionString([in] BSTR sOption, [in] BSTR sValue) BSTR: Hiermit werden dieEinstellungen des eMailversandes gesetzt. In der Systemsteuerung unter "<strong>combit</strong> MailEinstellungen“ lassen sich diese konfigurieren15.5. EreignisseBtnPressSyntax:BtnPress(short nID): BOOLAufgabe:Gibt an, dass ein Button der Toolbar gedrückt wurde.Parameter:nID:Wert Bedeutung100 BtnZoomTimes2101 BtnZoomPrev102 BtnFirst103 BtnLast104 BtnPrev105 BtnNext108 BtnZoomReset112 BtnPrint113 BtnPrintAll114 BtnExit115 BtnSendTo116 BtnExport117 BtnFax126 BtnSlideshowRückgabewert:TRUE, wenn Sie den Button ignoriert haben wollen bzw. die zugehörige Aktionselbst durchgeführt haben, ansonsten (default) FALSE.386


Visual C++ HinweisPageChangedSyntax:PageChangedAufgabe:Parameter:Teilt Ihnen mit, dass eine neue Seite angezeigt wird.-Rückgabewert:-LoadFinishedSyntax:LoadFinished(BOOL bSuccessful)Aufgabe:Parameter:Weist darauf hin, dass die Datei vollständig auf der lokalen Platte gespeichertwurde. Wichtig ist dies beim asynchronen Download.bSuccessful: TRUE, wenn die Seite erfolgreich heruntergeladen wurde, FALSE:bei fehlerhaftem Download. Ein erfolgreicher Download ist aber noch kein Indizdafür, dass auch die Datei korrekt ist - das kann über eine nachfolgende Abfrageder Property 'Pages' überprüft werden: ein Wert größer 0 zeigt an, dass die Dateikorrekt ist.Rückgabewert:-15.6. Visual C++ HinweisIn Visual C++ (zumindest 5.0) erhält man u.U. eine "Assertion Failed"-Meldung in occcont.cpp.Diese Assertion erscheint nur für den Debug-Build und hat weiter keine Auswirkungenauf Ihre Applikation. Vermutlich ist dies ein Nebeneffekt der ATL-Bibliothekvon Microsoft.15.7. Benötigte DateienCMLL13V.OCX benötigt:• CMLS13.DLL387


Das Viewer-OCX-Control• CMPR13.DLL• CMLL13XL.DLL wenn Sie die direkte Exportfunktionalität nach PDF nutzen wollen• CMDW13.DLL wenn Sie die direkte Exportfunktionalität in diverse Bildformate nutzenwollen• MFC 4.2 (MFC42.DLL, MSVCRT.DLL, MSVCRT20.DLL). Diese Dateien sind meist aufden Zielrechnern vorhanden. Bedenken Sie, dass MFC42.DLL registriert werdenmuss!• WININET.DLL, URLMON.DLL. Diese Dateien werden nur benötigt, wenn Sie Inter-/Intranet-URLs übergeben wollen. Sind üblicherweise auf den Zielrechnern vorhanden,wenn diese Internet-tauglich sind. Bedenken Sie, dass URLMON registriert werdenmuss!15.8. Verpacken in CAB-FilesEin CAB File befindet sich im Lieferumfang von <strong>List</strong> & <strong>Label</strong>.15.9. Einbau in Ihre Internet-SeiteDas Control kann wie erwähnt auch auf einer Internet-Seite plaziert werden. Die Eigenschaftenkönnen dann über -Tags verwaltet werden, Sie können aber auchüber Skript-Sprachen auf das Control zugreifen, z.B. können Sie es mit FrontPage einfügenund über VBScript und andere Controls dessen Eigenschaften verändern. Als Beispielkönnen Sie die mitgelieferte Datei l13vdemo.htm betrachten.388


Aufgabe16. Die eigenständige Viewer-Application16.1. AufgabeDer Standalone-Viewer LLVIEW13.EXE ist eine mächtige Applikation, die zur Anzeige der<strong>List</strong> & <strong>Label</strong>-Preview-Dateien dient.Wenn der Viewer einmal registriert ist, wird die Dateiendung ".LL" mit dieser Applikationverknüpft, so dass über alle Links, die diese Endung enthalten (im Explorer, in eMails, inInternetseiten, ...) automatisch der Viewer gestartet wird.16.2. KommandozeilenoptionenLLVIEW13 Lädt die angegebene Datei.Eine URL als Parameter ist nicht möglich.LLVIEW13 /p Druckt die angegebene Datei (auf Default-Drucker)LLVIEW13 /pt Druckt die angegebene Datei (auf den gewünschten Drucker). Falls der DruckernameLeerzeichen enthält, muss er in Anführungszeichen gesetzt werden.16.3. RegistrierungRufen Sie den Viewer erstmals mit dem Parameter "/regserver" auf, um ihn zu registrieren- er beendet sich dann nach der Registrierung wieder.16.4. Benötigte DateienLLVIEW13.EXE benötigt zusätzlich die Dateien CMLS13.DLL und CMPR13.DLL. WennSie ausserdem die Exportoptionen nach PDF oder eines der Bildformate nutzen wollen,benötigen Sie• PDF: CMLL13XL.DLL im Suchpfad• Multi-TIFF: CMDW13.DLL im Suchpfad• JPEG (nur die aktuell angezeigte Seite): CMDW13.DLL im Suchpfad389


Fehlercodes17. Fehlercodes17.1. Allgemeine FehlermeldungenAnbei finden Sie die verwendeten Fehlercode-Konstanten. Die Konstanten beginnen allemit LL_ERR_, z.B. entspricht der Tabelleneintrag BAD_JOBHANDLE der Konstante LL_-ERR_BAD_JOBHANDLE. Die Werte in Klammern sind die Dezimalangaben, die auch beiDebugausgaben erscheinen.Wert390BedeutungBAD_JOBHANDLE (-1)Es wurde eine Funktion mit einem Jobhandle alsParameter aufgerufen, das nicht mit LlJob-Open()erzeugt wurde.TASK_ACTIVE (-2)Pro Applikation darf nur ein Designerfenster geöffnetsein, Sie haben versucht, ein zweites zu öffnenBAD_OBJECTTYPE (-3)Einer Funktion, die den Objekttyp als Parameter benötigt,wurde ein ungültiger Typ übergeben. GültigeTypen: LL_PROJECT_LABEL, LL_PROJECT_LIST, LL_-PROJECT_CARDPRINTING_JOB (-4)Es wurde eine Druckfunktion aufgerufen, obwohlnoch kein Druckjob gestartet wurde.NO_BOX (-5)LlPrintSetBoxText() wurde aufgerufen, obwohl derDruckjob nicht mit LlPrintWithBoxStart() geöffnet wurde.NOT_YET_PRINTING (-7) LlPrint[G|S]etOption[String](), LlPrintResetProject-State(). Der Druckjob ist noch nicht gestartetNO_PROJECT (-10)LlPrint[WithBox]Start(): Es existiert kein Objekt mitdem angegebenen Dateinamen. Identisch mit LL_-ERR_NO_OBJECTNO_PRINTER (-11)LlPrint[WithBox]Start(): Druckerjob konnte nicht gestartetwerden, da kein Drucker-Device geöffnet werdenkonnte.PRINTING (-12)Während des Druckens trat ein Fehler auf. HäufigsteUrsache: Druckspooler voll, bzw. der vom Druckspoolerbenötigte Platz ist auf dem Laufwerk auf dasTEMP zeigt nicht mehr vorhanden (Pro Seite kann jenach Druckauflösung und verwendeter Grafik einPlatzbedarf von einigen MB entstehen. Abhilfe schafftmeist auch die Einstellung des Direktdrucks ohneSpooler). Mögliche Ursache bei Direktdruck: allg.Druckerfehler, Papierstau, etc.EXPORTING (-13)Beim Exportieren ist ein Fehler aufgetreten (z.B. keineZugriffsrechte auf Zielpfad, zu exportierende Dateischon vorhanden und schreibgeschützt,...)


Allgemeine FehlermeldungenNEEDS_VB (-14)BAD_PRINTER (-15)NO_PREVIEWMODE (-16)NO_PREVIEWFILES (-17)PARAMETER (-18)BAD_EXPRESSION (-19)BAD_EXPRMODE (-20)CFGNOTFOUND (-22)EXPRESSION (-23)CFGBADFILE (-24)BADOBJNAME (-25)UNKNOWNOBJECT (-27)NO_TABLEOBJECT (-28)NO_OBJECT (-29)NO_TEXTOBJECT (-30)UNKNOWN (-31)BAD_MODE (-32)CFGBADMODE (-33)Diese DLL-Version benötigt Visual Basic.Bei Druckoptionen: kein Drucker verfügbar.Preview-Funktionen: bei LlPrint[WithBox]Start() wurdekein Preview-Mode eingestellt.LlPreviewDisplay(): Keine Preview-Dateien gefunden.NULL Zeiger als Parameter ist hier nicht gestattet,möglicherweise auch andere Parameter-Fehler. Bittebenutzen Sie den Debug-Modus zur Bestimmung desFehlers.Neuer Expression-Modus: Ein Ausdruck in LlExprEvaluate()konnte nicht interpretiert werden.Unbekannter Ausdrucks-Modus in LlSetOption().LlPrint[WithBox]Start(): Projektdatei wurde nicht gefunden.LlPrint[WithBox]Start()/LlDefineLayout(): Einer der verwendetenAusdrücke hat einen Fehler. Beim Designstartwerden die Fehler interaktiv angezeigt, beimDruckstart finden sich weitere Informationen im Debuglog.LlExprEval(): Verwenden Sie LlExprError(), um denFehler zu finden.LlPrint[WithBox]Start(): Projektdatei hat falsches Formatoder ist defekt.LlPrintEnableObject(): Der Objektname ist nicht korrekt.LlPrintEnableObject(): Es existiert kein Objekt mitdiesem Objektnamen.wird von LlPrintStart() und LlPrintWithBoxStart() zurückgegeben,wenn ein <strong>List</strong>en-Projekt gestartet werdensoll, das kein <strong>List</strong>enobjekt enthält. Wird nur imneuen Expression-Modus zurückgegeben.LlPrint[WithBox]Start(): Das Projekt besitzt keine Objekte,und leere Seiten kann man auch anders drucken!LlPrintGetTextCharsPrinted(): Kein Textobjekt in diesemProjekt.LlPrintIsVariableUsed(), LlPrintIsFieldUsed(): Die angegebeneVariable gibt es nicht. LlGetUsedIdentifiers():Das Projekt wurde noch nicht mit <strong>List</strong> & <strong>Label</strong> 11 oderneuer gespeichert und enthält daher keine Informationenüber verwendete Variablen uind Felder.Feld-Funktionen wurden benutzt, obgleich das Projektkein Tabellenprojekt ist.LlPrint[WithBox]Start(), LlDefineLayout(): Der Ausdruck-Modus der Projektdatei ist der neue Modus, eingestelltist jedoch der alte Modus (siehe LlSetOption()).391


FehlercodesONLYWITHONETABLE (-34)UNKNOWNVARIABLE (-35)UNKNOWNFIELD (-36)UNKNOWNSORTORDER (-37)NOPRINTERCFG (-38)SAVEPRINTERCFG (-39)RESERVED (-40)NOVALIDPAGES (-41)NOTINHOSTPRINTERMODE(-42)NOTFINISHED(-43)Funktion ist nur anwendbar, wenn der OneTable-Modus gewählt wurde (LL_OPTION_ ONLYONETABLE)(siehe LlSetOption()).Die bei LlGetVariableType() oder LlGetVariableContents()angegebene Variable wurde nicht definiert.Das bei LlGetFieldType() oder LlGetFieldContents()angegebene Feld wurde nicht definiert.Die über die ID bei den Gruppierungs-Funktionenangegebene Sortierreihenfolge wurde nicht definiert.LlPrintCopyPrinterConfiguration(): Datei wurde nichtgefunden oder hat falsches FormatLlPrintCopyPrinterConfiguration(): Datei konnte nichtgeschrieben werden: Problem mit Festplattenplatzoder ZugriffsrechtenReserviertDie Storage-Datei enthält keine gültigen SeitenDieser Befehl kann nicht im HOSTPRINTER-Modusaufgerufen werden (z.B. LlSetPrinterInPrinterFile())Ein oder mehrere Objekte sind noch nicht fertig gedrucktBUFFERTOOSMALL(-44) Ll[G|S]etOptionString(), LlPrint[G|S]etOptionString(),...: Ein übergebener Puffer ist nicht groß genug fürdie darin zu speichernden Daten.BADCODEPAGE (-45)CANNOTCREATETEMPFILE(-46)NODESTINATION(-47)NOCHART(-48)TOO_MANY_CONCURRENT_PRINTJOBS (-49)BAD_WEBSERVER_LICENSE(-50)NO_WEBSERVER_LICENSE(-51)ERR_INVALIDDATE (-52)LL_OPTION_CODEPAGE: Die Codepage ist nichtgültig (NLS nicht auf dem System installiert).Eine Temporärdatei konnte nicht erzeugt werden(falscher Temp-Pfad!)<strong>List</strong> & <strong>Label</strong> hat kein gültiges Ausgabemedium beimStart des Drucks (siehe LL_OPTIONSTRING_-EXPORTS_ALLOWED)LlPrintDeclareChartRow(): Kein Chartobjekt im Projektvorhanden.Kann nur in Server/Webserverapplikationen auftreten.Die Anzahl der Benutzer übersteigt die lizensierteBenutzeranzahl.Kann nur in Server/Webserverapplikationen auftreten.Die Webserver-Lizenzdatei (*.wsl) ist ungültig oderbeschädigt.Kann nur in Server/Webserverapplikationen auftreten.Die Webserver-Lizenzdatei (*.wsl) wurde nicht gefunden.LlSystemTimeFromLocaleString(): Ein ungültiges Datumsformatwurde verwendetDRAWINGNOTFOUND(-53) Eine benötigte Grafikdatei wurde nicht gefunden. S.LL_OPTION_ERR_ON_FILENOTFOUND392


Zusätzliche Fehlermeldungen der Storage-APIERR_NOUSERINTERACTION(-54)ERR_BADDATABASESTRUCTURE (-55)ERR_UNKNOWNPROPERTY (-56)ERR_CFGFOUND (-59)ERR_SAVECFG (-60)USER_ABORTED (-99)BAD_DLLS (-100)NO_LANG_DLL (-101)NO_MEMORY (-102)EXCEPTION (-104)LICENSEVIOLATION (-105)LL_WRN_TABLECHANGE(-996)LL_WRN_PRINTFINISHED(-997)LL_WRN_REPEAT_DATA (-998)Ein Aufruf würde eine Benutzerinteraktion benötigen,<strong>List</strong> & <strong>Label</strong> läuft aber auf einem WebserverDie Datenbankstruktur, die für das Design verwendetwurde stimmt nicht mit der zur Druckzeit übereinDie Eigenschaft ist für das angegebene Objekt nichtverfügbarLlProjectOpen(): Das gewählte Projekt ist bereitsvorhanden oder ist schreibgeschützt.LlProjectSave():Fehler beim Speichern der ProjektdateiDer Benutzer unterbrach den AusdruckDie von <strong>List</strong> & <strong>Label</strong> benötigten DLLs sind nicht aufdem benötigten Stand.Die benötigte Sprach-DLL wurde nicht gefunden, undauch CMLL13@@.LNG ist nicht vorhanden.Zu wenig freier SpeicherEin GPF ist innerhalb der Funktion aufgetreten. <strong>List</strong> &<strong>Label</strong> könnte bei der weiteren Ausführungen instabilseinEs wurde versucht, eine Funktion aufzurufen, diedurch den Lizenzumfang nicht gedeckt ist (z.B. Designeraufrufauf Endkundenrechner mit Standard-Edition)In einem hierarchischen Layout ändert sich der Tabellenname.s. Kap. "4. "Rückgabewert bei LlRTFDisplay(): keine weiterenDaten mehr zu druckenDies ist "nur" ein Hinweis: momentaner Datensatzpasste nicht mehr auf die Seite. Dieser Rückgabewertwird benötigt, um zu melden, dass die Seitenzahl aufden neuesten Stand gebracht werden muss und dermomentane Datensatz erneut geschickt werdenmuss.17.2. Zusätzliche Fehlermeldungen der Storage-APIWertSTG_NOSTORAGE (-1000)STG_BADVERSION (-1001)BedeutungDie Datei ist keine <strong>List</strong> & <strong>Label</strong>-Preview-DateiDie Preview-Datei hat eine inkompatible Versionsnummer393


FehlercodesSTG_READ (-1002)STG_WRITE (-1003)STG_UNKNOWNSYSTEM(-1004)STG_BADHANDLE (-1005)STG_ENDOFLIST (-1006)STG_BADJOB (-1007)STG_ACCESSDENIED (-1008)STG_BADSTORAGE (-1009)STG_CANNOTGETMETAFILE(-1010)Fehler beim Lesen der Preview-DateiFehler beim Schreiben der Preview-DateiUnbekanntes Dateiformat für das Storage SystemFalscher Parameter (Metafile-Handle ist ungültig)LlStgsysGetFilename(): Seite nicht vorhandenLlStgsysXxxx(): Ungültiger Job-IndexStorage ist mit ReadOnly-Flag geöffnet worden undkann keinen Schreibzugriff zulassenInterner Fehler des Preview-Files bzw. leeres FileLlStgsysDrawPage(): Metafile konnte nicht erzeugtwerden (z.B. fehlerhafte Datei)STG_OUTOFMEMORY (-1011) Speicheranforderung schlug fehlSTG_SEND_FAILED (-1012)STG_DOWNLOAD_PENDING(-1013)STG_DOWNLOAD_FAILED(-1014)STG_WRITE_FAILED (-1015)STG_UNEXPECTED (-1016)STG_CANNOTCREATEFILE(-1017)STG_INET_ERROR (-1019)WRN_STG_UNFAXED_PAGES(-1100)Fehler beim Mailversand. Weitere Informationen zumProblem finden Sie in der Regel im Debug-LogfileEine Aktion konnte nicht durchgeführt werden, da diezu betrachtende Datei noch nicht fertig geladen wurdeEine Aktion konnte nicht durchgeführt werden, da derDownload der zu betrachtenden Datei fehlgeschlagenistSchreib-/Berechtigungsfehler beim SpeichernUnerwarteter Fehler. Wird bei Auftreten dem Benutzermit weiteren Informationen gemeldetSchreib-/Berechtigungsfehler beim SpeichernUnerwarteter Fehler. Wird bei Auftreten dem Benutzermit weiteren Informationen gemeldetLlStgsysPrint() bzw. LlStgsysStoragePrint() (nur bei Druckauf Fax-Device): Einige Seiten enthielten keine Faxnummern-Informationenund konnten deswegen nichtgefaxt werden.394


Aufgabe18. DEBWIN2.EXE18.1. AufgabeDEBWIN2 ist ein Tool für vielfältige Debugaufgaben.Wenn der Debug-Modus über LlSetDebug() eingeschaltet ist, gibt <strong>List</strong> & <strong>Label</strong> aufDEBWIN2 Status-Informationen aus, sobald diese Applikation gestartet wurde. Um möglichstalle Ausgaben zu erhalten, empfehlen wir DEBWIN2 vor der zu debuggenden Applikationzu starten. Sobald Ihre Applikation gestartet ist, werden dann die Debug-Ausgaben von DEBWIN2 verwertet und ausgegeben.Neben den Fehlercodes (s. Kapitel "17. Fehlercodes") erhalten Sie meist weitere Informationen,so dass Sie häufig auf diese Weise die Ursache für ein unerwünschtes Verhaltenfinden können.Eine Ausgabe in einem typischen Debug-Log sieht wie folgt aus:CMLL13 : 09:05:01.266 00000ee4 [lldemo32.exe] LlSelectFileDlgTitleEx(1,0x00010a3a,'(NULL)',0x00008001,0x0012F86C,129,0x00000000)CMLL13 : 09:05:19.726 00000ee4 ->'c:\vorlagen\artikel.lbl'=0Man erkennt das aufgerufene Modul (CMLL13), Timing-Informationen, die Thread-ID,den Aufrufer (lldemo32.exe), die aufgerufene Funktion mit Parametern sowie – in derFolgezeile – den Rückgabewert der Funktion. Eine vollständige Log-Datei, wie sie auchunser Support-Team zur Problemanalyse benötigt, enthält eine große Vielzahl solcherAusgaben. Ist dies bei Ihnen nicht der Fall, so haben Sie in der Regel entweder• den Debug-Modus nicht mit LlSetDebug() eingeschaltet• das Logging in DEBWIN2 nicht aktiviertDEBWIN2 besitzt einen Zeilen-Ringpuffer, in dem nach Belieben vor- und zurückgeblättertwerden kann. Dies geschieht durch die üblichen Cursor-Tasten oder den Scrollbalken.Weitergehende Informationen können Sie auch der Datei DEBWIN.TXT entnehmen.Wir leisten keinen Support für die nicht im Zusammenhang mit der Debug-Ausgabestehenden Features dieses Zusatz-Tools.395


Anhang: Barcode-Formate19. Anhang: Barcode-FormateDie Barcode-Formate finden Sie unter dem Suchbegriff Barcode-Formate in der DesignerOnline Hilfe.20. Anhang: Konfigurationsdateien<strong>List</strong> & <strong>Label</strong> speichert seine Informationen standardmäßig in der Registry ab:• Oberflächenkonfiguration (Fenstergrößen, Default-Farben, Default-Schriftart, ...): inder Registry unter "HKEY_CURRENT_USER/Software/<strong>combit</strong>/CMBTLL/".• Etiketten- und <strong>List</strong>endefinitionen: In einer Datei mit dem gewünschten Dateinamenund der Default-Endung '.lbl' für Etiketten, '.lst' für <strong>List</strong>en und ´.crd´ für Karteikarten.Die Dateien sind textorientiert und können im Bedarfsfall mit einem beliebigen Texteditor(NOTEPAD u.a.) verändert werden. Die strenge Syntax ist jedoch einzuhalten.Über den API-Aufruf GetPrivateProfileString ("Description", "Text", ..., )kann man die Beschreibung des Definitions-Files erhalten. Eine Beschreibung desFormats können Sie im Anhang Dateiformate nachlesen (nur SBCS/DBCS-Projektdateien!)Diese Datei ist, wenn sie von der Unicode-Version von <strong>List</strong> & <strong>Label</strong> erzeugt wurde, imUnicode-Format mit führendem Unicode-Magic-Word (0xFEFF).Die Dateiendungen können sich bei Verwendung der Funktion LlSetFileExtensions()von diesen Voreinstellungen unterscheiden.• Druckerkonfiguration: In einer Datei mit dem Etiketten- bzw. <strong>List</strong>ennamen und derEndung '.lbp' für Etiketten, '.lsp' für <strong>List</strong>en. Die Information ist binär gespeichert undsollte auf keinen Fall verändert werden. Die Dateiendungen können sich bei Verwendungder Funktion LlSetFileExtensions() von diesen Voreinstellungen unterscheiden.Die Datei kann bei Verwendung von LlSetPrinterDefaultsDir() in einem anderen Verzeichnisstehen. Siehe auch LlSetPrinterInPrinterFile().In dieser Datei werden auch die Einstellungen für die verschiedenen Exportmodulegespeichert.• Die Vorschaudateien für die Dateiauswahlbox haben die Endungen '.lbv', '.lsv' und'.crv'. Dies sind Windows-übliche Bitmaps. Die Dateiendungen können sich bei Verwendungder Funktion LlSetFileExtensions() von diesen Voreinstellungen unterscheiden.Mit LlCreateSketch() können diese aus einer Projektdatei erstellt werden.• Die Vorschaudateien für den Preview haben die Endung '.LL'.396


Aufgabe21. Anhang: DateiformateHinweise zu den Projektdateiformaten von <strong>List</strong> & <strong>Label</strong> finden Sie in unserer OnlineKnowledgebase unter http://support.<strong>combit</strong>.net im Artikel KBTD000602.397


Anhang: Neuerungen der Version 522. Anhang: Neuerungen der Version 522.1. Kurzzusammenfassung22.1.1. Allgemein• Die Namensgebung der Module (DLL, OCX, VBX, LNG) hat sich geändert• Preview-Druck kann nun auch in eine einzige Datei erfolgen, die versendet werdenkann (sehr interessant für Intranet/Internet oder eMail). Dies ist nun Voreinstellung!• Umbenennung der Preview-Verwaltungsdatei (von ".000" zu ".LL")• Funktionen zur Verwaltung dieser "Preview"-Datei.• "Senden An" - eMail Funktion im Echtdatenpreview.• Optionale Komprimierung der Echtdatenvorschau• 32-bit-Preview-ActiveX/OCX/COM/OLE-Control.• Unabhängiger lizenzfreier 32-bit-Preview-Viewer, realisiert mit dem o.g. Control.• LL_CMND_HOSTPRINTER• neue Barcodes MSI-Plessey, CODE93, CODE11.• neue Grafikformate JPEG, PCD.• neue Optionen für LlSetOption() und LlGetOption().• geringe Änderungen in den Preview-Dateien (kein SetViewportOrg() mehr).• Kombination mehrerer Jobs in einer Preview-Datei möglich• initieller Preview-Zoom• neuer Ausdruckmodus Voreinstellung22.1.2. Designer• RTF Control für 1-seitigen Druck (nur 32 Bit)• Zusätzlicher Dialogstil für Office 97 Buttons• Gruppenfußzeilen• opt. Seitenumbruch bei erster Gruppenkopfzeile• 5 Kopf, 20 Fuß, Gruppen- und 30 Datenzeilen• Assistent bei der Neuanlage von Projekten• Import von Projekten22.2. Neue Funktionen22.2.1. DLL-API• Stgsys-Funktionen zur Verwaltung der Preview- und Druckfiles• LlPrintCopyPrinterConfiguration() für Verwaltung der Druckerkonfigurationsdateien fürtemporäre Drucker• LlPreviewDisplayEx()398


Der Expression-Modus22.3. Der Expression-ModusAus Kompatibilitätsgründen beherrscht <strong>List</strong> & <strong>Label</strong> noch eine alten Expression-Modusaus den Versionen 4 und früher. Wir raten jedoch von der Benutzung dieses Modus inneuen Projekten ab und empfehlen in vorhandenen Projekten einen raschen Umstieg aufden aktuell voreingestellten Expressionmodus.Wenn Sie keine alten <strong>List</strong> & <strong>Label</strong> Projekte, die noch in diesem alten Modus arbeiten(erkennbar an den spitzen Klammern, in denen Varaiblennamen eingeschlossen werden)verwenden, so können Sie dieses Unterkapitel getrost ignorieren.Den alten kompatiblen Text-Auswertmodus schalten Sie mittelsLlSetOption(hJob, LL_OPTION_NEWEXPRESSIONS, FALSE);ein.Mit der zusätzlichen OptionLlSetOption(hJob, LL_OPTION_EXTENDEDEVALUATION, TRUE);kann eine Kombination von altem und neuem Modus eingeschaltet werden. Alle Eingabeninnerhalb von Chevrons > werden nach dem neuen Modus behandelt, alleanderen Eingaben nach dem alten Modus, z.B.:Kundennummer: von 399


Anhang: Neuerungen der Version 623. Anhang: Neuerungen der Version 623.1. Kurzzusammenfassung23.1.1. Allgemein• Die Namensgebung der Module (DLL, OCX, VBX, LNG) hat sich mit der Versionsnummerwie üblich geändert, auch die zugehörigen DLLs (siehe "Zum Ablauf benötigteModule" am Anfang des Handbuchs) und Applikationen wurden entsprechend umbenannt.• Das OCX-Control wurde wesentlich erweitert:- es kapselt fast alle Funktionen und Optionen- es enthält eine Druckroutine zur Vereinfachung simpler Druckaufgaben- Die Funktionen wurden kompatibel zur <strong>List</strong> & <strong>Label</strong>-DLL umbenannt• Das VCL-Control wurde komplett überarbeitet- es kapselt fast alle Funktionen und Optionen- es enthält eine Druckroutine zur Vereinfachung simpler Druckaufgaben- Die Funktionen wurden kompatibel zu <strong>List</strong> & <strong>Label</strong>-DLL umbenannt• automatischer Seitenumbruch in Tabellen- und Textobjekten, auch bei an Tabellenangehängten Objekten• Das RTF-Objekt (32bit) kann automatischen mehrseitigen Druck• Hierarchische Variablen- und Feldlisten ("Adresse.Name", "Adresse.Vorname", "Produkt.Nummer",...)• RTF-Texte auch in Tabellen (32bit)• neuer Variablentyp LL_RTF zur direkten Auswahl im RTF-Eigenschafts-Dialog (32bit)• Datumsvariablen und -Felder können auch die Uhrzeit im Nachkommaanteil (alsBruchteil des Tags) enthalten• Datumsvariablen und -Felder können von Delphi, Visual Basic, Visual FoxPro und Cohne Umrechnungsdifferenz übergeben werden• erweiterte Verkettungen (negative Größenanpassung, Anhängen an Ende) ermöglichenwesentliche Design-und Programmier-Erleichterungen• Druck auf Datei möglich• neue oder geänderte Designer-Funktionen: Continued(), Now(), AddDays(), Add-Hours(), AddMinutes(), AddSeconds(), Hour(), Minute(), Second(), RGB(), min(), max(),erweiterte Parameter für Date$(), erweiterte Parameter für FStr$(), erweiterte Parameterfür WoY()• diverse interne Variablen wurden umbenannt:AltNeuCountPageData LL.CountDataThisPageCountAllDataLL.CountDataCountPagePrintedData LL.CountPrintedDataThisPageCountAllPrintedRows LL.CountPrintedData400


KurzzusammenfassungAltFCountPageDataNeuLL.FCountDataThisPageFCountAllData LL.FCountDataFCountPagePrinted- LL.FCountPrintedDataThisPageDataFCountAllPrintedRows LL.FcountPrintedData(die alten Bezeichner werden aus Kompatibilitätsgründen noch erkannt)• Druckdialog- optisch verbessert- Wahl des Ausgabemediums (Drucker/Datei/Preview) nun auch optional durchden Benutzer möglich• Barcode-Druck auf Seiten größer A4 möglich• Preview-Ausgabe von Seiten größer A4 nun auch bei Win95/98 möglich trotz Einschränkungendurch Windows 9x (32bit) (siehe LL_OPTION_EMFRESOLUTION)• optionale automatische Änderungshistorie in Projektdatei: Benutzer- und Rechnernamesowie Datum und Uhrzeit der Erstellung und der letzten Änderung (siehe auchLlSetOption)• optionale automatische Änderungshistorie in Previewdatei: Benutzer- und Rechnername(nur 32 bit) sowie Datum und Uhrzeit der Erstellung• Barcode- und Zeichnungsobjekte können über Formel berechnet werden23.1.2. Oberfläche• optional neuer "Explorer"-Stil in Datei-Lade oder Speichern-Dialogen• überarbeitete Dialoge• neu designter Hilfe-Button• neue Controls für Farb- und Rasterauswahl• Zusätzlicher Dialogstil für Office 98 Tooltipps ("gleitendes" Erscheinen)• Formelassistent erweitert:- mehrzeilig- 32 bit: Drag&Drop aus Variablenliste und -Fenster- automatisches Einfügen von Operatoren (falls nötig)- Funktionen zur Klammersuche und Verschachtelungsmarkierung zur Unterstützungbei der Erstellung komplexer Formeln• 32 bit: hierarchisches Variablenfenster für Drag&Drop- auf Arbeitsblatt: Anlegen neuer Objekte- auf Objekt: Einfügen einer Zeile, eines Tabellenfelds, Ändern des Objektinhalts- auf Texteigenschaften: Einfügen einer Zeile- auf Tabelleneigenschaften: Einfügen einer Zelle- auf Formelassistent: Einfügen einer Variablen• erweitertes Menü für die rechte Maustaste:- direkte Bearbeitung eines Tabellenfelds401


Anhang: Neuerungen der Version 6- direkte Bearbeitung einer Textzeile- direkte Bearbeitung einer Formel in Barcode- und Zeichnungsobjekten, wenndiese über eine Formel berechnet werden• Veränderung der Breite von einzelnen oder zusammengehörigen Tabellenfeldern mitder Maus• Einfügen von Feldern auf Tabelle per Drag&Drop• Barcodes (EAN8, EAN13xxx, DPIdent, DPLeit, GermanParcel, Postnet, FIM) könnenRestriktion auf erlaubte Größen erhalten• neue Funktionen im Echtdatenpreview:- Speichern einer Einzelseite (32 bit, nur Storage)- Speichern der Vorschau (32 bit, nur Storage)- Druck einer einzelnen Seite auf einen auszuwählenden Drucker- Druck aller Seiten auf einen auszuwählenden Drucker• neuer Viewer für Vorschaudateien:- mit Thumbnail-Seitenvorschau- zweisprachig mit automatischer Erkennung der Sprache und optionaler manuellerUmschaltung23.2. Neue Funktionen/Optionen23.2.1. DLL-API• LlSetPrinterInPrinterFile()• LlPrintSetOptionString()• LlPrintGetOptionString()• LlDebugOutput()• neue Flags für LlPrint[WithBox]Start(): LL_PRINT_FILE, LL_PRINT_USERSELECT• LlSelectFileDlgTitleEx()für LlSelectFileDlgTitle()und LlSelectFileDlg()wegen Parameteränderung• LlPrintSelectOffsetEx()für LlPrintSelectOffset() wegen Parameteränderung• Neue Optionen:LL_OPTION_USEBARCODESIZESLL_OPTION_MAXRTFVERSIONLL_OPTION_AUTOMULTIPAGELL_OPTION_EMFRESOLUTIONLL_OPTION_SETCREATIONINFOLL_OPTION_XLATVARNAMESLL_OPTION_SPACEOPTIMIZATIONLL_OPTION_FORCEMBCSLL_OPTION_VARSCASESENSITIVELL_OPTION_DELAYTABLEHEADERLL_OPTION_OFNDIALOG_EXPLORERLL_OPTION_LANGUAGE402


KonzeptänderungenLL_OPTION_PHANTOMSPACEREPRESENTATIONCODELL_OPTION_LOCKNEXTCHARREPRESENTATIONCODELL_OPTION_EXPRSEPREPRESENTATIONCODELL_OPTION_DEFPRINTERINSTALLEDLL_PRNOPT_PRINTDLG_DESTMASKLL_PRNOPT_PRINTDLG_DESTLL_PRNOPT_PRINTDLG_ONLYPRINTERCOPIES• Geänderte Optionen:LL_OPTION_SUPPORTPAGEBREAK: Default nun TRUELL_OPTION_WIZ_FILENEW ohne Funktion; diese Option kann nun vom Endanwenderin den Designer-Optionen eingestellt werden• Neue Variablentypen und -varianten:LL_RTFLL_DATE_DELPHI1LL_DATE_DELPHILL_DATE_MSLL_DATE_OLELL_DATE_VFOXPRO23.2.2. STGAPI• neue Optionen für LlStgsysGetJobOptionValue(): LS_OPTION_ISSTORAGE,LS_OPTION_EMFRESOLUTION• neue Optionen für LlStgsysGetPageOptionString(): LS_OPTION_CREATION,LS_OPTION_CREATIONAPP, LS_OPTION_CREATIONDLL, LS_OPTION_-CREATIONUSER23.3. KonzeptänderungenNicht mehr unterstützte Funktionen: Die folgenden Funktionen werden nicht mehr unterstützt,und sind - wenn überhaupt - nur aus Codekompatibilitätsgründen im Deklarationsfileenthalten: LlPrintCheckLineFit(), LlPrintBeginGroup(), LlPrintEndGroup(), LlVB...(),LlPrintIntermediateTitle(), LlPrintHSeparator().Zudem ist die Drucklogik umgestellt worden; <strong>List</strong> & <strong>Label</strong> verwaltet seit Version 6 denSeitenumbruch völlig eigenständig. Dadurch können nicht alle Konstruktionen, die in <strong>List</strong>& <strong>Label</strong> 5 zwar möglich, aber nicht in der Weise vorgesehen waren, in die Version 6übernommen werden. Insbesondere folgende Aufgaben sollten auf anderem Wegegelöst werden:• Verwendung von Page() in Gruppenwechselbedingungen, um einen Zwischentitel zuerzwingen. Hier kann es Probleme geben, wenn eine Datenzeile einen Umbruch auslösenkann• Zeilenhöhe 0 pt für den Statistikdruck (siehe neue Designer-Option ab Version 7).Weitere Dinge, die Sie bei der Umstellung beachten sollten:403


Anhang: Neuerungen der Version 6• LlPrintGetRemainingItemsPerTable() schreibt die gegenwärtig im Speicher befindlichenDaten in einen Puffer, d.h. nach Aufruf des Befehles können die Daten nichtmehr verändert werden, bis die entsprechende Zeile tatsächlich gedruckt wurde.• Evtl. muss die Einstellung von Zeilen- und Absatzabstand neu angepasst werden404


Kurzzusammenfassung24. Anhang: Neuerungen der Version 724.1. Kurzzusammenfassung24.1.1. Allgemein• <strong>List</strong> & <strong>Label</strong> 7.0 ist optional multibyte-tauglich (Fernost-Sprachen!) und auch als Unicode-Versionerhältlich (vgl. Kapitel über den internationalen Einsatz) inkl. automatischemWortumbruch für die entsprechende Sprache anhand des eingestelltenSkripts.• Export auf RTF, HTML, DIB und JPG möglich• mehr integrierte Barcodes:- 4 neue MSI-Barcodes- MSI-Barcodes auf Nutzzeichen 0-9,A-F erweitert• optional erhältliches Modul mit den 2D-Barcodes PDF417 und Maxicode• Die VCL-Komponente wurde wesentlich erweitert:- integrierte Datenbankanbindung mit Master-Detail-Modus- Property- und Componenteditor (direkter Aufruf des Designers aus der IDE möglich)• Das OCX-Control wurde erweitert:- automatische Parametererweiterung (wenn von der IDE her unterstützt)- <strong>List</strong> & <strong>Label</strong>-Konstanten als ENUMs• Zusätzliches VB-Control in Quellcodeform mit integrierter Datenbankanbindung• Textobjekte können nach unten ausgerichtet werden• Einbetten von Bildern in die Projektdatei möglich• Das RTF-Objekt unterstützt Einbettung von Objekten und Grafiken• Erweiterung auf jeweils 50 Tabellenkopf-, Daten- Fuß, Gruppenkopf- und Gruppenfußzeilen• Beliebig viele Benutzer- und Summenvariablen mit frei definierbaren Namen• neue oder geänderte Designer-Funktionen: LocCurr$(), LocCurrL$(), LocNumber$(),LocDate$(), LocTime$(), Locale$(), erweiterte Parameter für Date$(), erweiterte Parameterfür FStr$()• Druckdialog optisch verbessert, Wahl des Ausgabemediums (Drucker/Datei/Preview/Export)nun auch optional durch den Benutzer möglich• Dateiformat der Etikettenvorlagen hat sich geändert• Die Projektdatei ist gegen Bearbeitung gesperrt, während sie im Designer bearbeitetwird• Beim Druck optionale automatische Anpassung des Papierformats des Druckers andas des Projekts, wenn kein passendes P-File gefunden wurde.405


Anhang: Neuerungen der Version 724.1.2. Oberfläche• In einem selektierten Tabellenobjekt werden die verschiedenen Zeilentypen farblichmarkiert.• Ebenen-, Variablen- und Vorschaufenster sind nur sichtbar, wenn der Designer aktivist• verbesserter Markierungsrahmen zum Anfassen und Verschieben von Objekten• verbesserter Formelassistent mit diversen Funktionsgruppierungen zum schnellerenAuffinden von Funktionen (Sortiert nach logischer Gruppe, Typ des Rückgabewertsund Typ des ersten Parameters)• Textobjekte:- Schriftart schneller einstellbar- Zeilenabstand eines umgebrochenen Texts einstellbar- Ausrichtung am unteren Rand möglich• neuer LLVIEW7 (unabhängiger Viewer für Vorschaudateien): unabhängig vom Viewer-OCX,daher leichtere Registrierung24.2. Neue Funktionen/Optionen24.2.1. DLL-API• Neue Funktionen:LlJobOpenLCID()LlPrintResetObjectStates()LlPrintResetProjectState()LlXSetParameter()LlXGetParameter()• Entfernte Funktionen:LlPrintSelectFont(): (Font-Einträge in Strukturen sind nun Handles)LlSetDecimalChar(): (als OPTION implementiert)• Neue Optionen:LL_OPTION_LCIDLL_OPTION_CODEPAGELL_OPTION_DEFDEFFONTLL_OPTION_NOTIFICATIONMESSAGEHWNDLL_OPTION_IMMEDIATELASTPAGELL_OPTION_COMPRESSRTFLL_OPTION_ALLOW_LLX_EXPORTERSLL_OPTION_SUPPORTS_PRNOPTSTR_EXPORTLL_OPTION_FORCEFONTCHARSETLL_OPTION_CALCSUMVARSONINVISIBLELINESLL_OPTION_NOFOOTERPAGEWRAP406


Neue Funktionen/OptionenLL_OPTIONSTR_EXPORTS_AVAILABLELL_OPTIONSTR_EXPORTS_ALLOWEDLL_OPTIONSTR_DEFDEFFONTLL_OPTIONSTR_EXPORTFILELISTLL_OPTIONSTR_LLXPATHLISTLL_OPTIONSTR_DECIMALLL_OPTIONSTR_THOUSANDLL_OPTIONSTR_CURRENCYLL_OPTIONSTR_SHORTDATEFORMATLL_PRNOPT_JOBIDLL_PRNOPTSTR_EXPORTLL_PRNOPTSTR_EXPORTDESCRLL_PRNOPT_PRINTJOBNAME• Geänderte Optionen:LL_OPTION_MULTIPLETABLELINES Default nun TRUELL_OPTION_TEXTQUOTEREPRESENTATIONCODE Default nun 1LL_OPTION_PHANTOMSPACEREPRESENTATIONCODE Default nun 2LL_OPTION_LOCKNEXTCHARREPRESENTATIONCODE Default nun 3• Entfernte Optionen:LL_OPTION_FORCEMBCS entfernt (statt dessen ..._CODEPAGE)LL_OPTION_WIZFILENEW entfernt (jetzt im Designer wählbar)• Neue Callbacks:LL_CMND_CHANGE_DCPROPERTIES_CREATELL_CMND_CHANGE_DCPROPERTIES_DOCLL_CMND_CHANGE_DCPROPERTIES_PAGELL_NTFY_EXPRERROR• Neue Variablenvarianten:LL_DATE_DMYLL_DATE_YMDLL_DATE_MDYLL_DATE_YYYYMMDDLL_BARCODE_MSI_10_CDLL_BARCODE_MSI_10_10LL_BARCODE_MSI_11_10LL_BARCODE_PDF417 (optionales Modul wird benötigt)LL_BARCODE_MAXICODE (optionales Modul wird benötigt)LL_BARCODE_MAXICODE_UPS (optionales Modul wird benötigt)• Neue Hostprinter-Kommandos:LL_PRN_GET_PAPERFORMATLL_PRN_SET_PAPERFORMAT• Strukturänderung bei scLlPrinter407


Anhang: Neuerungen der Version 724.2.2. STGAPI• Neue Funktionen:LlStgsysPrint()LlStgsysStoragePrint()408


Kurzzusammenfassung25. Anhang: Neuerungen der Version 8Alter Expressionmode wird nichtmehr unterstützt25.1. Kurzzusammenfassung25.1.1. Allgemein• neuer Objekttyp: HTML• neuer Objekttyp: Statistik (Chart). Bitte beachten Sie hierbei den dazugehörigenAbschnitt im Programmierhandbuch• neue Export-Formate: PDF, XML, MHTML• zur Vereinfachung der Übergabe von Variablen gibt es neue Variablen-Typen(LL_NUMERIC_LOCALIZED und LL_DATE_LOCALIZED)• neuer Variablentyp LL_HTML• die Funktionen if() sowie cond() wurden optimiert: es wird nur noch der Zweig berechnet,für den die Bedingung zutrifft (das gilt nicht für das Parsing, sondern nur fürdie Berechnung des Ergebnisses)• es gibt eine neue Variable für Formeln: "LL.OutputDevice". Sie enthält das Druckmediumbzw. das Exportmedium, in das ausgegeben wird.• neue Designer-Funktion Hyperlink$()• erweiterte Empty()-Funktion: macht optionales ATrim$(), so dass man sich eine Verschachtelungsparen kann• die Namen von Zeilen bei mehrfachem Zeilendefinitionen können geändert werden• jede Gruppenkopfzeile kann nun einen Seitenumbruch auslösen• das Textobjekt kann nun auch eine Hintergrundfarbe haben• optional kann der Blocksatz durch ein zusätzliches Verteilen des Leerraums auf diePlätze zwischen den Zeichen qualitativ verbessert werden• die Vorschau Dateien wurden etwas optimiert - dies wirkt sich besonders bei Tabellen-Reportsaus• Beim Speichern einer Projektdatei wird nun ein Backup der Projektdatei angelegt• Neue Option, so dass die von NT erzeugten Preview-Dateien mit Barcodes auch mitWin9x/ME gelesen werden können wenn nötig.• Höhere Auflösung im amerikanischen (Inch-)Koordinaten-System.• verbesserte Lade-Logik der Erweiterungsmodule (LLX-Dateien), sieheLL_OPTIONSTR_LLXPATHLIST• unterstützt die erweiterten Laden/Speichern-Dateidialoge von Windows 2000• Projektskizzen können nun farbig sein (Voreinstellung ist aber weiterhinschwarz/weiß), siehe LL_OPTION_SKETCH_COLORDEPTH• Anzahl der möglichen multiplen Tabellenzeilen auf 100 pro Typ (Kopf, Daten, Fuß,Gruppenkopf und –fuß) erhöht• Der Projekttyp-Bezeichner, der bei Lade- und Speicherdialogen angezeigt wird, kanneingestellt werden (LL_OPTIONSTR_xxx_PRJDESCR)• optional: japanischer Post-Barcode (CM32L?BJ.LLX)409


Anhang: Neuerungen der Version 8• optional: neue Funktionen zur Umrechnung der europäischen Währungen untereinanderund in oder von dem Euro (CM32L?EU.LLX)• optional: neue Funktionen, für Bildeffekte (Maskierung, Drehung, Schwarzweiß- oderReliefdarstellung) (CM32L?BM.LLX)• Für den Ausdruck von Projekten werden weniger DLLs benötigt als früher, die CRD-DLL (hier CR8) wird nur noch für den Designer benötigt• Durch die Einführung eines neuen Koodinatensystems LL_INCH_DIV_1000, der nunim Inch-System Standard ist, ist es möglicherweise nötig, bei User-Objekten dieneue Auflösung zu berücksichtigen. LL_OPTION_UNITS liefert die aktuelle Auflösungzurück, LL_OPTION_METRICS gibt nur zurück, ob das System metrisch ist oder nicht.Kontrollieren Sie also die Benutzung dieser beiden Optionen.Die maximale Papiergröße reduziert sich hierdurch unter Win9x und ME auf ca. 83cm Kantenlänge, für größere Papiergrößen muss auf LL_UNITS_INCH_DIV_100 umgeschaltetwerden.25.1.2. Oberfläche• Die Oberfläche von <strong>List</strong> & <strong>Label</strong> 8.0 wurde überarbeitet, um sie noch bedienerfreundlicherzu machen, zusätzlich zu dem bisherigen Previewfenster gibt es nun auch aufdem Arbeitsbereich die Möglichkeit, Objekte detailgenau anzeigen zu lassen• die Vergrößerungsmodi von Vorschau und Arbeitsbereich sind nun getrennt voneinanderbedienbar• der Funktionsassistent wurde stark erweitert: Auto-Completition, Tooltips, Syntax-Highlighting und Parameter-Informationen während der Eingabe stehen zur Verfügung(nicht in der MBCS/Unicode Version)25.2. Neue Funktionen/Optionen25.2.1. DLL-API• Neue Funktionen:LlDesignerProhibitFunction()LlSetNotificationCallbackExt()LlDefineChartFieldStart()LlDefineChartFieldExt()LlPrintDeclareChartRow()LlPrintGetChartObjectCount()LlPrintIsChartFieldUsed()LlGetChartFieldContents()LlEnumGetFirstChartField()410


Neue Funktionen/Optionen• Neue Optionen:LL_OPTION_INTERCHARSPACINGLL_OPTION_ALLOWMENUMANAGERLL_OPTION_INCLUDEFONTDESCENTLL_OPTION_RESOLUTIONCOMPATIBLETO9XLL_OPTION_OFNDIALOG_NOPLACESBARLL_OPTION_SKETCH_COLORDEPTHLL_OPTION_SKIPRETURNATENDOFRTFLL_OPTIONSTR_MAILTOLL_OPTIONSTR_MAILTO_CCLL_OPTIONSTR_MAILTO_BCCLL_OPTIONSTR_MAILTO_SUBJECTLL_OPTIONSTR_SAVEAS_PATHLL_OPTIONSTR_LABEL_PRJDESCRLL_OPTIONSTR_CARD_PRJDESCRLL_OPTIONSTR_LIST_PRJDESCRLL_OPTIONSTR_LLFILEDESCR• Geänderte Optionen:LL_OPTIONSTR_LLXPATHLIST geänderte LogikLL_OPTION_MAXRTFVERSION auf 0 verhindert Laden des RTF-ControlsLL_OPTION_UNITS: neues Einheitensystem 1/1000 inch• Neue Variablenvarianten:LL_DATE_LOCALIZEDLL_NUMERIC_LOCALIZEDLL_HTML411


Anhang: Neuerungen der Version 926. Anhang: Neuerungen der Version 926.1. Kurzzusammenfassung26.1.1. Allgemein• Projekte können optional verschlüsselt werden• Änderung der Lizensierungsstruktur• neues Objekt: OLE-Container• erweiterte Druckmöglichkeiten aus dem Preview• Thumbnailview in dem Preview• neuer Exporttyp: Excel• neuer Exporttyp: Text• neuer Exporttyp: TIFF/Multi-TIFF• Gruppenkopfzeilen können auf jeder Seite unter den/anstelle der Kopfzeilen erscheinen• Nach Gruppenfusszeilen kann nun ebenfalls ein Umbruch erfolgen• Nahezu alle Objektproperties können sich als Ergebnis einer Formel berechnen lassen• Neue interne LL.-Variablen, um Objekte dynamisch mit der Papiergröße sizen zukönnen• neue Toolfenster für Objektübersicht und Eigenschaften• RTF Editor auskoppelbar (eigene API-Gruppe)• RTF-Objekte rotierbar (Windows NT/2000/XP)• RTF-Objekte mit Textüberlauf in andere RTF-Objekte• Unterstützung für MSFAX als Ausgabemedium (Windows 2000/XP)• Größe der Previewdateien um bis zu ca. 60% reduziert• Verbesserte .NET-Komponente, Unterstützung für eigene Funktionen und Objekte imDesigner• Neuer Event für Print/Design-Methoden in OCX und VCL. In diesem können Druckoptionengesetzt werden und so z.B. ein stummer Export realisiert werden.26.1.2. Oberfläche• Office XP Look & Feel• Dockable Toolfenster/Toolbars, Tabstrips für hintereinandergedockte Fenster• Hilfslinien im Designer mit konfigurierbarer Wirkungsbreite• Zeilendefinitionen im Tabellenobjekt bequem vertauschbar• Property-Window412


Neue Funktionen/Optionen26.2. Neue Funktionen/Optionen26.2.1. DLL-API• Neue Funktionen:LlRTF...() (eigene API-Gruppe)LlPrintGetRemainingSpace()LlGetPrinterFromPrinterFile()• Neue Optionen:LL_OPTION_UISTYLELL_OPTION_NOFILEVERSIONUPGRADEWARNINGLL_OPTION_FONTPRECISIONLL_OPTION_FONTQUALITYLL_OPTIONSTR_FAX...LL_OPTIONSTR_PROJECTPASSWORDLL_OPTIONSTR_LICENSINGINFO413


Anhang: Neuerungen der Version 1027. Anhang: Neuerungen der Version 1027.1. Kurzzusammenfassung27.1.1. Allgemein• Neues Objekt im Designer: Formular-Element (Eingabefeld, Combobox, Checkboxoder Button)• Vollständig überarbeiteter PDF-Export• Preview-Control: direkter Export in PDF und andere Formate möglich• Preview-Control: Versand der Formulardaten über HTTP oder eMail in diversen Formatenmöglich• Preview-Control: Sketchliste ein- und ausschaltbar• EMail-Versand über SMTP oder MAPI, Parameter per Optionen einstellbar• Neue Vorschaucontrols für diverse Programmiersprachen• RTF-Control (incl. Formatierungstoolbars), einbindbar in eigene Projekte sowohl überFensterklasse als auch über Subclassing bzw. neue Controls (.NET, VCL)• Neuer Exporttyp: TTY; für Direktdruck von Text auf Nadeldrucker• Erweiterter Text-Export mit Layout• Textobjekt kann optional Rahmen haben• Im Tabellenobjekt sind die Rahmen jetzt für jede Zelle einzeln einstellbar• Neue Barcodeformate (Data Matrix, PZN, Code 39 CRC, PIX, Royal Mail)• Callback für Druckjob-Überwachung• Neue Formelfunktionen "RegExMatch$()", "Previous()"• Projektvorlagen• "vertikal unten" ausgerichtete Zellen in Tabellen werden erst dann gedruckt, wennalle anderen Zellen auch fertig gedruckt werden• Stgsys-API nur noch in der LS-DLL• Neue Namenskonventionen für die DLL-Namen27.1.2. Oberfläche• optionaler Office 2003 Stil• mehr Dialoge größenanpassbar• Linien sind über Shift-Taste vertikal oder horizontal setzbar• RTF-Editor unterstützt 2-fach-Zoom (ab RTF Version 3)27.2. Neue Funktionen/Optionen27.2.1. DLL-API• Neue Funktionen:414


Geänderte Funktionen/OptionenCMLL10.DLL:LlRTFEditorProhibitAction()LlRTFEditorInvokeAction()LlSetDefaultProjectParameter()LlGetDefaultProjectParameter()LlPrintSetProjectParameter()LlPrintGetProjectParameter()CMLS10.DLL:LsSetDebug()LsMailConfigurationDialog()LlStgsysConvert()LlStgsysGetJobOptionStringEx()LlStgsysSetJobOptionStringEx()LlStgsysGetPageOptionStringEx()LlStgsysSetPageOptionStringEx()LlStgsysStorageConvert()• Neue Optionen:LL_OPTION_ESC_CLOSES_PREVIEWLL_OPTIONSTR_PREVIEWFILENAME• Neuer Callback:LL_INFO_PRINTJOBSUPERVISION27.3. Geänderte Funktionen/Optionen27.3.1. DLL-API• Die gesamte LlStgsys-API befindet sich nun in der Datei CMLS10.DLL, die API wurdeaus CMLL10.DLL entfernt• Die bisherigen Konstanten LL_STGSYS_... wurden einheitlich in LS_... umbenannt(Bsp.: LL_STGSYS_OPTION_CREATION -> LS_OPTION_CREATION)• LlRTFEditObject hat einen neuen Parameter, der bestimmt, ob das Control inplaceoder modal angezeigt werden soll.• Der empfohlene Weg, Exportergebnisse per EMail zu versenden ist nun über dieProjekt-Parameter API. Weitere Informationen im Kapitel zum Versand von Exportergebnissenper EMail.415


Anhang: Neuerungen der Version 1128. Anhang: Neuerungen der Version 1128.1. Kurzzusammenfassung28.1.1. Allgemein• API-Unterstützung für relationale Datenstrukturen und hierarchische Reports• Designer: Aggregatsfunktionen• NULL-Wert Unterstützung• .NET: vollständig überarbeitetes Databinding• .NET: umfangreiche neue Onlinehilfe• VCL: vollständig überarbeitetes Databinding• Unterstützung für Seite x/y ohne 2-Pass-Technik• Überarbeiteter Excel-Export• Überarbeiteter RTF-Export• Bedingte Umbrüche vor Gruppenkopf-/ nach Gruppenfußzeilen möglich• Drehen von Tabellenspalten möglich• Druckbereichsauswahl verbessert• Neuer Barcode: Aztec28.1.2. Oberfläche• Neues Toolfenster "Tabellenstruktur"• Neue Linealfunktionalität zur Spaltenseperatorenausrichtung• Erweiterter Zeilendefinitionsdialog: einzelne Zeilendefinitionen im Designer ausblendbar• Neue Toolbarcontrols in der Vorschau• Überarbeitete Treeview-Icons• Property-Editoren für Rahmen und Formatierungen28.2. Neue Funktionen/Optionen28.2.1. DLL-API• Neue Funktionen:CMLL11.DLL:416


Geänderte Funktionen/OptionenLlDbAddTable()LlDbAddTableRelation()LlDbAddTableSortOrder()LlDbSetMasterTable()LlPrintDbGetCurrentTable()LlPrintDbGetCurrentRelation()LlPrintDbGetCurrentSortOrder()LPrintlDbGetRootTableCount()LlGetUsedIdentifiers()CMLS11.DLL:LsMaiJobOpen()LsMailJobClose()LsMailSetOptionString()LsMailGetOptionString()LsMailSendFile()• Neue Optionen:LL_OPTION_CALC_SUMVARS_ON_PARTIAL_LINESLL_OPTION_PROJECTBACKUPLL_OPTION_ERR_ON_FILENOTFOUNDLL_OPTION_NOFAXVARSLL_OPTION_NOMAILVARSLL_OPTIONSTR_EXPORTS_ALLOWED_IN_PREVIEWLL_OPTIONSTR_HELPFILENAMELL_OPTIONSTR_NULLVALUE28.3. Geänderte Funktionen/Optionen28.3.1. .NET-Komponente• die Funktionen LlPrintFields() und LlPrintFieldsEnd liefern nun statt "bool" einen "int"-Rückgabewert. Diese Änderung war notwendig, um hierarchische Tabellenstrukturenzu unterstützen. Wenn Sie Ihre Projekte lediglich umstellen wollen, ohne neue Featureszu nutzen, gehen Sie vor wie im folgenden Kapitel beschrieben.417


Anhang: Neuerungen der Version 1229. Anhang: Neuerungen der Version 1229.1. Kurzzusammenfassung29.1.1. Allgemein• Kreuztabellen• leichtere Ansteuerung von Charts (auch in Tabellenspalten) über die LlDb...()-API-Funktionen• Unterstützung für digitale Signatur• .NET/VCL/OCX: komfortabler Umgang mit Dictionaries für lokalisierte Reports• .NET: Databinding-Unterstützung für generische <strong>List</strong>enklassen• HTML-Export: Rahmenexport über CSS• XLS-Export: Möglichkeit, pro Seite ein eigenes Worksheet zu erzeugen• Neue ActiceX-Controls für Funktions- und Objekterweiterungen• Java JNI-DLL wird mitgeliefert29.1.2. Oberfläche• neue Möglichkeiten im Berichtsstrukturfenster: Charts und Kreuztabellen• neue Eigenschaft "Datenquelle" für Charts (auch in Tabellenspalten) und Kreuztabellen• vollständig überarbeitete Symbole• Anti-Aliasing und höhere Farbtiefe für Sketch-Dateien• einige Barcodes können mit fester Strichdicke ausgegeben werden• einige Barcodes können mit einstellbarem Strichdickeverhältnis ausgegeben werden• neuer Barcode SSCC/NVE• Projekteigenschaften jetzt als Eigenschaftsfenster direkt auf der Arbeitsoberflächestatt unter Projekt > Einstellungen• neue Eigenschaft "Mindestseitenanzahl" für ein Projekt• Farbgradient als Objekthintergrund möglich• Darstellungsbedingungen für Textabsätze und Tabellenspalten• verbesserter Seitenumbruch des HTML-Objekts29.2. Neue Funktionen/Optionen29.2.1. DLL-API• Neue Optionen:LL_OPTION_ENABLE_STANDALONE_DATACOLLECTING_OBJECTSLL_OPTIONSTR_VARALIAS418


Geänderte Funktionen/Optionen• Neuer Callback:LL_CMND_SAVEFILENAME29.3. Geänderte Funktionen/Optionen29.3.1. .NET-Komponente• die Funktionen LlDbAddTable() sowie LlDbAddTableSortOrder() und LlDbAddTableRelation()des Core-Objekts haben keinen Parameter mehr für den DisplayName des E-lements (letzter Parameter). Hierfür kann jetzt zentral an einer Stelle das neue Dictionary-Objektverwendet werden, z.B. LL.Dictionary.Tables.Add("Orders", "Bestellungen").419


Anhang: Neuerungen der Version 1330. Anhang: Neuerungen der Version 1330.1. Kurzzusammenfassung30.1.1. Allgemein• vollkommen überarbeitetes Chartobjekt: neue Optik, mehrere Achsen, logarithmischeSkalen, Balken-Drehung um 90°• DOM-Funktionen für dynamische Projekterstellung und -änderung• Tabellen können mehrspaltig gedruckt werden• Vorschau kann schon während des Drucks angezeigt werden• verkleinerte Vorschaudateien• Neuer Präsentationsmodus für Vorschau• Unicode-Unterstützung für Export-Module• neues Exportformat XPS• Objekte können wahlweise als Bild exportiert werden• Exportergebnisse können automatisch in ZIP-Archive komprimiert werden• neue API um Fehlertext lokalisiert zu erfragen• .NET/VCL: komfortabler Umgang mit DOM-Funktionen über umfangreiches Klassenmodell• .NET: Databinding-Unterstützung für LINQ-Objekte30.1.2. Oberfläche• vollständig überarbeiteter Tabellendialog; "unendlich" viele Zeilendefinitionen, allesauf einen Blick in neuer Baumstruktur• Eigenschaften mehrerer Tabellenzeilen können gleichzeitig geändert werden• Berichtscontainer können mehrere Spalten haben• Unterstützung für freie Inhalte in Tabellen• vollständig überarbeiteter Chartdialog, Formeln für Charteigenschaften• überarbeiteter Funktionsassistent• überarbeiteter Druckoptionsdialog• neue Barcode-Typen: QR-Code und ISBN• Codeset für Code128 kann gesteuert werden• erweiterte Umbruchsoptionen für Kreuztabellen• neue Optionen für Textobjekte: Text immer umbrechen, Text ideal einpassen• neue Optionen für Textfelder in Tabellen: immer feste Höhe verwenden• neue Designerfunktionen Exists(), Evaluate(), GetValue()420


Neue Funktionen/Optionen30.2. Neue Funktionen/Optionen30.2.1. DLL-API• Neue Funktionen:LlDomGetObjectLlDomGetSubobjectCountLlDomGetSubobjectLlDomCreateSubobjectLlDomDeleteSubobjectLlDomSetPropertyLlDomGetPropertyLlProjectOpenLlProjectCloseLlProjectSaveLlGetErrortextLlDlgEditLineEx• Neue Optionen:LL_OPTION_INCREMENTAL_PREVIEW30.3. Geänderte Funktionen/Optionen• die Voreinstellung für LL_OPTION_INCLUDEFONTDESCENT ist jetzt TRUE. Dies vermeidetdas Abschneiden extremer Unterlängen, kann aber dazu führen, dass sichdas Layout gegenüber <strong>List</strong> & <strong>Label</strong> 12 leicht verändert. Sollte dies in Ihren Projektenzu Problemen führen, können Sie den Wert der Option jederzeit auf die alte Voreistellung(FALSE) zurücksetzen.30.4. Umstellung auf <strong>List</strong> & <strong>Label</strong> 1330.4.1. AllgemeinDas Dateiformat der Projektdateien hat sich zwischen <strong>List</strong> & <strong>Label</strong> Version 12 und 13geändert. Die neue Version kann aber in der Regel alte Projekte konvertieren. Standardmäßigwird hierbei eine Warnmeldung angezeigt, die den Benutzer darauf hinweist, dasser im Begriff ist, ein altes Projekt auf das neue Format umzustellen. Sie können dieseMeldung auch über LL_OPTION_NOFILEVERSIONUPGRADEWARNING unterdrücken.Bestehende Projekte werden beim Druck automatisch im Hintergrund konvertiert, sodass hier nichts besonderes zu beachten ist.Wie bei jedem Update einer Software empfehlen wir Ihnen auch bei einem <strong>List</strong> & <strong>Label</strong>Update alle Vorlagen und Projekte sorgfältig zu prüfen, da Verbesserungen zum Teilauch bedeuten, dass bestimmte Verfahren auf einem anderen Weg umgesetzt worden421


Anhang: Neuerungen der Version 13sind und dann nur eine hohe Annäherung aber keine 100%ige Identität erreicht werdenkann.30.4.2. Umstellung von VB-ProjektenSie können bestehende Visual Basic-Projekte folgendermaßen auf die aktuelle Versionumstellen:Umstellungen, die nur für Projekte mit Nutzung des <strong>List</strong> & <strong>Label</strong>-OCX erforderlichsind:• Laden Sie die Visual-Basic Projektdatei (*.vbp bzw. *.mak) in einen Texteditor. ErsetzenSie die ZeileObject={2213E283-16BC-101D-AFD4-040224009C0C}#12.0#0; CMLL12O.OCXdurch folgende ZeileObject={2213E283-16BC-101D-AFD4-040224009C0D}#13.0#0; CMLL13O.OCXund die ZeileModule= CMLL12; CMLL12.BASdurch die ZeileModule= CMLL13; CMLL13.BAS• Nach Speichern Ihrer Änderungen laden Sie die Form (*.frm) in den Texteditor, diedas <strong>List</strong> & <strong>Label</strong>-OCX beinhaltet. Ersetzen Sie die ZeileObject = "{2213E183-16BC-101D-AFD4-040224009C0C}#12.0#0";"CMLL12O.OCX"durch folgende ZeileObject = "{2213E183-16BC-101D-AFD4-040224009C0D}#13.0#0"; "CMLL13O.OCX"• Falls Sie ältere <strong>List</strong> & <strong>Label</strong> Versionen auf <strong>List</strong> & <strong>Label</strong> 13 umstellen wollen, ändernSie die entsprechenden Einträge analog ab.• Sie können nun Ihre Projekte in Visual Basic laden. Der Quellcode muss je nach Ausgangsversiongeringfügig angepasst werden• Da die <strong>List</strong> & <strong>Label</strong>-Konstanten im OCX-Control erhalten sind, ist ab VB 5 das .BAS-Deklarationsfile normalerweise nicht nötig.30.4.3. Umstellung von Delphi-ProjektenBeachten Sie hierzu die Hinweise in der Onlinehilfe für Delphi30.4.4. Umstellung von .NET-ProjektenIn der Regel genügt es, den Verweis auf die listlabel12.dll bzw. listlabel12unicode.dlldurch einen Verweis auf die listlabel13.dll bzw. listlabel13unicode.dll auszutauschen. Siesollten zusätzlich die alten Komponenten aus der Toolbox entfernen und durch die neuenKomponenten ersetzen.422


Benutzerauswahl für das Druckmedium31. Tipps und Tricks31.1. Benutzerauswahl für das DruckmediumDas folgende gilt nur für Ihre eigene Druckschleife, nicht aber, wenn Sie die Print()-Routine in den .NET/OCX/VCL-Controls verwenden:Wenn Sie bei dem Druck-Start-Befehl (LlPrintStart() oder LlPrintWithBoxStart()) als DruckartLL_PRINT_USERSELECT übergeben, kann der Benutzer im Druckdialog (LlPrint-OptionsDialog()) das Ausgabemedium (Drucker, Datei, Vorschau oder Export-Ziel) selbstwählen, und Sie sparen sich einen Menüpunkt, da Sie hier nicht mehr "Druck>Drucker"und "Druck>Vorschau" anbieten müssen. Vor dem Beenden des Druckjobs (LlPrintEnd())müssen Sie den von LlPrintGetOptionString(LL_PRNOPTSTR_EXPORT) zurückgegebenenWert auf die Kennung des Exportmediums abzufragen, um beispielsweise im Fall desPreviewdrucks (Kennung "PRV") den Preview über LlPreviewDisplay() wie üblich nachdem Druckende zu starten.31.2. GeschwindigkeitstippsVerwenden Sie keine Sonderzeichen in Variablennamen 9 . Dann können Sie die automatischePrüf- und Konvertierroutine über LlSetOption(HLLJOB, LL_OPTION_-XLATVARNAMES,0) ausschalten und so unnötige und häufige Berechnungen unterdrücken.Für einen internationalen Einsatz ist das ohnehin nötig.Wenn Ihre Applikation fertiggestellt und getestet ist, können Sie die Parameterüberprüfungvon <strong>List</strong> & <strong>Label</strong> ausschalten über den Befehl LlSetOption(HLLJOB, LL_OPTION_-NOPARAMETERCHECK,1). Auch hierdurch sparen Sie wertvolle Zeit, indem Sie hoffentlichüberflüssige Checks vermeiden.Durch die Verwendung von LlPrintIs[Chart]FieldUsed() und LlPrintIsVariableUsed() kannauch eine Geschwindigkeitssteigerung erreicht werden, wenn nur die benötigten Variablen/Felderdefiniert werden.31.3. Automatisierter Betrieb in einem NT-ServiceWenn <strong>List</strong> & <strong>Label</strong> in einem NT-Service betrieben wird, werden Message-Boxen unterdrückt,wobei die voreingestellte Antwort zurückgegeben wird. Dies wird in der DateiCOMBIT.LOG im %APPDATA%-Verzeichnis notiert, so dass man dies nachvollziehenund ggf. Gegenmaßnahmen ergreifen kann.9 dies bedeutet aber nicht, dass Sie keine Umlaute verwenden dürfen!423


Tipps und TricksDer Weiteren kann man, da DEBWIN2 nicht auf die Nachrichten des Service reagiert, dieDebug-Ausgaben auf LOG-File ausgeben lassen. Dies kann man über das FlagLL_DEBUG_CMBTLL_LOGTOFILE bei LlSetDebug() erreichen.Beachten Sie bitte für den Betrieb von <strong>List</strong> & <strong>Label</strong> als Service die Lizenzbedingungen.31.4. WebreportingDie Verwendung von <strong>List</strong> & <strong>Label</strong> unter ASP.NET ist ausführlich im Kapitel 6.1.11. Verwendungvon <strong>List</strong> & <strong>Label</strong> zum Webreporting beschrieben. Natürlich können Sie auchandere Programmiersprachen für Webreporting verwenden. Ganz allgemein gelten hierfürdie folgenden Voraussetzungen:• Der Server muss ein Windows-System sein, <strong>List</strong> & <strong>Label</strong> kann nur auf Windows-Plattformen eingesetzt werden. Diese Einschränkung gilt natürlich nicht für dieClients.• Der Benutzeraccount, unter dem die Webanwendung läuft, benötigt Zugriff auf einenDruckertreiber. Der zugehörige Drucker muss nicht physikalisch auf dem System vorhandensein, es reicht die blosse Treiberinstallation. Zudem muss sichergestellt sein,dass der verwendete Benutzeraccount die <strong>List</strong> & <strong>Label</strong>-DLLs laden kann, d.h. dassRechte für den Pfad der DLLs vergeben wurden.• Die eigentliche Webanwendung führt dann auf Benutzeraktion hin einen stummenExport durch (s. Kapitel 14.2.5. Export ohne Benutzerinteraktion durchführen) undlenkt den Client z.B. durch einen Redirect auf die erzeugte Exportdatei.Beachten Sie bitte für den Betrieb von <strong>List</strong> & <strong>Label</strong> auf einem Webserver die Lizenzbedingungen.31.5. Weitere Tipps und TricksViele weitere Tipps und Tricks finden Sie auch in unserer Online Knowledgebase unterhttp://support.<strong>combit</strong>.net. Die Knowledgebase wird regelmäßig erweitert und um weitereArtikel ergänzt – reinschauen lohnt sich also!424


Weitere Tipps und Tricks32. Supportkonzept für <strong>combit</strong> EntwicklungstoolsHinweise zum Supportkonzept finden Sie auf dem bei dem Produkt befindlichen Informationsblattoder im Internet unter http://support.<strong>combit</strong>.net.Vorraussetzungen:Bevor Sie uns kontaktieren, überprüfen Sie bitte folgende Punkte, bzw. verschaffen Siesich die benötigten Informationen:• Lesen Sie auf jeden Fall die neuesten Hinweise in der Datei READ.ME, bzw. in unsererKnowledgebase im Internet unter http://support.<strong>combit</strong>.net.• Testen Sie Ihre Applikation mit LlSetDebug(). Die Hinweise, die dabei ausgegebenwerden helfen Ihnen oftmals weiter, bzw. geben uns die Chance Ihnen besser helfenzu können.• Notieren Sie sich die von Ihnen verwendeten Unterversionsnummern (wird bei LlSet-Debug ausgegeben, bzw. über STRG-UMSCHALT-F12 im Designer).• Verwenden Sie bei schriftlichen Anfragen das dem Produkt beiliegende Formular, beieMail-Anfragen das Online Support Formular.425


Index33. Index..NET-KomponenteAPI-Funktionen 94Datenbindung 71Datenübergabe 76Designer-Funktionen 88Designer-Objekte 91Einbindung 70Ereignisse 82Print- und Design-Methode 74PrintDocument 83PrintPreview 83Relationale Verknüpfungen 73Sprachwahl 81Vorschau-Dateien 84Webreporting 8611:1 Relationen 49, 571:n Relationen 49, 5433D-Dialoge 14AAbbruch-Box 259Abbruch-Dialogbox 38, 249, 257Ablauf 28Anfangsseite 38angehängte Objekte 41, 43ANSIZ 121Applikationsabh. Einstellungen 14Aufbau 12Ausgabe-Medien 294BBarcodegrösse 291Barcodes 291, 398Barcodevariablen 24Barcodevariablen definieren 184benötigte Module 15Benutzerdaten 288Benutzervariable 215Berichtscontainer 49Bitmap 184Bitmap-Buttons 14, 209Bitmaps 132BMP 373CC++ Builder 120Callback 132Callbackroutine 131, 133Callbacks 131Chart ObjekteAnsteuern 47Codepage 280CSV 368DDateiendungen 274Dateiextension 18, 274Dateiformate 397Datentypen 121Datenversorgung 27Datumsformat 299Datumsvariablen 21Debugging 15, 171, 271, 395Debug-Modus 270, 271DEBWIN2.EXE 271, 395Default-Drucker 212Deklarationsdateien 120Delphi 120, 121Design 25Designer 13, 31, 32Device Context 135Dezimalzeichen 293Diagramme 47Dialogbox-Modus 209, 273Dialog-Design 14Dialogstile 166, 273DLL 118DOM 60API 60Beispiele 65Einheiten 65Funktionen 62Druckdaten 305Druckerauswahlfenster 231Druckerbeschreibungsdate 225Druckerbeschreibungsdatei 300, 302Druckerkonfiguration 225, 396Druckerschriftarten 288Druckjob 19, 256, 390Druckjobnummer 238Druckoptionen 247, 250426


IndexDruckschleife 27Druckvorgang 33Druckvorschau 27, 221Druckziel 27Dynamic Link Library 118EEcht-Daten-Vorschau 221Einbindung der Routinen 119eMail 378, 382EMF 373Endseite 38Etiketten 17Etikettendruck 28, 34Event 131Excel 360Export-Module 297, 330Excel 360Fax 375Grafik 373HTML 333MHTML 345PDF 356RTF 351Text 368TTY 367, 372Versand per Mail 378, 382XML 345Exportoptionen 304Expression-Modus 399Extended MAPI 379External$ 139FFaxversand 295, 375Fehlercodes 390Felder 19Feldpuffer 173, 177Feldtypen 20Filter 229, 257Filterbedingung 159, 235Formelassistent 204Formelparser 204Fortschrittsanzeige 38, 249, 259Fußzeile 286Fusszeile 151GGDI-Objekte 135Geschwindigkeit 40gesperrte Objekte 290Grafik 24Grafikdatei 23GrafikformateEinbindung 23Gruppenbereich 175Gruppenfußbereich 175HHexadezimalzahlen 123Hilfedatei 212Hilfesystem 141Hotline 425HTML 333HTML Variablen 23Hyperlinks 343IImport-Libraries 119Installation 118JJob Handle 219, 327, 390Job Nummer 238JPEG 373Julianisches Datum 21KKarteikarten 17Karteikartendruck 28, 34Konfigurationsdateien 396Konzept 12Kopfzeile 151Kopien 39, 237, 246, 250LLastPage() 283Leerzeichenoptimierung 289Linker 119<strong>List</strong>en 17<strong>List</strong>endruck 29, 35<strong>List</strong>enfuß 175<strong>List</strong>enheader 175LL_ DESIGNEROPTSTR _...PROJECTDESCRIPTION 194PROJECTFILENAME 194WORKSPACETITLE 194LL_BARCODE 24LL_BARCODE_...-Konstanten 24LL_BOOLEAN 22LL_CHAR_LOCK 20LL_CHAR_NEWLINE 20LL_CHAR_PHANTOMSPACE 20427


IndexLL_CMND_...DCPROPERTIES_CREATE 144DCPROPERTIES_DOC 145DCPROPERTIES_PAGE 145DRAW_USEROBJ 132, 135EDIT_USEROBJ 137ENABLEMENU 138EVALUATE 139GETVIEWERBUTTONSTATE 140HELP 141HOSTPRINTER 141MODIFYMENU 146OBJECT 147PAGE 149PROJECT 150SAVEFILENAME 151SELECTMENU 151TABLEFIELD 151TABLELINE 153VARHELPTEXT 155LL_DATE 21LL_DATE_DELPHI 22LL_DATE_DELPHI_1 22LL_DATE_DMY 22LL_DATE_MDY 22LL_DATE_MS 22LL_DATE_OLE 22LL_DATE_VFOXPRO 22LL_DATE_YMD 22LL_DATE_YYYYMMDD 22LL_DRAWING 23LL_DRAWING_HBITMAP 23LL_DRAWING_HEMETA 23LL_DRAWING_HICON 23LL_DRAWING_HMETA 23LL_DRAWING_USEROBJ 24LL_DRAWING_USEROBJ_DLG 24LL_ERR_...BAD_DLLS (-100) 393BAD_EXPRESSION (-19) 391BAD_EXPRMODE (-20) 391BAD_JOBHANDLE (-1) 390BAD_MODE (-32) 391BAD_OBJECTTYPE (-3) 390BAD_PRINTER (-15) 391BAD_WEBSERVER_LICENSE (-50) 392BADCODEPAGE (-45) 392BADOBJNAME (-25) 391BUFFERTOOSMALL (-44) 295, 392CANNOTCREATETEMPFILE (-46) 392CFGBADFILE (-24) 391CFGBADMODE (-33) 391CFGNOTFOUND (-22) 391CONCURRENT_PRINTJOBS (-49) 392DRAWINGNOTFOUND (-53) 392EXCEPTION (-104) 393EXPRESSION (-23) 391LICENSEVIOLATION (-105) 393NEEDS_VB (-14) 391NO_BOX (-5) 390NO_LANG_DLL (-101) 393NO_MEMORY (-102) 393NO_OBJECT (-29) 391NO_PREVIEWFILES (-17) 391NO_PREVIEWMODE (-16) 391NO_PRINTER (-11) 390NO_PROJECT (-10) 390NO_TABLEOBJECT (-28) 391NO_TEXTOBJECT (-30) 391NO_WEBSERVER_LICENSE (-51) 392NOCHART (-48) 392NODESTINATION (-47) 392NOPRINTERCFG (-38) 392NOT_YET_PRINTING (-7) 390NOTFINISHED (-43) 392NOTINHOSTPRINTERMODE (-42) 392NOVALIDPAGES (-41) 392ONLY_ONE_JOB (-13) 390ONLYWITHONETABLE (-34) 392PARAMETER (-18) 391PRINTFINISHED (-997) 393PRINTING (-12) 390PRINTING_JOB (-4) 390SAVEPRINTERCFG (-39) 392TASK_ACTIVE (-2) 390UNKNOWN (-31) 391UNKNOWNFIELD (-36) 392UNKNOWNOBJECT (-27) 391UNKNOWNSORTORDER (-37) 392UNKNOWNVARIABLE (-35) 392USER_ABORTED (-99) 37, 393LL_INFO_METER 156LL_INFO_PRINTJOBSUPERVISION 157LL_NTFY_...VIEWERBTNCLICKED 155LL_NTFY_EXPRERROR 158LL_NTFY_FAILS_FILTER 159LL_NUMERIC 21, 124LL_OPTION_...ADDVARSTOFIELDS 279ALLOW_LLX_EXPORTERS 279AUTOMULTIPAGE 279CALC_SUMVARS_ON_PARTIAL_LINES 279CALCSUMVARSONINVISIBLELINES 279CALLBACKMASK 280CALLBACKPARAMETER 280CODEPAGE 280COMPRESSRTF 280COMPRESSSTORAGE 280CONVERTCRLF 281DEBUGFLAG 281DEFDEFFONT 281DEFDEFFONT 294DEFPRINTERINSTALLED 212DELAYTABLEHEADER 41, 281EMFRESOLUTION 282428


IndexENABLE_STANDALONE_DATA… 281ERR_ON_FILENOTFOUND 282ESC_CLOSES_PREVIEW 282EXPRSEPREPRESENTATIONCODE 282EXTENDEDEVALUATION 282, 285FONTPRECISION 283FONTQUALITY 282FORCEFONTCHARSET 283HELPAVAILABLE 283IMMEDIATELASTPAGE 283INCLUDEFONTDESCENT 284INCREMENTAL_PREVIEW 284INTERCHARSPACING 284LANGUAGE 212LCID 284, 299LOCKNEXTCHARREPRESENTATIONCODE284MAXRTFVERSION 285METRIC 285MULTIPLETABLELINES 285NEWEXPRESSIONS 282, 285NOFAXVARS 285NOFILEVERSIONUPGRADEWARNING 286NOFOOTERPAGEWRAP 286NOMAILVARS 286NONOTABLECHECK 286NOPARAMETERCHECK 40, 286NOTIFICATIONMESSAGEHWND 286OFNDIALOG_EXPLORER 287OFNDIALOG_NOPLACESBAR 287ONLYONETABLE 287PHANTOMSPACEREPRESENTATIONCODE287PROJECTBACKUP 287PRVRECT_HEIGHT 287PRVRECT_LEFT 287PRVRECT_TOP 287PRVRECT_WIDTH 287PRVZOOM_HEIGHT 287PRVZOOM_LEFT 287PRVZOOM_PERC 288PRVZOOM_TOP 287PRVZOOM_WIDTH 287REALTIME 288RESOLUTIONCOMPATIBLETO9X 288RETREPRESENTATIONCODE 288SCALABLEFONTSONLY 288SETCREATIONINFO 288SHOWPREDEFVARS 288SKIPRETURNATENDOFRTF 289SORTVARIABLES 289SPACEOPTIMIZATION 289STORAGESYSTEM 289SUPERVISOR 290SUPPORTPAGEBREAK 290SUPPORTS_PRNOPTSTR_EXPORT 290TABLE_COLORING 290TABREPRESENTATIONCODE 290TABSTOPS 291UISTYLE 291UNITS 291USEBARCODESIZES 291USECHARTFIELDS 291USEHOSTPRINTER 292VARSCASESENSITIVE 292XLATVARNAMES 40, 124, 289, 292LL_OPTIONSTR_...CARD_PRJDESCR 296CARD_PRJEXT 272, 293CARD_PRNEXT 293CARD_PRVEXT 293CURRENCY 293DECIMAL 293DEFDEFFONT 281, 293EXPORTFILELIST 295EXPORTS_ALLOWED 294EXPORTS_ALLOWED_IN_PREVIEW 294EXPORTS_AVAILABLE 294FAX... 295HELPFILENAME 295LABEL_PRJDESCR 296LABEL_PRJEXT 296LABEL_PRNEXT 296LABEL_PRVEXT 296LICENSINGINFO 296LIST_PRJDESCR 296LIST_PRJEXT 296LIST_PRNEXT 296LIST_PRVEXT 296LLFILEDESC 296LLXPATHLIST 279, 297MAILTO 297MAILTO_BCC 297MAILTO_CC 297MAILTO_SUBJECT 298NULLVALUE 298PREVIEWFILENAME 298PRINTERALIASLIST 298PROJECTPASSWORD 298SAVEAS_PATH 299SHORTDATEFORMAT 299THOUSAND 299VARALIAS 299LL_PRINT_MULTIPLE_JOBS 251LL_PRINT_USERSELECT 27LL_PRNOPT_...COPIES 40, 250COPIES_SUPPORTED 237DEFPRINTERINSTALLED 237FIRSTPAGE 251JOBID 238JOBPAGES 251LASTPAGE 251OFFSET 249, 251PAGE 251PRINTDLG_DEST 253PRINTDLG_DESTMASK 251PRINTORDER 238429


IndexUNIT 238UNITS 253LL_PRNOPTSTR_...EXORT 254PRINTDST_FILENAME 254PRINTJOBNAME 254LL_PROJECT_CARD 34LL_PROJECT_LABEL 34LL_PROJECT_LIST 35LL_QUERY_DESIGNERACTIONSTATE 159LL_RTF 23LL_TEXT 20, 124LL_WRN_REPEAT_DATA (-998) 41, 393LlAddCtlSupport 166LlCreateSketch 166LlDbAddTable 50, 167LlDbAddTableRelation 50, 168LlDbAddTableSortOrder 50, 169LlDbSetMasterTable 170LlDebugOutput 171, 270LlDefineChartFieldExt 172LlDefineChartFieldStart 172, 244LlDefineField 173LlDefineFieldExt 174LlDefineFieldExtHandle 176, 200LlDefineFieldStart 177, 244LlDefineLayout 33, 131, 178LlDefineSortOrder 179LlDefineSortOrderStart 180LlDefineSumVariable 181LlDefineVariable 182LlDefineVariableExt 33, 183LlDefineVariableExtHandle 184LlDefineVariableExtHandle 200LlDefineVariableStart 40, 185, 245LlDesignerAddAction 186LlDesignerFileOpen 188LlDesignerFileSave 189LlDesignerGetOptionString 190LlDesignerInvokeAction 190LlDesignerProhibitAction 33, 191LlDesignerProhibitEditingObject 192LlDesignerProhibitFunction 193LlDesignerRefreshWorkspace 193LlDesignerSetOptionString 190, 194LlDlgEditLineEx 195LlDomCreateSubobject 63, 195LlDomDeleteSubobject 63, 196LlDomGetObject 62, 196LlDomGetProject 197LlDomGetProperty 64, 197LlDomGetSubobject 62, 198LlDomGetSubobjectCount 62, 199LlDomSetProperty 64, 199LlEnum...GetEntry 200GetFirstChartField 201GetFirstField 201GetFirstVar 202GetNextEntry 202LlExprError 158, 203LlExprEval 299LlExprEvaluate 204, 391LlExprFree 205LlExprParse 205LlExprType 206LlGetChartFieldContents 207LlGetDefaultProjectParameter 161, 208LlGetDlgboxMode 209LlGetErrortext 209LlGetFieldContents 210LlGetFieldType 210, 216LlGetNotificationMessage 134, 211LlGetOption 211LlGetOptionString 212, 297LlGetPrinterFromPrinterFile 213LlGetSumVariableContents 214LlGetUsedIdentifiers 215LlGetUserVariableContents 215LlGetVariableContents 216LlGetVariableType 216, 217LlGetVersion 217LlJobClose 31, 218LlJobOpen 19, 28, 31, 212, 218, 274, 275LlJobOpenLCID 19, 212, 219, 275LlPreviewDeleteFiles 46, 220LlPreviewDisplay 46, 221, 391, 423LlPreviewDisplayEx 221LlPreviewSetTempPath 45, 222LlPrint 39, 41, 42, 43, 223, 229, 257LlPrintAbort 37, 224LlPrintCopyPrinterConfiguration 225LlPrintDbGetCurrentRelation 54LlPrintDbGetCurrentTable 52, 226LlPrintDbGetCurrentTableRelation 227LlPrintDbGetCurrentTableSortOrder 54, 227LlPrintDbGetRootTableCount 226LlPrintDeclareChartRow 228LlPrintDidMatchFilter 229LlPrintEnableObject 131, 229, 391LlPrintEnd 46, 230, 295, 423LlPrinterSetup 231LlPrintFields 41, 229, 232, 257LlPrintFieldsEnd 233LlPrintGetChartObjectCount 234LlPrintGetCurrentPage 234LlPrintGetFieldCharsPrinted 235LlPrintGetFilterExpression 235LlPrintGetItemsPerPage 236LlPrintGetItemsPerTable 236LlPrintGetOption 237LlPrintGetOptionString 238, 402, 406LlPrintGetPrinterInfo 239LlPrintGetProjectParameter 161, 240LlPrintGetRemainingItemsPerTable 240, 241LlPrintGetSortOrder 242430


IndexLlPrintIsChartFieldUsed 173, 243LlPrintIsFieldUsed 40, 178, 244, 391LlPrintIsVariableUsed 40, 186, 245, 391LlPrintOptionsDialog 37, 232, 246, 294LlPrintOptionsDialogTitle 37, 247, 294LlPrintResetObjectStates 247LlPrintResetProjectState 248, 390LlPrintSelectOffset 249, 402LlPrintSelectOffsetEx 249, 402LlPrintSetBoxText 249, 257, 390LlPrintSetOption 249, 250, 256LlPrintSetOptionString 254, 402, 406LlPrintSetProjectParameter 161, 255LlPrintStart 45, 255, 402, 423LlPrintWillMatchFilter 257LlPrintWithBoxStart 28, 45, 256, 258, 402, 423LlProjectClose 260LlProjectOpen 260LlProjectSave 262LlRTFCopyToClipboard 264LlRTFCreateObject 263LlRTFDeleteObject 263LlRTFDisplay 265LlRTFEditObject 266LlRTFEditorInvokeAction 267LlRTFEditorProhibitAction 268LlRTFGetText 268LlRTFGetTextLength 263LlRTFSetText 269LlSelectFileDlgTitleEx 37, 269, 402LlSetDebug 123, 270, 395LlSetDefaultProjectParameter 161, 272LlSetDlgboxMode 273LlSetFileExtensions 274LlSetNotificationCallback 131, 275LlSetNotificationCallbackExt 276LlSetNotificationMessage 134, 277LlSetOption 28, 38, 40, 278, 391, 392LlSetOptionString 38, 213, 275, 293LlSetPrinterDefaultsDir 300, 396LlSetPrinterInPrinterFile 213, 301, 402, 406LlSetPrinterToDefault 302LlStgsys...Append 305, 310, 311, 323Convert 306, 322DeleteFiles 307DestroyMetafile 307DrawPage 308GetAPIVersion 309GetFilename 309GetFileVersion 310GetJobCount 311GetJobOptionValue 311, 403GetLastError 312GetPageCount 312GetPageMetafile 313GetPageOptionString 314, 315, 320, 403GetPageOptionValue 316GetPagePagePrinter 317GetPagePrinter 317PageGetOptionValue 313PageSetOptionString 315, 323Print 318SetJob 320SetPageOptionString 321StorageClose 322StorageConvert 322StorageOpen 323StoragePrint 323StoragePrint 323LLVIEW12.EXE 389LlViewerProhibitAction 302LlXGetParameter 303LlXSetParameter 304LoadFinished 383Logische Variablen 22Lokalisierung von Projekten 50, 299LS_OPTION_...PRINTERCOUNT 312UNIT 311LsMailConfigurationDialog 325LsMailConfigurationDialog 325LsMailGetOptionString 326LsMailJobClose 326LsMailJobOpen 327LsMailSendFile 328LsMailSetOptionString 326, 328LsSetDebug 329MMail 378, 382MAPI 379Maßeinheit 291Mehrere Tabellen 42Menü 208, 240, 255, 302MENUID.TXT 146, 191, 267, 268, 303, 384Menü-IDs 146Menüpunkte 186, 190, 191MHTML 345Multi Mime HTML 345Multitabellen 49Multitasking-Overhead 38NNachricht 134Nachrichten 131Nachrichtenschleife 36NETSiehe .NETNotifications 131NULL-Werte 20, 298Numerische Variablen 21431


IndexOObjekt-Container 131OCX-KomponenteDatenübergabe 109Designer-Funktionen 112Designer-Objekte 115Einbindung 107Ereignisse 110Print- und Design-Methode 108Sprachwahl 110Vorschaucontrol 110Vorschau-Dateien 111OCX-Viewer-Control 383Onlinehilfe 141Optionen 278PParameter 123, 391Parameterprüfung 119Passwort 298PDF 356Pfadangaben 15, 123Preview 45, 391Previewdateien 305Preview-Dateien 396Preview-Fenster 32, 221Preview-Skizze 270Print 16, 25Progress 120Projektparameter 161Projekttypen 17Property 'Pages' 387Puffer 123RRedistribution 12Registrierung des Viewers 383, 389Representationcodes 125RTF 23, 40, 280, 285, 351, 398, 400RTF Variablen 23RTF-Editor aufrufen 263Rückgabewert 123Rückgabewerte 123Rundung 124SSchriftart 281, 283, 288, 293scLlCallback 134Seitenumbruch 42, 223, 232, 290Seitenvorschub 223Seitenzahl 251Serienbriefe 248432Serverlizenzen 86Skizze 18SMTP 379Sortierung 242Sortierungsliste 180Spline 132Spoolers 238Sprache 212Sprachen 14Startseite 251Subreport 49Subreports 285Summenberechnung 279Summenvariable 181, 214Summenvariablen 124Support 425Systemvorraussetzung 15TTabellen 19Tabellen, mehrere 49Tausenderzeichen 299Temporärpfad 222Text 368Textvariablen 20TIFF 373Toolbar-Button Designer 151Toolbar-Button Preview 140, 155TTY 367, 372Typen 20UUnicode 127Komponenten 127Unterbericht 49User-Objekte 131, 132VVariablen 19Variablenpuffer 32, 185Variablentypen 20VCL-KomponenteDatenbindung 95Datenübergabe 99Designer-Funktionen 103Designer-Objekte 105Einbindung 95Ereignisse 100Print- und Design-Methode 98Relationale Verknüpfungen 97Sprachwahl 100Vorschaucontrol 101Vorschau-Dateien 101


IndexVDF 120Verkettete Objekte 43Verkettung 44Verschlüsselung 298Versionsnummer 217Viewer Applikation 389Viewer OCX 383'AsyncDownload' 383'BackColor' 383'CanClose' 385'CurrentPage' 384'Enabled' 383'FileURL' 384'GetOptionString' 385'GotoFirst' 385'GotoLast' 385'GotoNext' 385'GotoPrev' 385'PageChanged' 387'Pages' 384'PrintAllPages' 385'PrintCurrentPage' 385'PrintPage' 385'RefreshToolbar' 385'SaveAs' 385'SaveAsFilePath' 385'SendTo' 385'SetOptionString' 386'SetZoom' 385'ShowThumbnails' 385'ToolbarButtons' 384'ToolbarEnabled' 384'Version' 385'ZoomReset' 385'ZoomRevert' 385'ZoomTimes2' 385Viewer OCX Control 383Visual Basic 119, 120, 121Visual C++ 120Visual dBase 120Visual FoxPro 120Vorschau 45, 221Vorschaudatei 223Vorschaudateien 396Vorzeitiger Seitenumbruch 42WWährungssymbol 284, 293Webreporting 86, 424Webserverlizenzen 86Weitergabe 12weitergebbare Dateien 15WIN.INI 302Windows-Callback 133XXbase++ 120XLS 360XMAPI 379XP Look & Feel 291ZZeichenketten 121, 123Zeichnungsvariablen 23Zoomfaktor 288Zwischensummen berechnen 45433

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!