VFX13 Silverlight Workshop Venelina Jordanova Uwe Habermann [email protected] [email protected] Wer spricht denn da? * Venelina Jordanova * Master Degree in CS * FoxPro Entwicklerin seit FPD 2.0 * MCP für SQL Server und Application Architecture * Uwe Habermann * Diplom-Informatiker * FoxPro Entwickler seit FPW 2.5 * MCP für Visual FoxPro V&U Ltd. – We and You * Geschäftsführer: Venelina & Uwe * www.VandU.eu * [email protected] * Entwicklung in Varna, Bulgarien * Projekte mit VFP und Silverlight * Visual Extend, Silverswitch * Hohe Qualität zu günstigen Preisen * Microsoft Silverlight Partner Was steht an? * Donnerstag * 09:00 – 09:15 Begrüßung, Kaffee * 09:15 – 11:00 * 11:15 – 13:00 * 14:15 – 16:00 * 16:15 – 18:00 Was steht an? * Freitag * 09:00 – 09:15 Begrüßung, Kaffee * 09:15 – 11:00 * 11:15 – 13:00 * 14:15 – 16:00 * 16:15 – 18:00 Was steht an? * Vorbereitung von VFX für VFP Anwendungen auf die Migration nach Silverswitch * Migration einer VFX Beispielanwendung * Datenzugriff in Silverlight Anwendungen * Bearbeitung von Silverlight Formularen in Visual Studio Was steht an? * Geschäftslogik mit GUINEU implementieren * Verwendung eines VFP COM Servers * Eigenschaften des Anwendungsobjekts * Eigenschaften von Formularen * Programmierung mit C# Was steht an? * Silverlight Anwendungen als Desktop Anwendungen einsetzen * Veröffentlichung der Anwendung auf einem Internet Server Installation * Visual FoxPro 9, VFX 13 Build 1707 * Visual Web Developer 2010 Express oder Visual Studio 2010 * Silverlight 4 Tools * Silverlight 4 Toolkit * WCF RIA Services 1 SP 1 * Silverswitch 1 Build 0515 * Ggf. SQL Server Management Studio Installation * Get Silverswitch aus VFX 13 Menü * Ausführung * Startseite einstellen * „Silverswitch Version 01.00.0515“ Silverswitch * Rapid Application Development Entwicklungsumgebung für Silverlight * Silverswitch.sln * Migration von VFP Anwendungen * VFX – Silverlight Wizard * Visual Extend für VFP in C# nachgebaut Silverswitch * Datenbankformate * VFP Datenbanken * SQL Server Datenbanken * MySQL, ADS, DB2, Oracle, … Silverswitch * Programmierung * C# * VFP auf der Serverseite mit COM Server * Komfortabler Methodenaufruf auch von der Clientseite * VFP auf der Clientseite mit GUINEU * Ausführung auch auf Mac und künftigen Plattformen Silverswitch Was ist drin? * Vorlageanwendung Silverswitch.sln * Startseite * Assistenten * Update Project * VFX – Silverlight Wizard * In VFX für VFP enthalten Das erste Silverswitch Projekt * Neues Projekt * Silverswitch, Silverswitch * Nicht ausführen! * Nicht erstellen! Voraussetzungen für den VFX – Silverlight Wizard * Datenbank * Primärschlüssel für alle Tabellen * Empfohlen: Primärindex auf Integer Autoinc * Datenumgebung * Tabellen * Cursoradapter * Keine Ansichten * Kein programmatisches Öffnen von Tabellen Voraussetzungen für den VFX – Silverlight Wizard * Alle Steuerelemente im Formular * Kein nachträgliches instanziieren von Objekten zur Laufzeit * VFP Projekte * Basisklassen der Steuerelemente werden migriert * VFX Projekte * VFX Klassen der Steuerelemente werden migriert Voraussetzungen für den VFX – Silverlight Wizard * Code in VfxBusinessLogic.vcx * wird in COM Server migriert VFX – Silverlight Wizard * VFPizza13 in VFP öffnen * VFX – Silverlight Wizard starten VFX – Silverlight Wizard * Was macht dieser Assistent? * Erläuterung * VFP COM Server wird erstellt * Administratorrechte erforderlich! VFX – Silverlight Wizard * Auswahl einer Silverswitch Projektmappe VFX – Silverlight Wizard * Datenhaltung * ADO.NET Entity Data Model erstellen * Domänendienst erstellen * VFP COM Server erstellen und registrieren VFX – Silverlight Wizard * Einstellungen des Anwendungsobjekts * VFX Formulare in Vfxfopen eintragen VFX – Silverlight Wizard * Auswahl der Formulare * Als in das Projekt eingeschlossene Formulare werden standardmäßig migriert * VFX*.scx Formulare werden nicht migriert VFX – Silverlight Wizard * Projektnamen für Formulare * Formulare können beliebig in Projekten zusammengefasst werden * Optimierung der Projektgröße und damit der Downloadgröße und -zeit VFX – Silverlight Wizard * Auswahl der Formulareigenschaften * Gestaltung wie in VFP -> alle Eigenschaften übernehmen * Hard-codierte Eigenschaften können jedoch nicht von Designs überschrieben werden VFX – Silverlight Wizard * Auswahl der Berichte * Als in das Projekt eingeschlossene Berichte werden standardmäßig migriert VFX – Silverlight Wizard * Fertig! * Erfolgsmeldung oder Protokoll * Test! Eigenschaften der Silverswitch Anwendung * Vorbereiteter Rahmen für die Anwendung * Begrüßungsbild * Anmeldedialog optional * Symbolleiste mit XAML Icons * Data-driven Öffnen-Dialog * Internet Anwendung * Intranet Anwendung Eigenschaften der Silverswitch Anwendung * Benutzeranmeldung * Lokalisierung zur Laufzeit * Benutzerverwaltung * Benutzerrechte * Benutzergruppen * MDI Benutzeroberfläche Eigenschaften der generierten Formulare * Autoedit * Neu, Ändern, Löschen, Speichern, Rückgängig * Navigation * Sortierung und inkrementelle Suche im DataGrid * Resizable, minimieren, maximieren Eigenschaften der generierten Formulare * Parent/Child-Beziehungen * Behandlung von Aktualisierungskonflikten * Filterdialog Eigenschaften der generierten Berichte * Seitenkopf * Detailbereich * Seitenfuß Eigenschaften der generierten Berichte * Bezeichnungen * Textfelder * Linien * Rechtecke * Abgerundete Rechtecke Eigenschaften der generierten Berichte * Nicht migriert * Datenbindung von Bildern * PrintWhen * Code Was macht der VFX – Silverlight Wizard? * Formular dem Projekt hinzufügen * Eintrag in Vfxfopen * Migration von Formularen * MVVM Model-View-ViewModel * Trennung von Design und Programmierung Was macht der VFX – Silverlight Wizard? * Beispiel * Customer.xaml * Layout * Customer.xaml.cs * Einstellungen * CustomerViewModel.cs * Für eigenen Code * CustomerViewModelBase.cs * Generierter Code Was macht der VFX – Silverlight Wizard? * Customer.xaml * Beschreibung der Benutzeroberfläche * Kann Animationen enthalten * Kann Verhalten enthalten * Bearbeitung mit Expression Blend möglich * Designer darf keine Steuerelemente entfernen * Designer darf keine Namen ändern Was macht der VFX – Silverlight Wizard? * Customer.xaml.cs * Code zur Instanziierung * Formulareigenschaften Was macht der VFX – Silverlight Wizard? * CustomerViewModel.cs * Eigener Code * Erweiterung der Funktionalität * Wird vom VFX – Silverlight Wizard nicht überschrieben! Was macht der VFX – Silverlight Wizard? * CustomerViewModelBase.cs * Generierter Code * Funktionalität des Formulars * Parent/Child Verhalten * Wird vom VFX – Silverlight Wizard überschrieben! Was macht der VFX – Silverlight Wizard? * Generiert VFP COM Server * Datenzugriff auf VFP Datenbank mit Cursoradaptern * Config.vfx mit vollständigem Pfad * Mit Manage Config.vfx prüfen! * VfxBusinessLogic.vcx Datenzugriff * Silverswitch Client kommuniziert mit Domänendienst auf der Serverseite Datenzugriff * VFX – Silverlight Wizard generiert * Domänendienst * ADO.NET Entity Data Model * ADO.NET Entity Data Model Treiber stellt Verbindung zur Datenbank her * Verbindungszeichenkette in Web.Config im Projekt Silverswitch.Web * Inhalt von Web.config prüfen! Datenzugriff * VFX – Silverlight Wizard generiert * Domänendienst * VFP COM Server * Cursoradapter * VFP Datenbank * SQL Server Datenbank * Andere ODBC Datenquellen * Konfiguration in Config.vfx Mandantenauswahl * Auswahl der Datenbank beim Start * Zeigt Verbindungen aus Web.config * Zeigt Verbindungen aus Config.vfx * Anzeige, wenn mehr als eine Datenbank verfügbar ist * Anzeige, wenn Benutzeranmeldung erforderlich ist * Anzeige, wenn Benutzer angemeldet ist und Benutzerwechsel erfolgt Anmeldeverhalten * Keine Benutzeranmeldung * Nur erste Datenbank verfügbar * Optionale Benutzeranmeldung * Anwendung startet mit erster Datenbank * 1. Anmeldung erfolgt mit erster Datenbank * Folgeanmeldung zeigt Mandantenauswahl * Benutzeranmeldung erforderlich * Mandantenauswahl erscheint beim Start Datenzugriff * VFX-Anwendung und SilverswitchAnwendung mit Zugriff auf die gleiche Datenbank starten * Aktualisierungskonflikte testen Datenzugriff * Kunden können mit VFX-Anwendung weiterarbeiten * Silverswitch-Anwendung läuft auf gleicher Datenbank XAML * Extensible Application Markup Language * Sprache zur Beschreibung von Benutzeroberflächen * Verwendet für * Silverlight * Windows Presentation Foundation * Textformat wie XML XAML Designer * Visuelle Bearbeitung neu in Visual Studio 2010 * Bearbeitung von XAML Code möglich * Bearbeitung im Eigenschaftsfenster XAML Designer * Toolbox verwenden * Enthält Silverlight Basisklassen * Enthält Klassen aus geöffneter Projektmappe * automatisches Hinzufügen von Namespaces Aufbau einer XAML Datei * Formularklasse VfxDataForm * .xaml + .xaml.cs * XML Namespaces * Ggf. Child Formulare * LayoutRoot * Äußerer sichtbarer Container * Steuerelemente XAML * Ein Steuerelement muss keinen Namen haben * Ein Name ist nur erforderlich, wenn programmatisch darauf referenziert wird * Jeder Name muss in einer XAML Datei eindeutig sein * Flache Architektur * Keine Hierarchie Steuerelemente * Viele VFP Steuerelemente ähnlich auch in Silverlight 4 verfügbar * TextBox * TextBlock (Label) * Weitere Steuerelemente in Silverlight 4 Toolkit * NumericUpDown (Spinner) * AutoCompleteBox (PickField) Steuerelemente VFP Basisklasse Checkbox Combobox Commandbutton Silverlight Steuerelement CheckBox ComboBox Button Container Grid Label Grid data:DataGrid TextBlock Optiongroup Pageframe Spinner RadioButton control:TabControl inputToolkit:NumericUpDown Eigenschaften VFP Backcolor FontName Comment Silverlight BackGround FontFamily <!-- --> Tooltip BackStyle Enabled ToolTipService.ToolTip Opacity="0" IsEnabled="False" Visible = .F. Scrollbars = 2 SpinnerLowValue Visibility="Collapsed" VerticalScrollBarVisibility="Auto" Minimum XAML Steuerelement <VfxObject:VfxTextBox Text="{Binding Path=Customers.CurrentItem.customername, Mode=Twoway}" InputMask="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" x:Name="xpgfPageFramePage1txtCustomername" FontFamily="Arial" FontSize="12" MaxLength="50" Height="24" HorizontalAlignment="Left" Margin="106,4,0,0" Width="418" TabIndex="2" VerticalAlignment="Top"/> Element zu Element Bindung * Fast jede Eigenschaft kann an eine andere Eigenschaft gebunden werden Element zu Element Bindung * Beispiel: Customers.xaml * Slider steuert Breite einer TextBox <VfxObject:VfxSlider Name="vfxSlider1“ Maximum="418“ Minimum="20" /> * TextBox Width="{Binding ElementName=vfxSlider1, Path=Value}" Brauche ich eine Controlsource? Datenbindung * Keine Controlsource * An (fast) jede Eigenschaft möglich Text="{Binding Path=Customers.CurrentItem.customername, Mode=Twoway}" GUINEU GUINEU? * Verwendung von VFP Code in Silverlight Client-Projekten * Also im Browser beim Benutzer * Läuft auch auf Mac und weiteren künftig verfügbaren Plattformen GUINEU * Von Christof Wollenhaupt * www.GUINEU.net * VFP Laufzeitumgebung in C# entwickelt * Angepasste Version für Silverswitch Client Anwendungen * Exklusiv in Silverswitch * 1 DLL * VFP Code aus FXP Datei ausführen GUINEU Was kann man damit machen? * Geschäftslogik * Steuerung der Silverlight Benutzeroberfläche * Aber: * Keine VFP Benutzeroberfläche * (Messagebox, Wait Window, …) * Kein Dateizugriff * Das sind keine Einschränkungen! GUINEU Integration in Silverswitch * Wrapper-Projekt * VfxGuineuRuntime * FXP Datei * Im Ordner VFPCode speichern * Buildvorgang: Eingebettete Ressource * PRG Datei (zur Bearbeitung mit VFP) * Öffnen mit VFP als Standard * Buildvorgang: keine GUINEU * Deklaration using VfxGuineuRuntime; private readonly VfxGuineu _fox = new VfxGuineu("<Name>.FXP"); GUINEU * Funktionsaufruf _fox.Do("<Funktionsname>", <Parameter 1>, <Parameter 2>, …); * 1. Parameter ist Funktionsname * Folgende Parameter werden an die Funktion übergeben GUINEU * Parameterübergabe * auch Objekte! * Viele VFP Funktionen * Viele VFP Befehle * Keine Ausführung von C# Methoden * Keine Child-Objekte ansprechbar VFP aus VWD starten * Projekt VfxGuineuRuntime * Ordner VFPCode * PRG Datei hinzufügen * Rechtsklick, Öffnen mit… * VFP als Standard einstellen * Rechtsklick, Buildvorgang * keine * Einstellung in VFP * Vor dem Speichern kompilieren VFP aus VWD starten * Projekt VfxGuineuRuntime * Ordner VFPCode * FXP Datei hinzufügen * Rechtsklick, Buildvorgang * Eingebettete Ressource CheckBox steuert TextBox.IsReadOnly * XAML Code: <VfxObject:VfxCheckBox Content="ReadOnly" Name="vfxReadOnlyCheckBox" Click="vfxReadOnlyCheckBox_Checked"/> CheckBox steuert TextBox.IsReadOnly * C# Code: private void vfxReadOnlyCheckBox_Checked (object sender, System.Windows.RoutedEventArgs e) { VfxCheckBox CheckBox = (VfxCheckBox)sender; _fox.Do("ChangeReadOnly", xpgfPageFramePage1txtCustomername, CheckBox.IsChecked); } CheckBox steuert TextBox.IsReadOnly * VFP GUINEU Code: FUNCTION ChangeReadOnly LPARAMETERS toControl, tlReadOnly toControl.IsReadOnly = tlReadOnly GUINEU berechnet Lieferdatum * XAML Code: <VfxObject:VfxDatePicker SelectedDate="{Binding Path=Orders.CurrentItem.orderdate, Mode=Twoway}„ x:Name="xpgfPageFramePage1cntOrderdate„ LostFocus= "xpgfPageFramePage1txtOrderdate_LostFocus"> </VfxObject:VfxDatePicker> <TextBox Name="txtDelivery" /> GUINEU berechnet Lieferdatum * C# Code: private void xpgfPageFramePage1txtOrderdate_LostFocus (object sender, System.Windows.RoutedEventArgs e) { OnEdit(); var orderDate = ((orders) ViewModel.WorkAliasCollection.CurrentItem).orderdate; txtDelivery.Text = _fox.Do("Lieferdatum", orderDate); } GUINEU berechnet Lieferdatum * VFP GUINEU Code: Procedure Lieferdatum (ttOrderDate) Local ldOrder, ldLiefer ldOrder = Ttod(m.ttOrderDate) ldLiefer = ldOrder + 3 && drei Tage Lieferfrist Do case Case Dow(m.ldLiefer,2) == 6 && Samstag ldLiefer = m.ldLiefer + 2 && drauffolgender Montag Case Dow(m.ldLiefer,2) == 7 && Sonntag ldLiefer = m.ldLiefer + 1 && drauffolgender Montag EndCase Return ldLiefer Speichern aus GUINEU * XAML Code: <VfxObject:VfxButton Content=“Speichern“ Click="vfxButton1_Click" /> Speichern aus GUINEU * C# Code: private void vfxButton1_Click(object sender, System.Windows.RoutedEventArgs e) { bool returnvalue; returnvalue = _fox.Do("Speichern"); if (returnvalue) this.OnSave(); } Speichern aus GUINEU * VFP GUINEU Code: FUNCTION Speichern * Beliebige Geschäftslogik RETURN .T. GUINEU * Beispiele in VFPizza * Kunden GUINEU * Aufträge GUINEU * Eigenschaft abfragen * Eigenschaft setzen * Speichern (indirekt, weil in C#) Fragen? VFP COM Server * In jeder Silverlight Anwendung verfügbar * Browser * auf der Server Seite * OOB mit erhöhter Vertrauensstellung * auf der Server Seite * auf der Client Seite * Silverlight Client führt Methode in VFP COM Server aus VFP COM Server * Ausführung aus FXP * Ausführung aus APP * Vorteile: * COM Server muss nicht neu registriert werden * IIS muss nicht neu gestartet werden VFP COM Server * Datenzugriff * Cursoradapter * VFP Datenbank * SQL Datenbank * Alle ODBC Datenquellen * * * * MySQL Oracle DB2 … * Verwendete Datenbank konfigurierbar VFP COM Server * Geschäftslogik * Alles, was nicht visuell ist VFP COM Server * DEFINE CLASS VFPizzaCOMDomainService AS Session OLEPUBLIC * Erstellen als „Multi-Thread COM Server (DLL)“ * VFP9.exe muss explizit mit Administratorrechten ausgeführt werden! VFP COM Server DEFINE CLASS VFPizzaCOMDomainService AS Session OLEPUBLIC PROCEDURE GetDateTime RETURN TRANSFORM(DATETIME()) ENDPROC VFP COM Server auf der Server Seite verwenden * „early binding“ in Visual Studio * COM Server muss zur Entwicklungszeit funktionsfähig sein * Verweis auf COM Server muss dem Server Projekt hinzugefügt werden Action Button * Programmatischer Aufruf von COM Server Methode, Prozedur oder neue Objektinstanz von der Clientseite * Aufruf auch aus Button möglich * Übergabe mehrerer Parameter möglich * Übergabe von Daten als Parameter möglich Action Button * VFP Code * vfxbusinesslogic.vcx * cexample.businesslogicexample RETURN "This is the result of the business logic example." Action Button * Customers.XAML * VfxTextBlock hinzufügen <VfxObject:VfxTextBlock x:Name="lblActionResult" /> Action Button * Customers.XAML * VfxActionButton hinzufügen <VfxControl:VfxActionButton x:Name="cmdAction" Content="Action" ProcedureName="cexample.businesslogicexample" OperationResultLoaded= "cmdAction_OperationResultLoaded" /> Action Button * Customers.cs private void cmdAction_OperationResultLoaded( object sender, EventArgs e) { lblActionResult.Text = cmdAction.OperationResult.result.ToString(); } Action Button - Umsatz * Customers.XAML * VfxTextBlock hinzufügen <VfxObject:VfxTextBlock x:Name="lblUmsatz" /> Action Button - Umsatz * Customers.XAML * VfxActionButton hinzufügen <VfxControl:VfxActionButton x:Name="cmdUmsatz" Content="Umsatz" ProcedureName="cexample.GetTurnover" ProcedureParameter="{Binding Path= Customers.CurrentItem.customerid, Mode=OneWay}" OperationResultLoaded= "cmdUmsatz_OperationResultLoaded" /> Action Button - Umsatz * Customers.cs private void cmdUmsatz_OperationResultLoaded( object sender, EventArgs e) { decimal UmsatzResult = decimal.Parse(cmdUmsatz.OperationResult.result); lblUmatz.Text = UmsatzResult.ToString(); } Action Button - Umsatz * VFP Code * vfxbusinesslogic.vcx * cexample.GetTurnover Action Button - Umsatz LOCAL loOrdersCA, lnTotalSum, lnCustomerID lnCustomerID = IIF(TYPE("tnCustomerID") = "N", tnCustomerID, 0) loOrdersCA = NEWOBJECT("cadataaccess") loOrdersCA.DataSourceType = This.oVFPCom.cDataSourceType loOrdersCA.DataSource = This.oVFPCom.cDataSource loOrdersCA.SelectCmd = "Select OrderDetails.Quantity*OrderDetails.Price as TotalSum " + ; "From OrderDetails " + ; "JOIN Orders On OrderDetails.OrderID = Orders.OrderID " + ; "WHERE Orders.CustomerID = ?lnCustomerID" loOrdersCA.Alias = "crsorderdetails" loOrdersCA.CursorFill() lnTotalSum = crsOrderDetails.TotalSum USE IN crsOrderDetails RELEASE loOrdersCA RETURN lnTotalSum Aufruf einer VFP Funktion private void xpgfPageFramePage1cmdProper_Click( object sender, RoutedEventArgs e) { VfxSystemDomainContext context = new VfxSystemDomainContext(); EventHandler handler = new EventHandler(ExecuteVFPCommand_Completed); var ExecuteVFPCommand = context.ExecuteCommandService("proper", xpgfPageFramePage1txtCustomername.Text.ToString(), VfxAppObject.CurrentConnectionInfo.ClientName); ExecuteVFPCommand.Completed += handler; } Aufruf einer VFP Funktion void ExecuteVFPCommand_Completed( object sender, EventArgs e) { var result = sender as InvokeOperation<string>; VfxCommandServiceResultBase ValueResult = (VfxCommandServiceResultBase)VfxSerializer. DeserializeObject<VfxCommandServiceResultBase> (result.Value); lblResult.Text = ValueResult.CommandServiceInfo.result; } Fragen? Eigenschaften * Eigenschaften * Anwendungsobjekt * Formulare * Zahlreiche Eigenschaften aus VFX auch in Silverswitch verfügbar * Programmatisch zur Laufzeit ändern * C# * VFP Eigenschaften des Anwendungsobjekts * Eigenschaften einstellen in * VfxApplication\Controls\VfxAppObject.cs * Aufzählungstypen * VfxApplicationBase\Controls\Enums.cs Aufzählungstypen des Anwendungsobjekts * LoginBehaviors * NoLogin = 0, * LoginAtStartup = 1, * OptionalLogin = 2 * ErrorDetailLevels * MessageOnly = 0, * CallStackInformation, * FullDetailedInformation Eigenschaften des Anwendungsobjekts * Programmatisch zur Laufzeit setzen using VfxApplication; VfxAppObject.HideOpenDialog = true; Eigenschaften von Formularen * Eigenschaften einstellen in * Formularname.xaml.cs Eigenschaften von Formularen * Programmatisch zur Laufzeit setzen AskToSave = true; Programmierung in C# Warum C#? * Als internationaler Industriestandard anerkannt von European Computer Manufacturers Association (ECMA) * Windows Phone 7 C# * Strong Typed * VFP ist weak Typed * Groß-/Kleinschreibung beachten * C# kann fast nichts * wird erst durch using stark * Using von Komponenten * aus .NET Framework * von Drittanbietern * aus eigenen Namespaces Variablen * Müssen deklariert werden * Typ nicht änderbar * Eine Variable ist ein Objekt * Eigenschaften * Methoden Variablen * VFP * Deklaration nicht erforderlich meineZahl = 3 meineZahl = meineZahl + 1 meineZahl = "kein Problem" * Hier kommt es zu einem Laufzeitfehler meineZahl = meineZahl + 1 Variablen * C# int meineZahl; meineZahl = 3; meineZahl++; // Fehler wird zur Entwicklungszeit // erkannt: // meineZahl = „nicht zulässig"; MessageBox.Show(meineZahl.ToString()); Groß-/Kleinschreibung beachten * VFP meineVariable meineVariable * C# meineVariable MeineVariable = 3 = "Zeichenkette" = 3 = "Zeichenkette" Warum using? * Deklarierung von * Komponenten des .NET Frameworks * von Drittanbietern * eigenen Namespaces * Vergleichbar mit DECLARE oder SET CLASSLIB TO in VFP Warum using? System.Windows.MessageBox.Show("Text"); oder using System.Windows; MessageBox.Show("Text"); C# * Keine Daten * Keine Cursor * Nur Speicherstrukturen * Klassen für „Tabellenstruktur“ * Keine Makros C# Beispiele * Aus Workshop Doku * In CustomerCsharp MVVM Beispiele * Customers.xaml.cs public Customers(bool autoLoadData) { InitializeComponent(); InitializeData(); InitializeDefaultValues(); if (autoLoadData) { ViewModel.Reload(); } ((CustomersViewModel)ViewModel).CanInsertOnInit(); } MVVM Beispiele * CustomersViewModel.cs public void CanInsertOnInit() { if (_form != null) { _form.CanInsert = !_form.CanInsert; VFXHelpers.VfxEventHelper.Instance.OnRefreshToolBar (_form, EventArgs.Empty); } } MVVM Beispiele * CustomersViewModel.cs public void CanInsertOnInit() { if (_form != null) { _form.CanInsert = !_form.CanInsert; VFXHelpers.VfxEventHelper.Instance.OnRefreshToolBar (_form, EventArgs.Empty); } } * Test! MVVM Beispiele * Customers.xaml <VfxObject:VfxButton Content="Can Insert" Name="vfxButton1" Command="{Binding CanInsertCommand}" /> MVVM Beispiele * CustomersViewModel.cs using System; ... public System.Windows.Input.ICommand CanInsertCommand { get; set; } ... public CustomersViewModel(IDataFormProperties form : base(form) { CanInsertCommand = new VfxApplicationBase.Helpers.LambdaCommand<object> (CanInsert, CanInsertFunc); } MVVM Beispiele * CustomersViewModel.cs private void CanInsert(object obj) { if (_form != null) { _form.CanInsert = !_form.CanInsert; VFXHelpers.VfxEventHelper.Instance.OnRefreshToolBar (_form, EventArgs.Empty); } } MVVM Beispiele * CustomersViewModel.cs private bool CanInsertFunc(object obj) { return true; } * Test Asynchrone Programmierung * Nachricht senden * Nicht(!) auf Antwort warten * Anderes Ereignis erhält Antwort C# * Literatur zum Thema: * .NET for Visual FoxPro Developers * von Kevin McNeish * ISBN: 1-930919-30-1 Fragen? Desktop-Anwendungen * Ausführung außerhalb des Browsers * Out-of-browser (OOB) * Projekt VfxLoader * Eigenschaften * „Ausführen außerhalb des Browsers aktivieren“ * Viele Einstellmöglichkeiten * Testen! Höhere Vertrauensstellung * „Out-of-Browser-Einstellungen“ * „Bei Ausführung außerhalb des Browsers höhere Vertrauensstellung fordern“ Höhere Vertrauensstellung * Läuft nicht im Samdkasten des Browsers * OLE Automatisierung * Verwendung von COM Server * Zugriff auf das Dateisystem Installation OOB * Kontextmenü * „… auf diesem Computer installieren“ * Sicherheitswarnung * Startmenü * Desktop * Freundlicher Dialog bei zertifizierten Anwendungen * Firmenname * Firmenlogo Zertifizierung * Kostenlos möglich * www.openssl.org Aktualisierung * Automatisch beim Anwendungsstart * Möglich jedoch nur mit zertifizierten Anwendungen! Vollbildmodus * Außerhalb des Browsers kann eine Anwendung im Vollbildmodus ausgeführt werden * Symbol in der Symbolleiste Out-of-Browser * Programmatischer Test if (App.Current.IsRunningOutOfBrowser) { MessageBox.Show("OOB"); } else MessageBox.Show("im Browser"); * Demo Out-of-Browser if (App.Current.HasElevatedPermissions) MessageBox.Show( "Erhöhte Vertrauensstellung"); else MessageBox.Show("Sandbox"); * Demo Debugging von OOB Anwendungen * Server (.Web) Projekt als Startprojekt einstellen * <Projekt>TestPage.html als Startseite einstellen * Ausführen und als „out-of-browser“ installieren * Client Projekt als Startprojekt einstellen * Eigenschaften, Seite Debuggen Out-of-browser application Installation ohne Browser * Silverlight Launcher * Windows 32 bit C:\Program Files\Microsoft Silverlight\sllauncher.exe * Windows 64 bit C:\Program Files (x86)\Microsoft Silverlight\sllauncher.exe * Parameter * /install:”path-toXAP-File” * /origin:”URI-to-origin” * /shortcut:desktop+startmenu * /overwrite Installation ohne Browser * Beispiel C:\Program Files\Microsoft Silverlight\sllauncher.exe /install:”VFPizza.xap” /origin:”http://www.dfpug.net/VFPizza.xap” /shortcut:desktop+startmenu /overwrite Distribution und Installation Desktop Anwendungen * Installationspaket für Desktop Anwendungen erstellen * IExpress.exe * Mit Administratorrechten starten * Batch Datei mit Installationsaufruf erstellen * Batch Datei und XAP Datei hinzufügen * Batch Datei soll ausgeführt werden Veröffentlichung * Assistent in VWD * Rechtsklick auf das Projekt Silverswitch.Web * „Veröffentlichen“ Web veröffentlichen * Dateisystem * Alle Dateien werden in Zielordner kopiert * FTP * Möglich, wenn Zugang vorhanden * COM Server muss registriert werden! * Web.config anpassen * Config.vfx anpassen Wo läuft die Anwendung? * Windows * Internet-Explorer * Firefox * Chrome * Opera * Mac * Safari * Firefox * Chrome * Opera Sie haben das Ziel erreicht! Fragen? Vielen Dank und viel Spaß mit VFP und Silverswitch wünschen Venelina & Uwe