5
34 Customizing von Standardsoftware leicht gemacht Hersteller von Standardsoftware möchten ihre Kunden zufriedenstellen und müssen dazu immer wieder Son- derwünsche realisieren. Das stellt Softwareentwickler in der ganzen Welt vor die Herausforderung, eine Viel- zahl unterschiedlicher Versionen warten zu müssen. Der Artikel beschreibt aus Entwicklersicht, welche Möglichkeiten das Produkt iCustomizer bietet, um zur Laufzeit den Programmablauf zu beeinflussen. Kunden oder Consultants können dann eigene Anpassungen an der Software vornehmen, ohne dass der Hersteller in den Sourcecode der Anwendung eingreifen muss. Als Entwickler einer ERP-Standardsoftware standen wir vor der Aufgabe, kundenspezifische Anpassun- gen aus unserer Software auszulagern. Ziel war es, die Standardsoftware frei von individuellem Code zu be- kommen, um bei der Release-Planung und Durchfüh- rung keine Rücksicht auf spezielle Kundenversionen nehmen zu müssen. Wir haben zu diesem Zweck den iCustomizer entwickelt, um unseren Partnern und Kunden Einflussmöglichkeiten in den Funktionsum- fang zu geben und Funktionen zu erstellen, die wir als Entwickler nicht vorgesehen haben. Der iCustomizer besteht aus zwei Teilen, einem De- signer und einem Skripteditor. In die eigene Anwen- dung muss nur wenig Quelltext eingebaut werden, damit die Applikation zur Laufzeit den kundenindivi- duellen Code ausführen kann. Designer und Skripteditor Der Designer ist ein Werkzeug, mit dem GUI-Ele- mente und Control-Eigenschaften bearbeitet werden oder neue Controls hinzugefügt werden. Wie aus den Entwicklungsumgebungen bekannt stehen dabei Hilfslinien zur Ausrichtung von Controls, eine Tool- box für neue Controls und ein PropertyGrid zum Edi- tieren der Eigenschaften zur Verfügung. An Controls können graphische Anpassungen vorge- nommen werden. So kann beispielsweise die Position von Feldern und Buttons, die Textfarbe oder ähnliches den eigenen Wünschen angepasst werden. Bei der Im- plementierung wurden die Klassen DesignSurface und DesignerHost aus dem Namespace System.Compo- nentModel.Design verwendet, so dass der gleiche De- signmechanismus wie im Visual Studio genutzt wird. Es können neue Controls hinzugefügt werden, so- wie vorhandenen Controls weitere Funktionen hin- zugefügt werden, die ursprünglich nicht vorgesehen waren. Das geschieht über die Definition von Event- Handlern. Sobald das Event eintritt, wird der Code ausgeführt (Abbildung 1). Zum Schreiben des Codes wird der Skripteditor ge- nutzt. Im Skripteditor wird man beim Programmieren durch Autovervollständigung, Auswahlfelder mögli- cher Funktionen und farbliche Hervorhebung unter- stützt, so dass diese Arbeit leicht von der Hand geht (s. Abbildung 2). .NET Entwicklung iCustomizer Marco Spilker ist Softwareentwickler beim Soft- warehaus nGroup GmbH & Co. KG in Hildesheim. Er ist für die Architektur der betriebswirtschaftlichen Software verantwortlich, berät in technologischen Fragen und dient als Anlaufstelle im internen Support. Der studierte Rechtswissenschaftler konvertierte zur Jahrtausendwende zum Informatiker und machte da- mit seine Leidenschaft zum Beruf. Marco widmet sich seit 2003 der .NET-Programmierung und fühlt sich in diesem Technologieumfeld zu Hause. Marco Spilker Marco Spilker Abbildung 1: Im Designer entwickelt man alle kundenspezifischen Anpassungen der Benutzeroberfläche PowerPivot ist sehr überzeugend Bereits in „Beta-Zeiten“ stellte der Microsoft Technical Evangelist Steffen Krause die Microsoft Platt- form für Business Intelligence in einem beeindruckenden >CeBIT- Vortrag< vor. Wenn man sich das so anschaut, ist das Gespann Excel 2010 mit dem PowerPivot Add-In (kostenlos), SQL Server 2008 R2 mit PowerPivot für SharePoint (CALs) und SharePoint Server 2010 Enterprise (CALs) eine Traum- Lösung für Self Service Business Intelligence, die sowohl Excel- Profis, Endnutzer als auch Admi- nistratoren absolut begeistern kann. Sind die Voraussetzungen für dieses Gespann geschaffen, ist das sicher so. Der Weg dorthin muss jedoch erst mal gegangen werden und erfordert eine sorg- same Planung, denn der Teufel steckt bekanntlich im Detail. Die Investitionen in Zeit, Equipment, Spezialisten und Software sind wahrscheinlich für viele der wunde Punkt. Eine aktuelle Studie der Technischen Universität Chemnitz und des Beratungshauses conunit hat sich dieses Themas angenom- men – nicht in Bezug auf das oben genannte Lösungsgespann (!). Der >Pressemitteilung< zu dieser von IBM unterstützten Studie mit dem Titel “Einsatz, Nutzung und Pro- bleme von Business Intelligence- Software in mittelständischen, deutschen Unternehmen” kann in etwa entnommen werden, dass Großunternehmen fast flächen- deckend BI-Lösungen einsetzen, während der Mittelstand noch Potenzial ausweist, wohingegen kleinere Unternehmen in Abwä- gung der Kosten-Nutzenrelation die Einführung eher scheuen. Für das Traumgespannt Excel, Power- Pivot, SQL Server und SharePoint bedeutet dies genau das, was man im Rahmen einer neu einzuführen- den Software allgemein zu erwar - ten hat: entweder werden Lösun- gen ersetzt oder kombiniert oder hybridisiert. Und dieser Prozess erfordert fundiertes Know How für die Planung in verschiedenen Disziplinen der Datenhaltung und -verarbeitung und im engeren Sin- ne im Design von Lösungen bzw. Lösungskombinationen. Also mehr oder weniger an Kosten. Auf jeden Fall sollte man Power - Pivot mit und ohne SharePoint ausprobieren. Es lohnt sich. Wer das PowerPivot-Fenster in Excel 2010 öffnet, wird viele Verbin-

