tag:blogger.com,1999:blog-67976814324678847092023-11-16T12:27:02.407+01:00Tom's VFP BlogTipps, Tricks und Code rund um Visual FoxPro / Tips, tricks and code relating to Visual FoxProTom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.comBlogger122125tag:blogger.com,1999:blog-6797681432467884709.post-42655667778993852612018-11-05T08:52:00.002+01:002018-11-11T13:20:18.503+01:00VFP, das Web und der ganze ReST - 7 - Fertig machen zur Landung / VFP, the web and all the ReST - 7 - preparing for landing
7 - Fertig machen zur Landung / preparing for landing
Soeben haben wir den .ReadyState 4 erhalten. Dies bedeutet, dass wir eine Serverantwort in Empfang nehmen können. Das hört sich doch eigentlich ganz gut an. Dummerweise bleibt uns an dieser Stelle ein eventueller Blick in die Dokumentation des Webservice nicht erspart.
Das oXmlHttp Objekt stellt uns nämlich zwei Eigenschaften zur Verfügung Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-4265448293428338892018-11-01T09:21:00.001+01:002018-11-11T13:19:48.057+01:00VFP, das Web und der ganze ReST - 6 - kleine Denkpause gefällig? / VFP, the web and all the ReST - 6 - in need of a reflection period?
6. Kleine Denkpause gefällig? / in need of a reflection period?
Nachdem nun die Übertragung an den Webservice initiiert wurde bleibt uns als nächstes nur eines: Warten...
Das hört sich schlimmer an als es tatsächlich ist. Rufen wir uns an dieser Stelle mal das uralte Grundprinzip der EDV ins Gedächtnis zurück: EVA
E ingabe
V erarbeitung
Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-49776849641603933482018-10-28T12:37:00.000+01:002018-11-11T13:19:29.502+01:00VFP, das Web und der ganze ReST - 5 - Die Startvorbereitungen / VFP, the web and all the ReST - 5 - preparations for launch
5 - Die Startvorbereitungen / preparations for launch
Einige Abkürzungen haben wir schon kennengelernt (SOAP, WDSL, ReST, JSON). Nun geht es damit munter weiter 😊. Web-basierender Datenaustausch baut in unserem Fall auf dem Hypertext Transfer Protocol kurz HTTP auf. Dieses Jahrzehnte alte Protokoll wurde in den letzten Jahren von einer sichereren Version seiner selbst ersetzt, dem Hypertext Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-89070390473988197582018-10-24T11:17:00.000+02:002018-11-11T13:19:13.829+01:00VFP, das Web und der ganze ReST - 4 - JSON und der goldene Konverter / VFP, the web and all the ReST - 4 - JSON and the golden converter
4 - JSON und der goldene Converter / JSON and the golden converter
<!--[if gte mso 9]>
<![endif]--><!--[if gte mso 9]>
Normal
0
21
false
false
false
DE
X-NONE
X-NONE
<![endif]--><!--[if gte mso 9]>
Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-77375138281660094282018-10-20T14:04:00.001+02:002020-07-14T20:25:01.781+02:00VFP, das Web und der ganze ReST - 3 - Leerzeichen und andere Entitäten / VFP, the web and all the ReST - 3 - BLANKS and other entities
3 - Leerzeichen und andere Entitäten / BLANKS and other entities
Der Begriff der Entität ist den meisten vermutlich durch das Entity Relationship Model (ERM) geläufig. Es stellt die Grundlage für das Entwerfen von Datenbanken und Tabellen dar und für VFP Entwickler sollte das nun wirklich kein Böhmisches Dorf sein. Als datengetriebene Entwicklungsumgebung ist dies schließlich unser tägliches Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-38102780731087855782018-10-16T15:29:00.000+02:002018-11-11T13:18:28.922+01:00VFP, das Web und der ganze ReST - 2 - Wer ReST sagt sagt auch JSON / VFP, the web and all the ReST - 2 - In for a ReST, in for a JSON
2. Wer ReST sagt, sagt auch JSON
Die JavaScript Object Notation kurz JSON ist bei heutigen REST APIs der Quasi-Standard zur Übertragung kompakter Informationen. Sie verzichtet auf den für XML üblichen Overhead von Typdeklarationen und Tags und reduziert sich auf wenige Symbole und Zeichen zur Feld- und Datensatztrennung. Somit handelt es sich bei JSON nicht um eine struktur-beschreibende Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-45267905340289306492018-10-12T09:05:00.000+02:002018-11-11T13:18:09.144+01:00VFP, das Web und der ganze ReST - 1 - Abkürzungen / VFP, the web and all the ReST - 1 - abbreviations
1. Abkürzungen / abbreviations
Die folgenden Abkürzungen dürften für die meisten nichts neues sein. Jeder kennt sie, jeder hat damit schon mehr oder weniger zu tun gehabt. Die nachfolgende Übersicht dient in erster Linie dazu, einen schnellen Zugriff auf Webseiten bereitzustellen, die hilfreiche Informationen dazu liefern. Für diejenigen, welche mit dem Englischen nicht so vertraut sind Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-75602012831400788742018-10-08T11:38:00.002+02:002018-11-05T08:54:08.590+01:00VFP, das Web und der ganze ReST - Einführung / VFP, the web and all the ReST - Introduction<!--[if gte mso 9]>
<![endif]--><!--[if gte mso 9]>
Normal
0
21
false
false
false
DE
X-NONE
X-NONE
<![endif]--><!--[if gte mso 9]>
Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-41528528361110375612018-09-18T15:28:00.000+02:002018-09-18T15:59:22.924+02:00Generieren einer Passwortkarte / generating a password cardSicherheit im Web ist ein Thema das immer noch zu viele Menschen einfach ausblenden. Frei nach dem Motto "Mir wird schon nichts passieren" wird ein simpler Name eines Gegenstandes oder einer Person als Passwort gewählt. Eventuell gar der Name des Nachwuches, des Partners oder der Partnerin. Die Möglichkeiten erscheinen dem Laien so vielfältig, dass da doch einfach kein Mensch drauf kommen kann.
Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-76756139076497928542018-07-23T15:48:00.003+02:002018-07-27T08:15:56.653+02:00Tricksen mit dem Toolbarobjekt / fiddling with the toolbar objectVor einiger Zeit arbeitete ich an einer Sidebar ähnlich der von Yousfi Benameur, nur mit VFP Bordmitteln. Hierbei stand ich vor dem Problem, dass das Toolbarobjekt nach dem Andocken nur im Rahmen seiner Größe basierend auf den darin befindlichen Objekten mit der von mir definierten Hintergrundfarbe versehen war. Der Rest wurde mit dem Standard-Grau für den Toolbarbereich gefüllt.
Vorsichtig Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com2tag:blogger.com,1999:blog-6797681432467884709.post-11642560922824141602017-09-07T13:06:00.000+02:002017-09-07T13:07:05.674+02:00Buttons zur Laufzeit dynamisch generieren / generate buttons dynamically during runtime<!--[if gte mso 9]>
<![endif]-->
<!--[if gte mso 9]>
Normal
0
21
false
false
false
DE
X-NONE
X-NONE
<![endif]--><!--[if gte mso 9]>
Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-78953813319591400282017-07-20T14:42:00.000+02:002018-10-01T09:04:16.249+02:00Datumsspielereien (Teil 10) / Date gadgets (Part 10)Beim Datum führen viele Wege nach Rom. Umwege, komplizierte Wege und kurze Wege.
Diese Erkenntnis hatte ich heute im Zusammenspiel mit der Generierung eines indizierbaren Datumsstring.
Ziel war eine Ausgabe in Form von YYYYMMDD auf Basis eines erfassten Datumfeldes.
Dummerweise ist der Fux mit reichlich Funktionen zur Datumsmanipulation und -verarbeitung ausgestattet, so dass es recht einfach Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com5tag:blogger.com,1999:blog-6797681432467884709.post-13530324377188444202017-05-04T14:01:00.000+02:002017-05-05T11:27:35.543+02:00Die Matrix ist volljährig geworden / The Matrix has come of ageAls im Jahr 1999 der erste Teil der Matrix Trilogie in den Kinos anlief war ich (wie vermutlich viele andere) von den Zeichenkaskaden des Matrixcodes fasziniert. Irgendwann baute ich mir dann zum Spaß eine ähnliche Funktionalität für den _screen des VFP Entwicklungsfensters.
Nun zum 18jährigen Jubiläum des Films habe ich den angestaubten Code heraus gekramt und abgestaubt.
Der u.a. Code kann Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com2tag:blogger.com,1999:blog-6797681432467884709.post-72145400112167700622016-12-22T12:07:00.000+01:002018-10-01T09:05:49.534+02:00Systeminformationen sammeln um einen eindeutigen Daumenabdruck zu generieren / Collecting Systeminformation to generate a unique fingerprintWenn für unsere Applikation der Bedarf besteht, dass sie nicht unkontrolliert auf ein anderes System kopierbar sein soll, dann können wir mit Hilfe der WMI (Windows Management Instrumentation) diverse Informationen aus Windows herauskitzeln.
Im Folgenden werden wir eine ID basierend auf CPU, Netzwerkadaptern und Festplatten zusammenstellen. Bei den Festplatten erfolgt eine Beschränkung auf fest Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-19252953220776210122016-09-07T15:50:00.001+02:002018-10-01T09:07:23.405+02:00Objekte einer Form zur Laufzeit duplizieren / duplicating form objects at runtimePräambel
Während der Entwicklung stehen uns für Builder die Methoden 'ReadMethod' und 'WriteMethod' zur Verfügung. Über diese können wir vorhanden Code auslesen und auch in Methoden hinein schreiben.
Zur Laufzeit steht uns dies leider nicht zur Verfügung. Aus diesem Grund müssen wir gezielt eigene von den VFP Basisklassen abgeleitete Klassen auf unseren Forms verwenden, wenn wir tatsächlich Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-23709296751488842402016-04-21T15:20:00.000+02:002016-05-09T09:46:31.231+02:00PDFs über das olebrowser Control anzeigen / using the olebrowser control to display PDF filesVor vielen Jahren stand ich vor der Aufgabe, eine PDF Datei innerhalb einer VFP Maske anzuzeigen. Gelöst habe ich dies über das Einbetten des olebrowser activeX Controls. Dieses Objekt bekam als Zielseite (über .Navigate ) einfach die anzuzeigende PDF Datei hinterlegt und fertig war die Laube.
Was passiert jedoch, wenn der Anwender auf die Idee kommt, die angezeigte Datei aus der VFP Anwendung Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-47014847841058073132012-07-11T09:25:00.000+02:002012-07-11T09:27:48.773+02:00Einfaches arbeiten mit ZIP Archiven / Working with ZIP files the easy wayDas Shell.Application Objekt kennt unter anderem eine Methode namens 'CopyHere'. Diese auf den ersten Blick recht harmlos erscheinende Methode beinhaltet jedoch auch das Verarbeiten von ZIP Archiven.
Wenn wir komplette Verzeichnisse archivieren bzw. wiederherstellen wollen, dann ist dies mit CopyHere auf relative einfache Weise möglich.
Das heutige Code Beispiel besteht aus zwei kleine RoutinenTom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-86572732726768926782012-05-07T08:31:00.000+02:002012-05-07T08:31:05.336+02:00Datumsspielereien (Teil 9) / Date gadgets (Part 9)Irgendwie sind Datumberechnungen ein Faß ohne Boden. Nach Teil 4 der Datumsspielereien war ich bereits der Meinung, nichts neues mehr zu diesem Thema zu finden. Aber irgendwie poppt in unregelmäßigen Abständen immer wieder eine neue Frage dazu auf.
Aktuell dreht es sich darum herauszufinden, wieviele Jahre, Monate und Tage zwischen zwei Datumswerten liegen.
Im folgenden Mustercode erledigt Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com1tag:blogger.com,1999:blog-6797681432467884709.post-45156430860615217902011-12-21T11:22:00.001+01:002011-12-23T08:42:05.901+01:00Datumsspielereien (Teil 8) / Date gadgets (Part 8)Die TIME() Funktion von Visual Foxpro liefert uns eine Uhrzeit als Characterstring. Wenn wir zu dieser Zeit jedoch Stunden, Minuten oder Sekunden hinzuaddieren möchten, dann ist das bei einem String eine mühsame Arbeit.
Anstatt mit TIME() sollten wir für Berechnungen immer mit DATETIME() arbeiten. Hier steht uns neben dem Datum auch die Uhrzeit für Berechnungen zur Verfügung. Allerdings wird einTom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-71159483289150867662011-12-14T14:33:00.001+01:002011-12-14T15:12:18.174+01:00Erstellen von Tablet-PC Anwendungen mit VFP / Creating Tablet-PC Applications with VFPVor ein paar Wochen stolperte ich bei der Suche nach Informationen zur Erstellung von Tablet PC Anwendungen mit Visual Foxpro über den folgenden Blogbeitrag:
http://www.tabletpcblog.de/2010/03/11/erstellen-von-tablet-pc-anwendungen-mit-visual-foxpro/
Bei diesem Posting handelt es sich um eine Übersetzung eines MSDN Artikels von Mike Stewart aus dem Jahr 2004:
http://msdn.microsoft.com/en-us/Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-4489215986552860802011-12-05T11:31:00.000+01:002011-12-05T11:31:12.965+01:00Zwei Forms gleichzeitig bewegen / Moving two forms simultaneouslyWer noch die alte Version von WinAMP(R) kennt weiß, dass dort insgesamt zwei zusätzliche, an die Hauptform andockbare Fenster zur Verfügung standen.
Einen solchen Effekt können wird in Visual FoxPro ebenfalls erzielen. Hierzu binden wir den 'Moved' Event der Hauptform einfach an die zugehörigen Unterforms.
Der für die Repositionierung benötigte Code befindet sich in der Prozedur 'MoveSubForm':
Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-84875149926548675362011-11-29T09:12:00.000+01:002011-11-29T09:12:07.814+01:00Entfernen von Worten aus Textdateien / Removing words from textfilesVisual FoxPro stellt uns nicht nur eine Menge Funktionen zur Stringmanipulation zur Verfügung. Auch das Öffnen und Bearbeiten von Dateiinhalten kann auf mehreren Wegen durchgeführt werden.
Wollen wir bspw. bestimmte Worte (oder Zeichenfolgen) aus einer Textdatei entfernen, so können wir die Datei natürlich über die Funktionen FOPEN(), FGETS(), FWRITE() und FCLOSE() verarbeiten, mit Hilfe von Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-91294653840285126572011-11-25T11:25:00.000+01:002011-11-25T11:25:49.850+01:00Datumsspielereien (Teil 7) / Date gadgets (Part 7)Im Folgenden eine kleine Abwandlung der Routine aus Teil 6 in der es um die Berechnung des letzten Sonntags eines Monats ging.
Wollen wir nicht den letzten Sonntag sondern einfach nur den letzten Tag des Monats berechnen, so ist es am einfachsten zunächst das Datum des 1. Tages des Folgemonats zu berechnen und davon einfach einen Tag abzuziehen. Ähnlich funktioniert auch die Methode aus Teil 6.
Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-16646590144787233042011-11-08T09:16:00.000+01:002011-11-08T09:16:16.208+01:00Arbeiten mit Ganzzahl und Kommazahlen / working with integers and decimalsFür die Arbeit mit Ganz- und Kommazahlen stellt uns Visual Foxpro ein paar Funktionen zur Verfügung, mit deren Hilfe wir Vorzeichen sowie Vor- und Nachkommastellen extrahieren können. Je nach Aufgabenstellung sind diese Funktionen recht hilfreich.
Im einzelnen dreht es sich um die folgenden Funktionen: INT(), ABS(), CEILING(), FLOOR() und MOD().
Der folgende Mustercode soll die Arbeitsweise derTom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0tag:blogger.com,1999:blog-6797681432467884709.post-24580609755601557422011-10-28T14:39:00.000+02:002011-10-28T14:39:52.428+02:00Berechnen der NMEA Checksumme / Computing the NMEA checksumDie National Marine Electronics Association (NMEA) zeichnet u.a. für den digitalen Datenaustausch bei GPS Geräten verantwortlich. Egal ob wir ein solches Gerät auf einem Schiff, im Auto, am Fahrrad oder beim Wandern benutzen. Die zum Einsatz kommenden Datensätze entspringen (mit kleinen individuellen Herstellervarianten) den NMEA Definitionen.
Da jedwede Art der Datenübertragung qualitativen Tom Borgmannhttp://www.blogger.com/profile/08903165976787522012noreply@blogger.com0