VisualStudio1 - Customizing von Standardsoftware leicht gemacht

Page 1

.NET Entwicklung

PowerPivot ist sehr überzeugend

iCustomizer

Bereits in „Beta-Zeiten“ stellte der Microsoft Technical Evangelist Steffen Krause die Microsoft Plattform für Business Intelligence in einem beeindruckenden >CeBITVortrag< 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 TraumLösung für Self Service Business Intelligence, die sowohl ExcelProfis, Endnutzer als auch Administratoren 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 sorgsame 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 angenommen – nicht in Bezug auf das oben genannte Lösungsgespann (!). Der >Pressemitteilung< zu dieser von IBM unterstützten Studie mit dem Titel “Einsatz, Nutzung und Probleme von Business IntelligenceSoftware in mittelständischen, deutschen Unternehmen” kann in etwa entnommen werden, dass Großunternehmen fast flächendeckend 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, PowerPivot, SQL Server und SharePoint bedeutet dies genau das, was man im Rahmen einer neu einzuführenden Software allgemein zu erwarten hat: entweder werden Lösungen 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 Sinne im Design von Lösungen bzw. Lösungskombinationen. – Also mehr oder weniger an Kosten. Auf jeden Fall sollte man PowerPivot mit und ohne SharePoint ausprobieren. Es lohnt sich. Wer das PowerPivot-Fenster in Excel 2010 öffnet, wird viele Verbin-

Customizing von Standardsoftware leicht gemacht Hersteller von Standardsoftware möchten ihre Kunden zufriedenstellen und müssen dazu immer wieder Sonderwünsche realisieren. Das stellt Softwareentwickler in der ganzen Welt vor die Herausforderung, eine Vielzahl 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 Anpassungen aus unserer Software auszulagern. Ziel war es, die Standardsoftware frei von individuellem Code zu bekommen, um bei der Release-Planung und Durchführung 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 Funktionsumfang zu geben und Funktionen zu erstellen, die wir als Entwickler nicht vorgesehen haben. Der iCustomizer besteht aus zwei Teilen, einem Designer und einem Skripteditor. In die eigene Anwendung muss nur wenig Quelltext eingebaut werden, damit die Applikation zur Laufzeit den kundenindividuellen Code ausführen kann.

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

Marco Spilker

Marco Spilker

Marco Spilker ist Softwareentwickler beim Softwarehaus 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 damit seine Leidenschaft zum Beruf. Marco widmet sich seit 2003 der .NET-Programmierung und fühlt sich in diesem Technologieumfeld zu Hause. Entwicklungsumgebungen bekannt stehen dabei Hilfslinien zur Ausrichtung von Controls, eine Toolbox für neue Controls und ein PropertyGrid zum Editieren der Eigenschaften zur Verfügung. An Controls können graphische Anpassungen vorgenommen werden. So kann beispielsweise die Position von Feldern und Buttons, die Textfarbe oder ähnliches den eigenen Wünschen angepasst werden. Bei der Implementierung wurden die Klassen DesignSurface und DesignerHost aus dem Namespace System.ComponentModel.Design verwendet, so dass der gleiche Designmechanismus wie im Visual Studio genutzt wird. Es können neue Controls hinzugefügt werden, sowie vorhandenen Controls weitere Funktionen hinzugefügt werden, die ursprünglich nicht vorgesehen waren. Das geschieht über die Definition von EventHandlern. Sobald das Event eintritt, wird der Code ausgeführt (Abbildung 1). Zum Schreiben des Codes wird der Skripteditor genutzt. Im Skripteditor wird man beim Programmieren durch Autovervollständigung, Auswahlfelder möglicher Funktionen und farbliche Hervorhebung unterstützt, so dass diese Arbeit leicht von der Hand geht (s. Abbildung 2).

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


.NET Entwicklung

Abbildung 2: Als Entwickler wird man beim Programmieren durch Auswahlfelder effektiv unterstützt Zur Ausführungszeit werden die geschriebenen Skripte dynamisch kompiliert. Dabei kommt die C#-Version 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 integrieren, die dann mit dem Skriptcode, den Controls 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 gesamte .NET Infrastruktur.