VisualStudio1 - Customizing von Standardsoftware leicht gemacht

Embed Size (px)

DESCRIPTION

VisualStudio1 veröffentlicht "Customizing von Standardsoftware leicht gemacht"

Citation preview

Page 1: VisualStudio1 - Customizing von Standardsoftware leicht gemacht

34

Customizing von Standardsoftware leicht gemachtHersteller von Standardsoftware möchten ihre Kunden zufriedenstellen und müssen dazu immer wieder Son-derwünsche realisieren. Das stellt Softwareentwickler in der ganzen Welt vor die Herausforderung, eine Viel-zahl unterschiedlicher Versionen warten zu müssen. Der Artikel beschreibt aus Entwicklersicht, welche Möglichkeiten das Produkt iCustomizer bietet, um zur Laufzeit den Programmablauf zu beeinflussen. Kunden oder Consultants können dann eigene Anpassungen an der Software vornehmen, ohne dass der Hersteller in den Sourcecode der Anwendung eingreifen muss.

Als Entwickler einer ERP-Standardsoftware standen wir vor der Aufgabe, kundenspezifische Anpassun-gen aus unserer Software auszulagern. Ziel war es, die Standardsoftware frei von individuellem Code zu be-kommen, um bei der Release-Planung und Durchfüh-rung keine Rücksicht auf spezielle Kundenversionen nehmen zu müssen. Wir haben zu diesem Zweck den iCustomizer entwickelt, um unseren Partnern und Kunden Einflussmöglichkeiten in den Funktionsum-fang zu geben und Funktionen zu erstellen, die wir als Entwickler nicht vorgesehen haben.

Der iCustomizer besteht aus zwei Teilen, einem De-signer und einem Skripteditor. In die eigene Anwen-dung muss nur wenig Quelltext eingebaut werden, damit die Applikation zur Laufzeit den kundenindivi-duellen Code ausführen kann.

Designer und Skripteditor

Der Designer ist ein Werkzeug, mit dem GUI-Ele-mente und Control-Eigenschaften bearbeitet werden oder neue Controls hinzugefügt werden. Wie aus den

Entwicklungsumgebungen bekannt stehen dabei Hilfslinien zur Ausrichtung von Controls, eine Tool-box für neue Controls und ein PropertyGrid zum Edi-tieren der Eigenschaften zur Verfügung.

An Controls können graphische Anpassungen vorge-nommen werden. So kann beispielsweise die Position von Feldern und Buttons, die Textfarbe oder ähnliches den eigenen Wünschen angepasst werden. Bei der Im-plementierung wurden die Klassen DesignSurface und DesignerHost aus dem Namespace System.Compo-nentModel.Design verwendet, so dass der gleiche De-signmechanismus wie im Visual Studio genutzt wird.

Es können neue Controls hinzugefügt werden, so-wie vorhandenen Controls weitere Funktionen hin-zugefügt werden, die ursprünglich nicht vorgesehen waren. Das geschieht über die Definition von Event-Handlern. Sobald das Event eintritt, wird der Code ausgeführt (Abbildung 1).

Zum Schreiben des Codes wird der Skripteditor ge-nutzt. Im Skripteditor wird man beim Programmieren durch Autovervollständigung, Auswahlfelder mögli-cher Funktionen und farbliche Hervorhebung unter-stützt, so dass diese Arbeit leicht von der Hand geht (s. Abbildung 2).

.NET Entwicklung

iCustomizer

Marco Spilker ist Softwareentwickler beim Soft-warehaus nGroup GmbH & Co. KG in Hildesheim. Er ist für die Architektur der betriebswirtschaftlichen Software verantwortlich, berät in technologischen Fragen und dient als Anlaufstelle im internen Support. Der studierte Rechtswissenschaftler konvertierte zur Jahrtausendwende zum Informatiker und machte da-mit seine Leidenschaft zum Beruf. Marco widmet sich seit 2003 der .NET-Programmierung und fühlt sich in diesem Technologieumfeld zu Hause.

Marco Spilker

Marco Spilker

Abbildung 1: Im Designer entwickelt man alle kundenspezifischen Anpassungen der Benutzeroberfläche

PowerPivot ist sehr überzeugend

