Agenda ActiveX ein kleiner Rundgang! OOP richtig angewandt Xbase Parts Owner-Drawing-Beispiele Dateien im Netz das ewige Thema!
Windows WMI mit SL1 Windows Management Instrumentation. Einsatzgebiete Hardware: Win32_1394Controller, Win32_BaseBoard,Win32_Battery,Win32_BIOS,Win32_Bus,Win32_CacheMemory,Win32_CDROMDrive,Win32_CurrentProbe,Win32_DesktopMonitor,Win32_DeviceMemoryAddress, Win32_DiskDrive,Win32_DisplayConfiguration,Win32_DisplayControllerConfiguration,Win32_DMAChannel,Win32_Fan, Win32_FloppyController,Win32_FloppyDrive,Win32_HeatPipe,Win32_IDEController,Win32_InfraredDevice,Win32_IRQResource, Win32_Keyboard,Win32_MemoryArray,Win32_MemoryDevice,Win32_MotherboardDevice,Win32_NetworkAdapter,, Win32_PowerManagementEvent,Win32_Printer Win32_PrinterConfiguration, Win32_PrintJob,Win32_Processor... Software: Win32_Account,Win32_AccountSID,Win32_ACE,Win32_BaseService,Win32_BootConfiguration,Win32_ClassicCOMClass, Win32_ClassicCOMClassSetting,Win32_CodecFile,Win32_COMApplication,Win32_COMClass,Win32_ComponentCategory,Win32_Group, Win32_LoadOrderGroup,Win32_LogicalDisk,Win32_LogicalFileSecuritySetting,Win32_LogicalMemoryConfiguration, Win32_LogicalProgramGroup,Win32_LogicalProgramGroupItem,Win32_LogicalShareSecuritySetting,Win32_NetworkClient, Win32_NetworkConnection,Win32_NetworkLoginProfile,Win32_NetworkProtocol,Win32_NTEventlogFile,Win32_NTLogEvent, Win32_OperatingSystem,Win32_OSRecoveryConfiguration,Win32_PageFile,Win32_PageFileSetting,Win32_PageFileUsage, Win32_PrivilegesStatus,Win32_Process,Win32_ProcessStartup,Win32_ProgramGroup,Win32_ProgramGroupOrItem, Win32_QuickFixEngineering,Win32_Registry,Win32_RegistryAction,Win32_Service,Win32_Share... Applications: Win32_Patch, Win32_PatchPackage,Win32_Product,Win32_ProgIDSpecification,Win32_Property, Win32_PublishComponentAction,Win32_RemoveFileAction, Win32_RemoveIniAction,Win32_SelfRegModuleAction, Win32_ServiceControl,Win32_ServiceSpecification,Win32_ShortcutAction,Win32_ShortcutSAP,Win32_SoftwareElement, Win32_SoftwareElementCondition, Win32_SoftwareFeature,Win32_SoftwareFeatureAction,,Win32_TypeLibraryAction... Wann immer Sie etwas über die Platform wissen wollen, kann dies im Regelfall mit WMI ermittelt werden. WMI gibt es seit Windows 2000 (Server) und Windows XP (Workstation) Hunderte von Beispielen unter: http://www.activexperts.com/activmonitor/windowsmanagement/wmi/samples/
WMI in der Praxis Beispiel: Batterie-Status http://www.activexperts.com/activmonitor/windowsmanagement/wmi/samples/hw/#win32_battery.htm Set objwmiservice = GetObject("winmgmts:\\" & strcomputer & "\root\cimv2") Set colitems = objwmiservice.execquery("select * from Win32_Battery",,48) For Each objitem in colitems Wscript.Echo "BatteryRechargeTime: " & objitem.batteryrechargetime Wscript.Echo "BatteryStatus: " & objitem.batterystatus Wscript.Echo "Caption: " & objitem.caption Wscript.Echo "DeviceID: " & objitem.deviceid Wscript.Echo "EstimatedChargeRemaining: " & objitem.estimatedchargeremaining Wscript.Echo "EstimatedRunTime: " & objitem.estimatedruntime... Mit Xbase++ 1.90 SL1 // Ermitteln des Informations-Knotens im WMI Baum owmiservices := GetObject( "WinMgmts:\\localhost\Root\CIMV2" ) // Dann die Abfrage über den Information-Token obat := owmiservices:execquery("select * from Win32_Battery",,48) // Com-Collection nach Array abatt := {} ComEvalCollection(oBat, { oi AAdd( abatt, oi )} ) // Batterie Status? abatt[1]:deviceid? abatt[1]:estimatedruntime,"minutes left"? abatt[1]:estimatedchargeremaining,"charge % remaining Beispiel
MS Word und MS Excel einbetten Problem: MS Word und Excel sind OCX-Documente und keine ActiveX Controls OCX oder auch Object Embedding hat sich auf der Windows-Plattform nie durchgesetzt, weil es sehr komplex ist. Einzig und allein VB6 hat dies wirklich beherrscht. Wir sind nicht allein!.net beherrscht ActiveX nur in einem begrenzten Umfang via COMInterop Die Implementierung eines OCX-Containers in C++ ist die Arbeit von Monaten. Delphi OCX-Unterstützung funktioniert nicht zuverlässig Lösung: Nutzung des XbpHTMLViewers(), also des Internet Explorers als ActiveX Control, welches gegenüber MS Word und Excel als OCX Host auftritt. Probleme: Fokusmanagement inkorrekt. Toolbars und Menüs werden nicht angezeigt Manchmal öffnen sich Dokumente ausserhalb des Explorers IE ist instabil und bleibt beim Einbetten von Word, Acrobat oder Excel gerne hängen.
MS Word oder Excel, jetzt aber richtig! Lösung: Developer Support Office Framer Control von Microsoft. Der dsoframer ist eine speziell entwickelte ActiveX Control, welche einzig und allein dazu da ist, als OCX Host für OCX Dokumente aufzutreten Microsoft Knowledgebase Q311765 Vorgehensweise mit Xbase++ Beispiel
Sonstiges Tablet PC-SDK Handschrift- und Gestenerkennung Beispiel Codejock Xtreme Suite UI Komponenten mit Roger Donnay arbeitet zur Zeit an einem Add-On, welches die Nutzung von Codejock zum Kinderspiel macht!
Sonstiges Tablet-PC SDK Handschrifterkennung und Gesten Beispiel CodeJock Xtreme-Suite UI Komponenten mit Roger Donnay arbeitet zur Zeit an einem Add-On, welches die Nutzung von Codejock zum Kinderspiel macht!
Sonstiges Tablet PC-SDK Handschrift- und Gestenerkennung Beispiel Codejock Xtreme Suite UI Komponenten mit Skinning Nachteile von ActiveX: Im Regelfall benötigen ActiveX Controls ein vielfaches an Resourcen verglichen mit einem Xbase Part Die meisten Controls sind nicht multithreading-fähig. Also immer nur von einem Thread aus benutzen. Viele Controls sind leider nur von mittelmässiger Qualität. Sie sehen toll aus, führen aber zu Programmabstürzen, Hängern udgl. Deployment und Wartung erfordern besondere Aufmerksamkeit.
OOP, aber richtig! PROTECTED vs. EXPORTED PROTECTED: Implementierung EXPORTED: Schnittstellen Regelsätze: So wenig wie möglich exportieren. Wer alles exportiert, sorgt für unwartbare Anwendungen mit schlechter Qualität. Chaos regiert! Exportierte Members (VAR und METHODEN) stellen eine Einheit dar. Man spricht hier von einem Kontrakt/Vertrag/Interface. Eine Schnittstelle (Interface) ist eine Garantie, die eine Klasse den Nutzern derselben gibt. Beispiel Eine Klasse kann mehrere dieser Interfaces haben. Jedes Interface sollte einen eigenen Namen haben. Interfaces werden in Xbase++ durch abstrakte Basisklassen vereinbart Eine Prüfung, ob eine Klasse ein Interface unterstützt, kann dann mittels :IsDerivedFrom( interfacename ) erfolgen. Merke: EXPORTED Members sind für die Klienten/Nutzer der Klassen. Sie stellen die Anwendungsschnittstelle einer Klasse dar und sollten niemals Ihre Semantik/Verhalten ändern! Merke: PROTECTED Members sind Bestandteil der Implementierung einer Klasse. Diese stehen nur dieser Klasse oder davon abgeleiteten Klassen zur Verfügung!
OOP, jetzt aber erst recht! INTRODUCE versus OVERRIDE OVERRIDE: Standardverhalten von Xbase++. Neue Methode ersetzt Implementierung der Basisklassen INTRODUCE: Methode wird eingeführt, ändert aber kein Verhalten in Basisklassen FINAL: Alle zukünftigen Methoden in abgeleiteten Klassen sind standardmäßig INTRODUCE und ersetzen nicht das Verhalten dieser Klasse. Regelsätze: Das Standardverhalten OVERRIDE ist ausreichend für die meisten Fälle des Alltages Methoden, die in abgeleiteten Klassen nicht überladen werden dürfen/sollten, sind mit FINAL zu deklarieren. Nutzen Sie explizites OVERRIDE, wenn Sie bewusst in eine Basisklasse einbrechen wollen. Nutzer einer Klassenbibliothek sollten INTRODUCE verwenden, um unbeabsichtigtes Verändern von Verhalten der Basisklassen-Methoden zu verhindern. INTRODUCE kann auch benutzt werden, um eine neue semantische Ebene innerhalb eines Klassenframeworks aufzubauen. Merke: FINAL am besten für alle Methoden eines Klassenframeworks verwenden, die etwas mit der Integrität des selbigen zu tun haben. Merke: INTRODUCE für Methoden, bei denen man nicht weiß, ob diese nicht schon in einer Basisklasse existieren. OVERRIDE wenn Sie trotz FINAL das Verhalten einer Basisklasse ändern wollen.
Xbase Parts und Owner-Drawing Grundsätzlich ist Owner-Drawing ein Verfahren, das es dem Entwickler erlaubt, das visuelle Erscheinungsbild eines UI-Elements selbst zu zeichnen. Um ein Vielfaches schneller als :Paint() Konsumiert kein Window Handle Hier nun vier Beispiele: XbpImageScroller() XbpButton(),XbpTab() XbpPercentageColumn() Integration in Form Designer xppfd.dat Beispiel
Xbase Parts und Owner-Drawing Grundsätzlich ist Owner-Drawing ein Verfahren das es den Entwickler erlaubt das Visuelle Erscheinungsbild eines UI Elements selbst zu zeichnen. Um ein vielfaches schneller als :Paint() Konsumiert kein Window-Handle Hier nun vier Beispiele: XbpImageScroller() XbpButton(),XbpTab() XbpPercentageColumn() Integration in Form-Designer xppfd.dat Xbase Part Owner-Drawing-Beispiele in 100% PRG Code. Voll designfähig im FormDesigner! Hier Pushbutton Beispiel mit Text und Icon/Bitmap
Xbase Parts und Owner-Drawing Grundsätzlich ist Owner-Drawing ein Verfahren das es den Entwickler erlaubt das Visuelle Erscheinungsbild eines UI Elements selbst zu zeichnen. Um ein vielfaches schneller als :Paint() Konsumiert kein Window-Handle Hier nun vier Beispiele: XbpImageScroller() XbpButton(),XbpTab() XbpPercentageColumn() XbpGradientColumn() abgeleitet von Integration in Form-Designer xppfd.dat XbpColumn(). Mittels Owner-Drawing wird der prozentuale Wert als Gradientbalken gezeichnet. Beispiel
MS File System-QUIZ Frage: Welche wichtige Information des Dateisystems wird in Windows-Betriebssystemem standardmäßig nicht gecached?
MS File System-QUIZ Frage: Welche wichtige Information des Dateisystems wird in Windows-Betriebssystemem standardmäßig nicht gecached? Antwort: Lange Dateinamen Deshalb: Dateizugriff mit 8.3-Notation immer schneller, es sei denn, Sie haben InfoCacheLevel = 16 (0x10) Leider müssen Sie dies aber erst einschalten: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\MRxSmb\Parameters\InfoCacheLevel = 16 Q834350 und Q843418
OP Locking & Netzwerkstabilität Absolut notwendig OP Locking ausschalten. Microsoft Knowledgebase-ID: Q296264 Client: HKEY_LOCAL_MACHINE\System\CurrentControlSet\ Services\MRXSmb\Parameters\OplocksDisabled = 1 Server: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\LanmanServer\Parameters\ EnableOplocks = 0 Anti-Virus Software darf keine DBF/NTX/CDX/FPT/DBT- Dateien untersuchen. Power-Saving der Klient-Netzwerkkarte ausschalten Auto-Disconnet des Servers ausschalten net config server /autodisconnect:-1 (Q297684) Kein Vista ohne SP1 einsetzen!
I/O-Performance Typische Phänomene: USE von Tabelle oder Index dauert lange (~1s) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ LanmanServer\Parameters\SharingViolationDelay = 0 (default: 200) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ LanmanServer\Parameters\SharingViolationRetries = 0 (default: 5) DbAppend(), DbCommit() sind langsam HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ Lanmanworkstation\Parameters\DisableFlushOnCleanup = 1 Hardware Gute Switches und Router. Merke: Die Latenz und nicht die Bandbreite ist entscheidend! Schnelle Festplatten oder Raid 0-Verbund. Merke: Rotations- == Transaktionsgeschwindigkeit!
Abschließend! Der Vortrag sowie die meisten Beispiele wird es zum Download unter www.alaska-software.com geben. Die Owner-Drawing Beispiele müßen noch etwas überarbeitet werden. Wir plannen diese dann allen aktiven Subskriptionskunden kostenlos zur Verfügung zu stellen. Netzwerk & Server-Infrastrukturen entscheiden zu einem erheblichen Teil über die Performance und Stabilität der Anwendungen. Dies gilt ebenso für Client/Server-basierte Lösungen es sind dann nur andere Probleme. Viel Spass beim Arbeiten mit Xbase++ 1.90 SL1 und den hier vorgestellten Lösungen.