Designer ist konfigurierbar Nach dem Starten des Designers hat man, wie bei Entwicklungsumgebungen üblich, ein PropertyGrid zur Verfügung, mit dem man die Eigenschaften der Controls und die Events der Controls verändern kann. Als Entwickler beim Hersteller können Sie festlegen, welche Änderungsmöglichkeiten Sie Ihren Kunden erlauben möchten (Kasten 1). Es gibt die zwei Grundeinstellung „alles erlaubt“ und „alles verboten“ und darüber

Kasten 1 Hersteller können den Designer konfigurieren und die Möglichkeiten der Kunden festlegen … es können gezielt die Änderungen an einzelnen Eigenschaften (Properties) von Steuerelementtypen 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 Elementen gefüllt werden. … Events können formularspezifisch benutzt werden. … die Speicherstreams für das Laden und Speichern der Customizings können umgeleitet werden. … dem Benutzer kann das Editieren von Skripten erlaubt oder verboten werden.

www.VisualStudio1.de

hinaus individuelle Einschränkungsmöglichkeiten für jedes Control und jeden Event. So lässt sich beispielsweise konfigurieren, dass alles erlaubt ist, aber der Zugriff auf ein Textfeld eines bestimmten Controls nicht. Ein Beispiel für die Konfigurationsmöglichkeiten 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äutert haben. Danach lässt sich der iCustomizer mit der festgelegten Tastenkombination in der eigenen Anwendung aufrufen.

Kasten 2 Integration des iCustomizers ins eigene Projekt 1) Einen Verweis auf die Assembly nGroup.FormCustomizer.dll hinzufügen. 2) Die Lizenzdatei nGroup.FormCustomizer.licx dem Projekt als eingebettete Ressource hinzufügen. Das bewirkt, dass beim Erstellen des Projektes der License Compiler lc.exe ausgeführt wird und die Lizenz in die Anwendung eingebettet wird. Es sind beim Endkunden keine weiteren Lizenzen bereitzustellen.

dungsmöglichkeiten mit Datenbanken der Klasse “Datawarehouse” vorfinden. In der oben erwähnten Studie wurde 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 sogar Spaß an der Arbeit bereitet. Jedenfalls geht es mir so. Mit dem kostenlosen PowerPivot AddIn stößt Excel 2010 in Richtung Enter prise - Datenaus wer tung vor. Die Grenze von 1 Million Datensä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 TechNetEvaluierungscenter<. Die Installation ist recht einfach. >Excel 2010 Samples für PowerPivot< gibt es im Download-Center. Um mit Excel 2010 und PowerPivot erstellte BI-Anwendungen in SharePoint auszuprobieren, ist einiges mehr nötig. Dabei ist ein Testszenario relativ einfach aufzubauen – z.B. mit einer virtuellen Maschine, für die mindestens 4 GB Arbeitsspeicher übrig sind. Die Zutaten sind Windows Server 2008 SP2 oder R2 (64-Bit), SQL Server 2008 R2, Excel 2010 und SharePoint Server 2010 Enterprise. Am einfachsten gestaltet sich selbstverstä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.aspx Ein Erlebnis wird es wirklich, wenn man seine Evaluierungsumgebung selbst aufbaut und zumindest die Samples in sein BI-Center hoch lädt. MindBusiness Blog www.mindbusiness.de

3) Die Konfigurationsdatei nGroup.FormCustomizer.dll.settings.config dem Projekt hinzufügen und die Option „In Ausgabeverzeichnis kopieren“ 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.

Microsoft Excel 2010 Pivot-Tabellen – 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 35

ISBN-13: 978-3-86645-678-5 www.microsoft-press.de


.NET Entwicklung

Best of .NET-Kicks

Integration in den Lebenszyklus der Anwendung „Was dem Einzelnen nicht möglich ist, das Vermögen viele.“ Dieses Zitat von Friedrich Wilhelm Raiffeisen 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 vorgestellt werden. Wer auch die eigenen Artikel auf der deutschen .NETKicks Seite veröffentlichen möchte kann den dazugehörigen Button auf seinen eigenen Seiten problemlos einbinden. Hierfür haben wir zahlreiche Anleitungen für die verschiedensten 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 konsumierender Entwickler überhaupt? Jürgen Gutsch fasst in diesem Artikel eine schon länger andauernde Diskussion, auch ein wenig selbstkritisch, zusammen.

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

Die Einstellungen des Windows Form Designers werden ganz am Anfang des Lebenszyklus getroffen, indem im Konstruktor der Form die vom Windows Form Designer erzeugte Methode InitializeComponent() 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