Bereits in „Beta-Zeiten“ stellte der Microsoft Technical Evangelist Steffen Krause die Microsoft Platt-form für Business Intelligence in einem beeindruckenden >CeBIT-Vortrag< vor. Wenn man sich das so anschaut, ist das Gespann Excel 2010 mit dem PowerPivot Add-In (kostenlos), SQL Server 2008 R2 mit PowerPivot für SharePoint (CALs) und SharePoint Server 2010 Enterprise (CALs) eine Traum-Lösung für Self Service Business Intelligence, die sowohl Excel-Profis, Endnutzer als auch Admi-nistratoren absolut begeistern kann. Sind die Voraussetzungen für dieses Gespann geschaffen, ist das sicher so. Der Weg dorthin muss jedoch erst mal gegangen werden und erfordert eine sorg-same Planung, denn der Teufel steckt bekanntlich im Detail. Die Investitionen in Zeit, Equipment, Spezialisten und Software sind wahrscheinlich für viele der wunde Punkt. Eine aktuelle Studie der Technischen Universität Chemnitz und des Beratungshauses conunit hat sich dieses Themas angenom-men – nicht in Bezug auf das oben genannte Lösungsgespann (!). Der >Pressemitteilung< zu dieser von IBM unterstützten Studie mit dem Titel “Einsatz, Nutzung und Pro-bleme von Business Intelligence-Software in mittelständischen, deutschen Unternehmen” kann in etwa entnommen werden, dass Großunternehmen fast flächen-deckend BI-Lösungen einsetzen, während der Mittelstand noch Potenzial ausweist, wohingegen kleinere Unternehmen in Abwä-gung der Kosten-Nutzenrelation die Einführung eher scheuen. Für das Traumgespannt Excel, Power-Pivot, SQL Server und SharePoint bedeutet dies genau das, was man im Rahmen einer neu einzuführen-den Software allgemein zu erwar-ten hat: entweder werden Lösun-gen ersetzt oder kombiniert oder hybridisiert. Und dieser Prozess erfordert fundiertes Know How für die Planung in verschiedenen Disziplinen der Datenhaltung und -verarbeitung und im engeren Sin-ne im Design von Lösungen bzw. Lösungskombinationen. – Also mehr oder weniger an Kosten.Auf jeden Fall sollte man Power-Pivot mit und ohne SharePoint ausprobieren. Es lohnt sich. Wer das PowerPivot-Fenster in Excel 2010 öffnet, wird viele Verbin-

Page 2: VisualStudio1 - Customizing von Standardsoftware leicht gemacht

35www.VisualStudio1.de

Zur Ausführungszeit werden die geschriebenen Skrip-te dynamisch kompiliert. Dabei kommt die C#-Versi-on des System.CodeDom.Compiler.CodeDomProvider zum Einsatz. Es steht damit die gesamte C#-Syntax und der vollständige Funktionsumfang von .NET zur Verfügung.

Im Skripteditor lassen sich auch eigene Assemblies oder Assemblies von Drittherstellern laden und in-tegrieren, die dann mit dem Skriptcode, den Cont-rols oder Events verknüpft werden können. Auf diese Weise ist quasi jede Anwendung integrierbar und der Skriptcode dient als Anknüpfungspunkt für die ge-samte .NET Infrastruktur.

Designer ist konfigurierbar

Nach dem Starten des Designers hat man, wie bei Ent-wicklungsumgebungen üblich, ein PropertyGrid zur Verfügung, mit dem man die Eigenschaften der Con-trols und die Events der Controls verändern kann. Als Entwickler beim Hersteller können Sie festlegen, wel-che Änderungsmöglichkeiten Sie Ihren Kunden erlau-ben möchten (Kasten 1). Es gibt die zwei Grundeinstel-lung „alles erlaubt“ und „alles verboten“ und darüber

hinaus individuelle Einschränkungsmöglichkeiten für jedes Control und jeden Event. So lässt sich bei-spielsweise konfigurieren, dass alles erlaubt ist, aber der Zugriff auf ein Textfeld eines bestimmten Controls nicht. Ein Beispiel für die Konfigurationsmöglichkei-ten finden Sie im [Listing1].

Integration des iCustomizers... ...in ein eigenes Windows Forms Projekt.

Mit wenigen Codezeilen lässt sich der iCustomizer in eigene Produkte integrieren. Zunächst sind einige Vorbereitungen notwendig, die wir in Kasten 2 erläu-tert haben. Danach lässt sich der iCustomizer mit der festgelegten Tastenkombination in der eigenen An-wendung aufrufen.

.NET Entwicklung

Hersteller können den Designer konfigurieren und die Möglichkeiten der Kunden festlegen… es können gezielt die Änderungen an einzelnen

Eigenschaften (Properties) von Steuerelementty-pen erlaubt oder verboten werden.

… der Designmodus für einzelne Controls oder Typen von Controls kann geändert oder gesperrt werden.

… die Toolbox kann mit formularspezifischen Ele-menten gefüllt werden.

… Events können formularspezifisch benutzt werden.

… die Speicherstreams für das Laden und Spei-chern der Customizings können umgeleitet werden.

… dem Benutzer kann das Editieren von Skripten erlaubt oder verboten werden.

Kasten 1

Integration des iCustomizers ins eigene Projekt 1) Einen Verweis auf die Assembly nGroup.Form-

Customizer.dll hinzufügen.2) Die Lizenzdatei nGroup.FormCustomizer.licx

dem Projekt als eingebettete Ressource hin-zufügen. Das bewirkt, dass beim Erstellen des Projektes der License Compiler lc.exe ausgeführt wird und die Lizenz in die Anwendung ein-gebettet wird. Es sind beim Endkunden keine weiteren Lizenzen bereitzustellen.

3) Die Konfigurationsdatei nGroup.FormCustomi-zer.dll.settings.config dem Projekt hinzufügen und die Option „In Ausgabeverzeichnis kopie-ren“ aktivieren, sowie in der app.config-Datei den Abschnitt nGroup.FormCustomizer. Properties.Settings eintragen.

4) In der Konfigurationsdatei kann ein Hotkey für den Aufruf des Bearbeitungsmodus des iCustomizers festgelegt oder deaktiviert werden. Außerdem kann dort das Verzeichnis angegeben werden, in dem die Dateien mit den Benutzeranpassungen gespeichert werden. Beide Mechanismen lassen sich auch im Code anpassen oder komplett überschreiben.

Kasten 2

Abbildung 2: Als Entwickler wird man beim Programmieren durch Auswahlfelder effektiv unterstützt

dungsmöglichkeiten mit Daten- banken der Klasse “Dataware- house” vorfinden.In der oben erwähnten Studie wur-de ermittelt, dass rund die Hälfte der befragten Unternehmen Excel für BI einsetzen. Wen wundert‘s? Excel ist eine annähernd intuitiv zu handhabende Software, die, hat man sich erst damit angefreundet, einen nicht mehr los lässt und so-gar Spaß an der Arbeit bereitet. Jedenfalls geht es mir so. Mit dem kostenlosen PowerPivot Add-In stößt Excel 2010 in Richtung Enterpr ise - Datenauswer tung vor. Die Grenze von 1 Million Da-tensätze wurde gesprengt, was man selbst am besten auf einer Windows-64-Bit-Plattform mit Excel 2010, dem >PowerPivot Add-In< und SQL Server 2008 R2 ausprobieren kann. Testversionen gibt es im >Microsoft TechNet-Evaluierungscenter<. Die Installa-tion ist recht einfach. >Excel 2010 Samples für PowerPivot< gibt es im Download-Center.Um mit Excel 2010 und PowerPi-vot erstellte BI-Anwendungen in SharePoint auszuprobieren, ist einiges mehr nötig. Dabei ist ein Testszenario relativ einfach auf-zubauen – z.B. mit einer virtuellen Maschine, für die mindestens 4 GB Arbeitsspeicher übrig sind. Die Zu-taten sind Windows Server 2008 SP2 oder R2 (64-Bit), SQL Server 2008 R2, Excel 2010 und Share-Point Server 2010 Enterprise. Am einfachsten gestaltet sich selbst-verständlich die Installation auf einem neuen SharePoint Server.Wem das zu viel Aufwand ist, kann sich zumindest eine Demo mit einigen Dashboards in Excel Web Access anschauen: http://www.powerpivot.com/demo.aspxEin Erlebnis wird es wirklich, wenn man seine Evaluierungsumgebung selbst aufbaut und zumindest die Samples in sein BI-Center hoch lädt.

MindBusiness Blogwww.mindbusiness.de

Microsoft Excel 2010 Pivot-Ta-bellen – Das Praxisbuch. Ideen, Lösungen für die Datenanalyse mit PivotTables, PivotCharts

268 Seiten (Hardcover) , Best.Nr.: MS-5678, erschienen 08/2011 bei Microsoft-Press, € 34,90

ISBN-13: 978-3-86645-678-5

www.microsoft-press.de

Page 3: VisualStudio1 - Customizing von Standardsoftware leicht gemacht

36

„Was dem Einzelnen nicht möglich ist, das Vermögen viele.“ Dieses Zitat von Friedrich Wilhelm Raiffei-sen gibt den Community-Gedanken wohl sehr treffend wieder. Deshalb sollen an dieser Stelle besonders lesenswerte Beiträge, die auf der deutschen Plattform dotnet-kicks.de in den letzten beiden Monaten veröffentlicht wurden, kurz vorge-stellt werden. Wer auch die eigenen Artikel auf der deutschen .NET-Kicks Seite veröffentlichen möchte kann den dazugehörigen Button auf seinen eigenen Seiten problem-los einbinden. Hierfür haben wir zahlreiche Anleitungen für die ver-schiedensten Systeme auf unserer Website veröffentlicht unter http://bit.ly/dnkButton - und hier nun das „best of“ der .NET-Kicks!

„Bringe dich in die Gemeinschaft ein. Jeder kann vom anderen lernen.“, hat schon Helga Schä-ferling erkannt. Und tatsächlich gibt es dank zahlloser Usergroups, Online-Communities und überall stattfindender Events kaum noch eine Möglichkeit sich der globalen Vernetzung zu entziehen. Doch wo hört der Aktivismus auf und fängt die Werbung in eigener Sache an? Gibt es nicht schon zu viele Events um noch an allen teilzunehmen – oder muss man das als konsu-mierender Entwickler überhaupt? Jürgen Gutsch fasst in diesem Ar-tikel eine schon länger andauernde Diskussion, auch ein wenig selbst-kritisch, zusammen.

http://mywp7.de/dnk_060