Listing 1 /// <summary> /// Is triggered whenever a Form is being set into the designing mode, and once for each Control. /// C an be used to change the designmode for specific Controls (see MainWindow. CustomizerChangeComponentDesignMode). /// I n 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> p ublic static void CustomizerChangeComponentDesignMode(object sender, GetComponentDesignMode EventArgs args) { // S ince we are setting the event in CustomizerActivating to trigger CustomizerChangeComponent DesignMode on the Form, there is no code here. // I f 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() { // t he Text property of a textbox should not be changeable in the Customizer, since it is set by business logic. C ustomizer.ControlDefaultDisableProperties.Set(typeof(TextBox), „Text“, DisablePropertySetting. Disable); // E nabled is also not allowed to be changed, because it could prevent from important buttons being pressed. C ustomizer.ControlDefaultDisableProperties.Set(typeof(Control), „Enabled“, DisablePropertySetting. Disable); // B y 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); }

http://mywp7.de/dnk_060

/// <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) { // N ote: 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. // O nly when the form is created while EnableDesignerForUser is true it will be possible to customize. Customizer.EnableCodeEditorForUser = allowScriptingForUser; Customizer.EnableDesignerForUser = allowCustomizingForUser; }

„In den frühen Morgenstunden ist aus einem Chemielabor eine Giftgas-Wolke entwichen.“, so oder so ähnlich kann man es hin und wieder im Radio hören. Klammheimlich 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ündigen 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ängen, wird hier sehr anschaulich erklärt. Ein absolutes Muss für Einsteiger in die Materie!

/// <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); }

http://mywp7.de/dnk_064 36


.NET Entwicklung 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 Methode OnHandleCreated(). Dieses stellt einen geeigneten 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 ausgewä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 gemeinsamen Basisklasse aller anpassbaren Forms zu überschreiben. So kann beispielsweise ein statisches Event FormCreating erstellt werden, dass das Erzeugen neuer Forms an einem zentralen Punkt der iCustomizerIntegration ü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 Windows Hook [1] die gesamte Anwendung auf das Versenden der Fensternachricht WM_CREATE zu überwachen. 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 Methode 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 speichert. Wird später der iCustomizing-Modus aktiviert und der Designer gestartet, kann damit die Form in diesen Zustand zurückversetzt werden und die Änderungen im Designer als Differenz (Customizing) abgespeichert 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 EnableDesignerForUser deaktivieren.

Laden von Customizings Nachdem sich der iCustomizer den Ursprungszustand der Form gemerkt hat, sucht er basierend auf dem Typnamen der Form nach einem vorher abgespeicherten Customizing. Dabei wird standardmäßig im Dateisystem gesucht. Der Ladevorgang lässt sich aber überschreiben 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. www.VisualStudio1.de

Best of .NET-Kicks

Listing 2 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 3 FormCreationObserver formCreationObserver = new FormCreationObserver(); formCreationObserver.FormCreating += FormCreating; formCreationObserver.StartObserving();

Jemand sagte einmal, dass man sich vor der Zukunft nicht verkriechen kann. Tatsächlich scheint die Zukunft uns bereits eingeholt zu haben, zumindest was die Browserstandards angeht. Denn obwohl noch einige Jahre vergehen werden bis das W3C den neuen HTML5-Standard fertigstellen 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

Listing 4 public static void FormCreating(object sender, EventArgs e) { Form form = sender as Form; Customizer.Attach(form); […] }

Starten des Designers Danach wird die Form normal geladen. Es kann nun jederzeit der Designmodus des iCustomizers aktiviert werden. Dazu muss die Methode Customizer.ActivateCustomizer() 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(hotKeyActivate Customizer, Customizer.ActivateCustomizer);

Beim Start des Designers wird der Urzustand der Form wiederhergestellt, der beim Anhängen des iCustomizers 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 gespeichert. Wie beim Laden kann auch hier eine eigene Speicherfunktionalitä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 Informationen über neu hinzugefügte Controls, die Hierarchie der Controls, die geänderten Eigenschaften der Controls, den Skriptingcode sowie die Eventbindungen.

Neustart der Form Anschließend wird der Designer beendet. Die vorgenommenen Ä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. 37