„In den frühen Morgenstunden ist aus einem Chemielabor eine Gift-gas-Wolke entwichen.“, so oder so ähnlich kann man es hin und wieder im Radio hören. Klamm-heimlich hat sich die Wolke am übermüdeten Praktikanten vorbei geschlichen und weg war sie. Die so genannten Linq-to-Events sind ebenfalls aus einem Labor, besser gesagt dem Microsoft DevLab, entwichen. Zwar haben sie es bis heute nicht ins Radio geschafft, aber Gregor Biswanger hat dem, besser unter dem Namen „Reactive Extensions“ (kurz Rx) bekannten, Experiment einen über zweistün-digen Webcast gewidmet. Was genau das ist und wie es einem das Leben enorm erleichtern kann bei der Arbeit mit asynchronen und auf Events basierenden Vorgän-gen, wird hier sehr anschaulich erklärt. Ein absolutes Muss für Einsteiger in die Materie!

http://mywp7.de/dnk_064

Best of .NET-Kicks

Integration in den Lebenszyklus der Anwendung

Man kann sich den iCustomizer als Verlängerung des Visual Studio Windows Form Designers zur Laufzeit vorstellen. Daher muss er zu einem möglichst schnel-len Zeitpunkt an die Form angehängt werden, nach-dem die vom Entwickler zur Designzeit getroffenen Einstellungen gesetzt werden.

Die Einstellungen des Windows Form Designers wer-den ganz am Anfang des Lebenszyklus getroffen, indem im Konstruktor der Form die vom Windows Form Designer erzeugte Methode InitializeCompo-nent() aufgerufen wird. Nach dem Ausführen dieser Methode befindet sich die Form in dem Zustand, der zur Designzeit im Designer festgelegt wurde. Danach werden gegebenenfalls vom Entwickler noch weitere

.NET Entwicklung

/// <summary> /// Is triggered whenever a Form is being set into the designing mode, and once for each Control. /// Can be used to change the designmode for specific Controls (see MainWindow.

CustomizerChangeComponentDesignMode). /// In this demo the event is also directed to the currently active Form and CustomizerChange

ComponentDesignMode does nothing. /// </summary> /// <param name=“sender“>The source of the event.</param> /// <param name=“args“>The <see cref=“nGroup.FormCustomizer.GetComponentDesignModeEventArgs“/>

instance containing the event data.</param> public static void CustomizerChangeComponentDesignMode(object sender, GetComponentDesignMode

EventArgs args) { // Since we are setting the event in CustomizerActivating to trigger CustomizerChangeComponent

DesignMode on the Form, there is no code here. // If there was a type of control to never be Customizeable at all, this would be a nice place to

declare it. ////if (args.Component is *ControlType*) args.DesignMode = ComponentDesignModes.None; } /// <summary> /// Disable specific properties for types of Controls. /// </summary> private static void ConfigureDisablePropertySettings() { // the Text property of a textbox should not be changeable in the Customizer, since it is set by

business logic. Customizer.ControlDefaultDisableProperties.Set(typeof(TextBox), „Text“, DisablePropertySetting.

Disable);

// Enabled is also not allowed to be changed, because it could prevent from important buttons being pressed.

Customizer.ControlDefaultDisableProperties.Set(typeof(Control), „Enabled“, DisablePropertySetting.Disable);

// By default everything is allowed to be changed. Above is the command to disable specific properties.

// You can also change the default by setting it to DisablePropertySetting.Disable. // Now ALL properties are not allowed to be changed. // Only properties allowed by setting DisablePropertySetting.Enable will be allowed to be changed. ////Customizer.ControlDefaultDisableProperties.Default = DisablePropertySetting.Disable; //// Customizer.ControlDefaultDisableProperties.Set(typeof(*ControlType*), „*PropertyName*“, nGroup.

FormCustomizer.DisablePropertySetting.Enable); }

/// <summary> /// Sets what kind of Customization the user is allowed to do. /// </summary> /// <param name=“allowCustomizingForUser“>Allow starting the customizer and doing UI changes.</param> /// <param name=“allowScriptingForUser“>Allow scripting.</param> public static void SetCustomizerAvailability(bool allowCustomizingForUser, bool allowScriptingForUser) { // Note: If EnableDesignerForUser is false while attaching a new Form the customization will be

loaded in show-only mode, which is faster. // T he user will not be able to change this forms customization even if the EnableDesignerForUser

value changes. // Only when the form is created while EnableDesignerForUser is true it will be possible to

customize. Customizer.EnableCodeEditorForUser = allowScriptingForUser; Customizer.EnableDesignerForUser = allowCustomizingForUser; } /// <summary> /// Adds a collection of controls to the Toolbox /// The controls can then be placed on a Form in designing mode. /// </summary> private static void AddToolboxItems() { Customizer.AddToolboxItem(typeof(Button), „Controls“, „Buttons“, true); Customizer.AddToolboxItem(typeof(TextBox), „Controls“, „Textboxes“, true); Customizer.AddToolboxItem(typeof(Label), „Controls“, „Textboxes“, true); Customizer.AddToolboxItem(typeof(CheckBox), „Controls“, „Buttons“, true); Customizer.AddToolboxItem(typeof(RadioButton), „Controls“, „Buttons“, true); Customizer.AddToolboxItem(typeof(GroupBox), „Container“, „Groupings“, true); Customizer.AddToolboxItem(typeof(Panel), „Container“, „Groupings“, true); Customizer.AddToolboxItem(typeof(SplitContainer), „Container“, „Groupings“, true); Customizer.AddToolboxItem(typeof(DataGrid), „Container“, „TableViews“, true); }