Der deutsche Wirtschaftsprofessor Hermann Simon schrieb in seinem Buch „Geistreiches für Manager“ einmal: „Eine gute Vision erwächst aus einer delikaten Balance zwischen Realitätssinn und Utopie. Vision ist das gerade noch Machbare.“ - Am Anfang steht also die Vision, doch was kommt als nächstes? Es genügt normalerweise nicht eine gute Idee zu haben. Für einen Softwareentwickler bedeutet das, dass er die Anforderungen seines Kunden festhalten muss um hieraus dann ein funktionelles Design 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 dennoch 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 geplant. Diese sollen alle diese Themen 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 Abläufe zu visualisieren. http://mywp7.de/dnk_063


.NET Entwicklung

Best of .NET-Kicks

„Wir haben es schon wieder getan!“ - „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 einmal 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öffentlichung unserer eigenen App: dotnet Kicks gibt es jetzt auch als kostenlose Anwendung für das Windows Phone! Neben dem eigentlichen 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 Informationen rund um die Aktion, und natürlich auch den Downloadlink, 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 erträglicher und kann Javascript schreiben. Wie, letzteres wussten Sie noch gar nicht? Dann könnte dieser Artikel von Jan Christian Selke genau das Richtige sein. Ohne viele Umschweife wird anhand eines einfachen Beispiels die Basisfunktionalitä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

Versteht man den iCustomizer als Verlängerung des Windows Forms Designers und der InitializeComponent() Methode, so könnten im normalen Ablauf des Ladens der Form vom Programmierer weitere Änderungen 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 empfehlenswert, die bearbeitete Form nach dem Customizing zu schließen und neu zu öffnen.

Praxisbeispiele Unsere Kunden und Partner nutzen die neuen Möglichkeiten des iCustomizer gerne und vielfältig. Sehr häufig werden Masken übersichtlicher gemacht und nicht benö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ätzlichen 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 Artikelkennzeichen mit Datenbankeinträgen verglichen, bevor sie gespeichert werden. Dadurch lässt sich die Datenqualität verbessern. Alle Beispiele wurden realisiert ohne am Programmcode der Standardanwendung irgendetwas Individuelles für einen Kunden zu entwickeln.

Als Beratungswerkzeug nutzbar Einige Hersteller von Standardsoftware, die den iCustomizer in ihre Produkte integriert haben, nutzen den iCustomizer als Beratungswerkzeug: In der Einführungsphase werden alle Modifikationswünsche des Kunden gesammelt. Nach der Einführung werden diese mit dem Kunden besprochen und gemeinsam entschieden, 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 entwickelt 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öglich, den eigenen Kunden und Partnern eine große Flexibilität bei der Anpassung von Standardsoftware an die eigenen Bedürfnisse zu erlauben. Gleichzeitig behält man als Hersteller die Kontrolle über den Programmcode und vereinfacht das Release-Management, weil Sonderentwicklungen außerhalb des Produkts durchgeführt werden können.

Links und Quellen

[1] http://msdn.microsoft.com/en-us/magazine/ cc188966.aspx [2] www.nGroup.info/iCustomizer

Development

Thomas Reinwart

Softwareentwicklung für Multicore Prozessoren 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 Anwendungen nutzen derzeit nur einen Kern aus, wenn sie auf einem Mehrkernprozessor ausgeführt werden, die Geschwindigkeit der Anwendung erhöht sich also nicht. Bei Betrachtung des Taskmanagers ist nur eine CPU auf fast 100%, die anderen führen keine Rechenoperation durch, von effektiver Ausnutzung der CPUs also keine Spur. Es muss also an der Anwendung selber etwas geändert werden um die optimale Prozessorverteilung zu erreichen, die Zeiten einer Single Thread Anwendung sind vorbei.

38

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 Applikation 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 Komplexität beim Design, beim Debuggen und beim Support. Etwa durch nicht thread safe Teilkomponenten, übergreifende Abschnitte und zeitliche Abhängigkeiten. Durch diese Komplexität kann es sogar dazu führen, dass die eigentlich zu lösende Aufgabe in der Businesslogik in den Hintergrund der Prioritäten gelangt. Ein Deadlock tritt dann auf, wenn zwei Threads abwechselnd auf eine Ressource warten müssen. Wenn man versucht sein Programm zu parallelisieren, müssen zuerst jene Abschnitte (Tasks) im Code gefunden werden, die eine parallele Abarbeitung


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.