Listing 1

Page 4: VisualStudio1 - Customizing von Standardsoftware leicht gemacht

37www.VisualStudio1.de

Best of .NET-Kicks

Jemand sagte einmal, dass man sich vor der Zukunft nicht verkrie-chen kann. Tatsächlich scheint die Zukunft uns bereits eingeholt zu haben, zumindest was die Browserstandards angeht. Denn obwohl noch einige Jahre ver-gehen werden bis das W3C den neuen HTML5-Standard fertig-stellen wird, ist er heute schon in aller Munde. Flash und Silverlight spielen im Web keine Rolle mehr, wenn man den Browserherstellern und Webprogrammierern Glauben schenken darf. Was wirklich dran ist an dem Thema beleuchtet Kay Giza in diesem Artikel.

http://mywp7.de/dnk_061

Der deutsche Wirtschaftsprofessor Hermann Simon schrieb in seinem Buch „Geistreiches für Manager“ einmal: „Eine gute Vision erwächst aus einer delikaten Balance zwi-schen Realitätssinn und Utopie. Vision ist das gerade noch Mach-bare.“ - Am Anfang steht also die Vision, doch was kommt als nächs-tes? Es genügt normalerweise nicht eine gute Idee zu haben. Für einen Softwareentwickler bedeu-tet das, dass er die Anforderungen seines Kunden festhalten muss um hieraus dann ein funktionelles De-sign erarbeiten zu können. Welche Abläufe muss es später geben? Wie ist der logische Aufbau der Benutzeroberfläche? Wie halte ich das Design so robust und den-noch flexibel, dass es auf spätere Änderungen und Erweiterungen hin leicht angepasst werden kann? Diese, und noch viel mehr, Fragen hat sich Gregor Biswanger gestellt und eine Reihe von Artikeln ge-plant. Diese sollen alle diese The-men beleuchten und anhand eines praktischen Beispiels detailliert durchgegangen werden. In diesem ersten Teil wird die Architektur der Beispielanwendung aufgebaut, das Datenmodell erzeugt und der Prototyp für den fiktiven Kunden vorbereitet um die geplanten Ab-läufe zu visualisieren.

http://mywp7.de/dnk_063

Initialisierungen im Konstruktor programmiert oder aus dem Code heraus Eigenschaften der Form gesetzt, bevor diese angezeigt wird.

Verknüpfung des iCustomizer mit Forms

Das nächste Ereignis im Lebenszyklus der Form ist das Event HandleCreated bzw. das Ausführen der Me-thode OnHandleCreated(). Dieses stellt einen geeig-neten Zeitpunkt für das Anhängen des iCustomizers dar: alle Designzeit-Einstellungen sind getroffen, aber die Form wird noch nicht angezeigt.

Üblicherweise sollen alle Forms oder eine ausge-wählte Menge von Forms einer Anwendung für das Customizing zur Verfügung stehen. Damit nicht der Code jeder Form individuell angepasst werden muss, bietet es sich an, OnHandleCreated() in einer gemein-samen Basisklasse aller anpassbaren Forms zu über-schreiben. So kann beispielsweise ein statisches Event FormCreating erstellt werden, dass das Erzeugen neu-er Forms an einem zentralen Punkt der iCustomizer-Integration überwacht (siehe: Listing 2).

Als Alternative zur Basisklasse stellt der iCustomizer die Klasse FormCreationObserver bereit (siehe Listing 3). Diese Klasse erlaubt es, über einen lokalen Win-dows Hook [1] die gesamte Anwendung auf das Ver-senden der Fensternachricht WM_CREATE zu über-wachen. So kann für alle Forms der Anwendung ein FormCreating-Ereignis bereitgestellt werden, ohne an den Forms der Anwendung etwas zu verändern.

Wird man auf die eine oder andere Art und Weise über die Erstellung einer neuen Form benachrichtigt, so kann nun der iCustomizer im Eventhandler an die Form angehängt werden. Dazu muss die statische Me-thode Customizer.Attach() aufgerufen werden (siehe Listing 4).

Der iCustomizer merkt sich nun alle Eigenschaften der Form, indem er rekursiv über alle Controls iteriert und den Zustand der Property-Descriptoren spei-chert. Wird später der iCustomizing-Modus aktiviert und der Designer gestartet, kann damit die Form in diesen Zustand zurückversetzt werden und die Ände-rungen im Designer als Differenz (Customizing) abge-speichert werden.

Dieser Schritt ist also nur notwendig, wenn später ein Customizing der Form durchgeführt werden soll. Dieses lässt sich über die Eigenschaft EnableDesigner-ForUser deaktivieren.

Laden von Customizings

Nachdem sich der iCustomizer den Ursprungszustand der Form gemerkt hat, sucht er basierend auf dem Typ-namen der Form nach einem vorher abgespeicherten Customizing. Dabei wird standardmäßig im Dateisys-tem gesucht. Der Ladevorgang lässt sich aber über-schreiben und anpassen, indem ein Delegate für die Ladefunktionalität angegeben wird. Umgekehrt kann auch ein Delegate für das Speichern angegeben werden. Die Methoden müssen folgende Signaturen tragen:

Stream LoadCustomization(string customizingName);void SaveCustomization(string customizingName,Stream s);

Wurde vom iCustomizer ein Customizing für die eben geladene Form gefunden, so wird es im nächsten Schritt auf die Form angewendet. Dabei werden die im Customizing gespeicherten Eigenschaften gesetzt, die im Customizing enthaltenen Skripte kompiliert und als EventHandler mit den entsprechenden Events der Form und der Controls verbunden.

Starten des Designers

Danach wird die Form normal geladen. Es kann nun jederzeit der Designmodus des iCustomizers aktiviert werden. Dazu muss die Methode Customizer.Activa-teCustomizer() aufgerufen werden. Standardmäßig ist dieser Aufruf mit dem Hotkey Strg+F8 verknüpft. Dazu enthält der iCustomizer die Klasse HotKeyWatch, mit der sich beliebige anwendungsweite Hotkeys erstellen lassen.

HotKey hotKeyActivateCustomizer = new HotKey(„Control.F8“);HotKeyWatch.RegisterHotKey(hotKeyActivateCustomizer, Customizer.ActivateCustomizer);

Beim Start des Designers wird der Urzustand der Form wiederhergestellt, der beim Anhängen des iCus-tomizers in Customizer.Attach() gespeichert wurde. Dann wird der Designer angezeigt und die Form und der Skripteditor stehen zur Bearbeitung bereit.

Speichern des Customizings

Nach der Bearbeitung der Form und der Skripte wird das Customizing beim Schließen des Designers gespei-chert. Wie beim Laden kann auch hier eine eigene Spei-cherfunktionalität verwendet werden. Der iCustomizer ermittelt die Unterschiede zum Ursprungszustand und schreibt diese Differenz als XML in den Speicherstream. Das gespeicherte Customizing enthält dabei Informati-onen über neu hinzugefügte Controls, die Hierarchie der Controls, die geänderten Eigenschaften der Cont-rols, den Skriptingcode sowie die Eventbindungen.

Neustart der Form

Anschließend wird der Designer beendet. Die vorge-nommenen Änderungen und Skripte sind nun sofort aktiv. Allerdings könnte der Gesamtstatus der Form nicht mehr dem Zeitpunkt entsprechen, zu dem der Designer gestartet wurde. Zum Beispiel könnte der Benutzer den Status durch Interaktion mit der Form bereits verändert haben, bevor der Designer gestartet wurde.

.NET Entwicklung

public static event EventHandler FormCreating; protected override void OnHandleCreated(EventArgs e){ if (!this.RecreatingHandle) { EventHandler formCreating = FormCreating; if (formCreating != null) { formCreating(this, e); } }

base.OnHandleCreated(e);}

Listing 2

FormCreationObserver formCreationObserver = new FormCreationObserver();formCreationObserver.FormCreating += FormCreating;formCreationObserver.StartObserving();

Listing 3

public static void FormCreating(object sender, EventArgs e){ Form form = sender as Form;

Customizer.Attach(form);

[…]}

Listing 4

Page 5: VisualStudio1 - Customizing von Standardsoftware leicht gemacht

38

Best of .NET-Kicks

„Wir haben es schon wieder ge-tan!“ - „Nein!“ - „Doch!“ - „Oohh..“. Louis de Funes konnten wir leider nicht verpflichten, doch ein Video haben wir dennoch veröffentlicht! Wir - das heißt dotnet Kicks - hat vor über zwei Jahren schon ein-mal für viel Wirbel gesorgt mit einigen kryptischen Postkarten die an zahlreiche .NET-Entwickler gesendet wurden. Damals wurde die Geburtsstunde der Website eingeläutet. Und auch dieses mal sorgte das von uns selbst erstellte Video für einige Aufmerksamkeit. Doch wurde hier nicht der nächste Blockbuster im Kino angekündigt - auch wenn der Soundtrack und die Effekte dem in nichts nachstehen würden - sondern die Veröffent-lichung unserer eigenen App: dotnet Kicks gibt es jetzt auch als kostenlose Anwendung für das Windows Phone! Neben dem ei-gentlichen Video gibt es noch ein Resümee von Jan Welker über die vergangenen Jahre und das Team hinter dotnet Kicks. Auch kann man einen Blick hinter die Kulissen des Promo-Trailers werfen. Alle In-formationen rund um die Aktion, und natürlich auch den Download-link, findet man unter dem Tag „dnk“ auf der Website. Geil!

http://mywp7.de/dnk_065

Kaffee ist schon ein Wundermittel: Er vertreibt die Müdigkeit, macht den Montag Morgen ein wenig er-träglicher und kann Javascript sch-reiben. Wie, letzteres wussten Sie noch gar nicht? Dann könnte die-ser Artikel von Jan Christian Selke genau das Richtige sein. Ohne vie-le Umschweife wird anhand eines einfachen Beispiels die Basisfunk-tionalität von Coffeescript gezeigt und was man benötigt um es zum Laufen zu kriegen. Denn genau wie Kaffee uns hilft, unsere Arbeit schneller zu erledigen, kann man mit Coffeescript das Erstellen von Javascript deutlich beschleunigen.

http://mywp7.de/dnk_062

.NET Entwicklung

Versteht man den iCustomizer als Verlängerung des Windows Forms Designers und der InitializeCompo-nent() Methode, so könnten im normalen Ablauf des Ladens der Form vom Programmierer weitere Ände-rungen des Status vorgenommen worden sein, die sich jetzt nicht in der genau richtigen Abfolge wiederholen lassen. Die Form könnte sich also insgesamt in einem inkonsistenten Zustand befinden. Daher ist es emp-fehlenswert, die bearbeitete Form nach dem Customi-zing zu schließen und neu zu öffnen.

Praxisbeispiele

Unsere Kunden und Partner nutzen die neuen Möglich-keiten des iCustomizer gerne und vielfältig. Sehr häufig werden Masken übersichtlicher gemacht und nicht be-nötigte Eingabe- oder Ausgabefelder ausgeblendet. Mit neuen Reitern werden eigene Übersichtsseiten erstellt und die Informationen von verschiedenen Stellen der Applikation aufbereitet. Mit neuen Controls werden eigene Funktionalitäten eingebaut. Mit einem zusätzli-chen Schnellsuchfeld wurde das Durchsuchen von gro-ßen Tabellen erleichtert: alle Zeilen, die mit dem dort eingegebenen Suchbegriff übereinstimmen, werden farblich markiert. Auch Browserfenster werden gerne in die Applikation integriert: Diese lassen sich aufrufen, innerhalb der Applikation bedienen und Informationen übergeben, um Lieferanten- oder Kundeninternetseiten (Artikel, Adressen) sofort einzublenden.

Auch für Plausibilitätsprüfungen bei der Eingabe wird der iCustomizer verwendet: Hier werden zum Teil komplexe Prüfungen durchgeführt und Artikelkenn-zeichen mit Datenbankeinträgen verglichen, bevor sie gespeichert werden. Dadurch lässt sich die Datenqua-lität verbessern. Alle Beispiele wurden realisiert ohne am Programmcode der Standardanwendung irgendet-was Individuelles für einen Kunden zu entwickeln.

Als Beratungswerkzeug nutzbar

Einige Hersteller von Standardsoftware, die den iCus-tomizer in ihre Produkte integriert haben, nutzen den iCustomizer als Beratungswerkzeug: In der Einfüh-rungsphase werden alle Modifikationswünsche des Kunden gesammelt. Nach der Einführung werden die-se mit dem Kunden besprochen und gemeinsam ent-schieden, was angepasst werden soll. Auf diese Weise werden hauptsächlich Masken optimiert und Eingaben validiert, ohne dabei den Sourcecode verändern zu müssen. Änderungen werden dabei nicht vor Ort im Kundensystem vorgenommen, sondern in Ruhe entwi-ckelt und getestet und dann beim Kunden eingespielt. Die kundenspezifischen Anpassungen bleiben auch bei Updates funktionsfähig, können individuell gewartet werden und beeinflussen die Releasezyklen nicht.

Artikelende

Mit Werkzeugen wie dem iCustomizer[2] ist es mög-lich, den eigenen Kunden und Partnern eine große Flexibilität bei der Anpassung von Standardsoftware an die eigenen Bedürfnisse zu erlauben. Gleichzei-tig behält man als Hersteller die Kontrolle über den Programmcode und vereinfacht das Release-Manage-ment, weil Sonderentwicklungen außerhalb des Pro-dukts durchgeführt werden können.

Links und Quellen[1] http://msdn.microsoft.com/en-us/magazine/

cc188966.aspx

[2] www.nGroup.info/iCustomizer

Die Steigerung der Prozessortaktung hat physikalische Grenzen, ein Geschwindigkeitszuwachs einer einzelnen CPU, wie er in den letzten Jahren zu beobachten war, wird sich nicht so schnell fortsetzen. Stattdessen wird derzeit auf Parallelität der Prozessoren gesetzt, jeder am Markt angebotene Rechner ist mindestens ein Dual Prozessor. Die meisten vorhandenen Anwendun-gen nutzen derzeit nur einen Kern aus, wenn sie auf einem Mehrkernprozessor ausgeführt werden, die Ge-schwindigkeit der Anwendung erhöht sich also nicht. Bei Betrachtung des Taskmanagers ist nur eine CPU auf fast 100%, die anderen führen keine Rechenope-ration durch, von effektiver Ausnutzung der CPUs also keine Spur. Es muss also an der Anwendung selber etwas geändert werden um die optimale Prozessor-verteilung zu erreichen, die Zeiten einer Single Thread Anwendung sind vorbei.

Applikationsdesign

War der bisher erstellte Code eher sequentiell, sollte man sich nun beim Design Gedanken machen, welche Stellen im Code zur selben Zeit, d.h. auf mehrere CPUs verteilt, ablaufen können mit dem Ziel, Teile der Ap-plikation schneller laufen zu lassen.

Bisher standen Threads und Locks zur Verfügung, bei Verwendung dieser gibt es mit Steigerung des Code Umfanges auch einen Anstieg der Komplexi-tät beim Design, beim Debuggen und beim Support. Etwa durch nicht thread safe Teilkomponenten, über-greifende Abschnitte und zeitliche Abhängigkeiten. Durch diese Komplexität kann es sogar dazu führen, dass die eigentlich zu lösende Aufgabe in der Busi-nesslogik in den Hintergrund der Prioritäten gelangt. Ein Deadlock tritt dann auf, wenn zwei Threads ab-wechselnd auf eine Ressource warten müssen.

Wenn man versucht sein Programm zu parallelisie-ren, müssen zuerst jene Abschnitte (Tasks) im Code gefunden werden, die eine parallele Abarbeitung

Development Thomas Reinwart

Softwareentwicklung für Multicore Prozessoren