Quantcast
Channel: Programming - Embarcadero Community
Viewing all 238 articles
Browse latest View live

Tech Tipp #1: Neuerungen in TDBImage: JPEG Bilder

$
0
0

Frage: In Delphi 10.2 Tokyo/C++Builder 10.2 Tokyo soll es ja die Möglichkeiten geben, daß man auch JPEG Grafiken aus einer Datenbank direkt in einem TDBImage anzeigen lassen kann. Zur Design-Zeit sieht auch alles gut aus:


(Eine FireDAC Tabelle mit einer JPEG Grafik)

Zur Laufzeit bekomme ich aber einen blöden Fehler:

Was mache ich falsch?

Antwort: Fast alles richtig gemacht. Man muss nur noch eine Unit einbinden, die dann auch die Umsetzung (JPEG) macht:

uses
[....], VCL.Imaging.JPEG [...];

Dann klappt's auch


CodeRage DE: Termin, Anmeldung, Infos und Vorstellung der Präsentatoren

$
0
0

Am Donnerstag, den 22. Juni, findet die Zweite Deutsche CodeRage Deutschland statt. Anmeldung und weitere Infos (Sessionplan) hier:

http://forms.embarcadero.com/coderage-germany

Die Konferenz deckt Entwicklungsthemen über allgemeine Programmierthemen, Delphi und C++Builder ab. Für Anfänger, Fortgeschrittene und interessierte Delphi und C++Builder Entwickler.

Bekannte Sprecher wie Volker Hillmann, Bernd Ua, Roman Kassebaum, Olaf Monien, Dr. Holger Flick und Matthias Eißing bringen Ihnen kompakt die neusten Technologien, Tipps & Tricks, Paradigmen und Best Practices für Delphi und C++Builder nahe.

Die Sprecher möchte ich hier kurz vorstellen:

Olaf Monien

Olaf Monien arbeitet seit vielen Jahren für internationale Firmen als IT Berater. Seine Spezialgebiete sind Software Architektur, Datenbank Design, Internet Anwendungen und mobile Geräte. Olaf Monien ist Diplom Informatiker mit über 20 Jahren Erfahrung im Bereich Softwareentwicklung. Olaf Monien ist ein Embarcadero MVP und  Embarcadero Technology Partner.

Olaf hält den Vortrag

  • Implementation des Facebook Login-Verfahrens mit Firemonkey-Anwendungen auf Desktop und mobilen Plattformen

Bernd Ua

Bernd Ua ist Gründer und Geschäftsführer von probucon Business Consulting einem Beratungs- und Trainingshaus, das eine breite Platte von unterstützenden Dienstleistungen bei der Softwareentwicklung anbietet, angefangen von Trainings bis zu Architektur, Projektleitung, Codereviews und Umsetzung. Bernd Ua arbeitet seit mehreren Jahren als Softwarearchitekt und Entwickler sowie als Trainer im Bereich nativer Anwendungen mit Embarcadero Delphi und im .net Umfeld mit C#. Daneben ist er als Autor unter anderem für das Entwickler Magazin tätig und regelmäßig als Sprecher auf nationalen und internationalen Veranstaltungen anzutreffen.

Bernd hält den Vortrag

  • Linux und Apache Entwicklung

Roman Kassebaum

Roman hat 1996 Pascal an der Universität Paderborn gelernt, wo er mit einem Master-Abschluss absolvierte. Er begann mit Turbo Pascal 7.0 und verwendete alle Versionen von Delphi von 1 bis zum aktuellen Delphi. In den letzten Jahren hat er auch mit dem C ++ Builder gearbeitet.

Roman ist Delphi MVP und ein Embarcadero Technology Partner. Er arbeitete an verschiedenen Arten von Projekten in nationalen und internationalen Teams in Deutschland, Australien, USA, Frankreich, Spanien und Neuseeland.

Während der letzten Jahre hat er spezielle Fähigkeiten in der Arbeit an Legacy-Code, vor allem bei der Migration zu neueren Delphi-Versionen, entwickelt.

Roman lebt in Bünde mit seiner Frau und seinen Söhnen. In seiner Freizeit spielt er gerne Schach, wo er einen FIDE Meistertitel hält.

Roman hält den Vortrag

  • Vorstellung von TMSPassKit

Dr. Holger Flick

Dr. Holger Flick studierte Informatik an der Universität Dortmund und promovierte an der Fakultät Maschinenbau der Ruhr-Universität Bochum. Bereits seit 1996 programmiert er mit Delphi. Holger ist Sprecher auf Fachkonferenzen und ein erfahrener Trainer für verschiedenste Delphi Themen. Sein jahrelanges Engagement und seine umfassenden Kenntnisse im Bereich der Delphi Programmierung im Themenbereich der objektorientierten Programmierung mit Delphi und anderen Programmiersprachen (z.B. C#, Objective-C), führte im Jahr 2016 zu seiner Ernennung zum Embarcadero Delphi MVP.

Seit 2013 ist Dr. Holger Flick als Mitarbeiter der Korfmann Lufttechnik GmbH in Witten für die gesamte Software- und Hardwarearchitektur der Firma verantwortlich und entwickelt unter anderem unternehmensspezifische Softwarelösungen mit Delphi.

Holger hält die beiden Vorträge

  • Komponentenentwicklung
  • FireDAC

Volker Hillmann

Volker Hillmann ist Geschäftsführer der adecc Systemhaus GmbH. Vielen Entwicklern ist er auch als Buchautor, Trainer und Sprecher auf vielen Roadshows (better office, Borland, Codegear, Embarcadero) bekannt. Er programmiert seit 1988 in C und seit 1991 in C++. Er kennt die Embarcadero (Borland / Codegear) C/C++ Entwicklungsumgebungen seit 1988 (Version Turbo C 1.5). Er beherrscht aber auch eine Reihe anderer Programmiersprachen und hat sich mit vielen Entwicklungsumgebungen beschäftigt. Die Basis hierfür bildet sein Studium als Diplom Mathematiker mit der Spezialisierung Datenbanken und Datensicherheit an der Universität Rostock. Im Auftrag des Markt&Technik Verlags hat er 1994 das Buch "Objektorientierte Programmierung mit C++. Das ganz andere C++- Buch" geschrieben. Er ist auch der Autor des White Papers für den Embarcadero C++ Builder 2010. Die theoretischen Grundlagen werden durch die vielen praktischen Erfahrungen aus Projekten im Finanz- und Versicherungsbereich bereichert. Auch hier basierte der Erfolg auf eher untypischen Ansätzen. Hier war er als Entwickler, Architekt und Projektleiter erfolgreich, bevor er sich 2001 mit seinem Geschäftspartner selbständig machte. Seit 2013 ist Volker Hillmann auch Embarcadero MVP für den C++ Builder und die Programmiersprache C++. Die adecc Systemhaus GmbH ist seit 2007 Partner von Embarcadero in Deutschland und betreut zahlreiche Kunden aus unterschiedlichen Wirtschaftszweigen in Deutschland, Österreich und der Schweiz. Neben Schulungen gehören hier auch Beratungsleistungen und die Beteiligung an Projekten dazu.

Volker hält die Vorträge

  • Modernes C++ und Komponenten, ein einfacher Web- Server
  • Erstellen einer mobilen Anwendung (für Desktop-Entwickler)
  • Back to C++, Migration zurück zu C++

Matthias Eißing

Matthias Eißing ist Senior Sales Consultant der Embarcadero Germany GmbH. Mit über 20 Jahren Erfahrung im IT-Umfeld, als Sprecher auf zahlreichen nationalen und internationalen Konferenzen und Seminaren gilt Matthias Eißing als ausgewiesener Spezialist im Umfeld der Entwicklungs- und Datenbankwerkzeugen. Seine Schwerpunkte liegen in der Analyse, Beratung und Unterstützung von Kunden bei der Auswahl von Werkzeugen, sowie bei der projektbegleitenden Durchführung.

Ich selber werde den Tag moderieren und diesen Vortrag halten:

  • Neuigkeiten im RAD Studio 10.2 Tokyo

Ich freu mich auf Euch!

 

Tech Tipp #4: Kaputter Compiler oder Layer 8 Problem?

$
0
0

Frage: Ich habe folgenden Quelltext (stark vereinfacht dargestellt):

var
  a,b,c : Integer;
begin
  a := 1;
  b := 2;
  if (a<10) or (b<10) or (a+b<10) then
  begin
     c := 3;
     exit;  // <-----
  end;
  MachIrgendWas();

Der Methodenaufruf "MachIrgendWas()" wird nur dann angesteuert, wenn das "exit" (siehe Pfeil) auskommentarisiert wird. Das hängt doch alles vom "IF" ab!!! Warum?

Antwort: Zuerst muss man sagen, daß diese Darstellung hier ganz bewusst STARK vereinfacht dargestellt wird.... so daß dies dem ambitioniertem Entwickler sofort auffällt: Die IF-Bedingung wird immer erfüllt. Und damit wird auch immer EXIT aufgerufen. "MachIrgendWas" wird als Statement/Ausdruck damit gar nicht mehr übersetzt und mit in das Executable aufgenommen. Und der Compiler optimiert das einfach weg.

Soweit, so einfach..... Trickreich wird das erst, wenn man komplexere Ausdrücke in der IF-Bedingung stehen hat, die man als normalsterblicher Programmierer nicht mehr sofort überblickt; die sich vielleicht aus Ausdrücken erst berechnen (die aber schon zur Compile-Zeit auswertbar sind).

Also Augen auf, bei IF <Bedingung> then begin .... exit .... end!

Tech Tipp #5: Sauberer Start der IDE (ohne Fremdherstellerkomponenten und -erweiterungen)

$
0
0

Frage: Meine IDE stürzt 'ständig' ab. Wo liegt das Problem? Wann erscheint ein Fix dafür?

Antwort: Häufig (in weit mehr als 90% aller mir untergekommenen Fälle) ist daran eine IDE-Erweiterung, in Form eines Plug-Ins oder einer Komponenten-Sammlung, schuld. Das kann man zumindest rudimentär oder vollständig überprüfen.

Wichtiger Hinweis: Ich zeige hier einige Bildschirmfotos von/mit "CnPack / CnPack IDE Wizards", die "Jedi Visual Component Library" (Binary Installer hier vorher die Jedi Code Library) und die "GExperts", die nur als Beispiel dienen. Ich möchte in keinster Weise diese IDE-PlugIns diskreditieren.

Es kann durchaus sein, daß sich diese Plug-Ins / Komponentensammlungen mit der IDE beißen.... also erstmal testen, wie sich die IDE verhält, wenn diese nicht geladen werden. Dazu gibt es Kommandozeilenparameter für die IDE (BDS.EXE -parameter), die auch hier dokumentiert sind:
http://docwiki.embarcadero.com/RADStudio/Tokyo/de/IDE-Befehlszeilenoptionen

Hier findet sich nun ein Parameter, der die IDE in einer Standardkonfiguration startet: Parameter "r", wie "Registry"

Man startet also die IDE mit diesem Parameter (Achtung: Keine Leerstelle/Space zwischen dem Parameter und dem beliebigen Namen):

Microsoft Windows [Version 10.0.15063]
(c) 2017 Microsoft Corporation. Alle Rechte vorbehalten.

C:\Users\Matthias>"c:\Program Files (x86)\Embarcadero\Studio\19.0\bin\bds.exe" -rOhneIrgendwas

Die IDE wird dann ohne PlugIns und Komponenten gestartet (Ausnahme GExperts, die sich festbeissen). Hier kann man nun überprüfen, ob es denn generell an einem PlugIn gelegen hat, wenn die IDE dann stabil läuft.

Hintergrund: Es wird ein neuer Registry Zweig erzeugt mit den Standard-Einstellungen der IDE unter

HKEY_CURRENT_USER\Software\Embarcadero\OhneIrgendwas

Es werden dazu die Standardwerte von HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Embarcadero\BDS auf den CURRENT-USER-Zweig kopiert unter Zuhilfenahme des angegeben Registry-Zweigs:

(Die GExperts tragen sich auch unter HKEY_LOCAL_MACHINE ein)

Der Registry-Zweig "OhneIrgendwas" bleibt bestehen und kann jederzeit wieder über den Parameter -r benutzt werden. Man kann ihn aber auch in der Registry löschen

Wo liegen die Einschränkungen ("nur rudimentäre Überprüfung")?

Die Einschränkungen liegen darin verborgen, daß man ein bestehendes Projekt nicht mehr fehlerfrei/warnungsfrei öffnen kann, wenn man Komponenten benutzt

Tech Tipp #6: Neue Tools über GetIt: Beyond Compare und CodeSite Express

$
0
0

Frage: Wo sind die IDE-Plug-Ins "Beyond Compare" und "CodeSite Express" in der IDE?

Antwort: Seit einigen Tagen sind diese über GetIt (Tools | GetIt-Package-Manager) verfügbar.

Man findet diese leicht und schnell und der Kategorie "IDE Plugins":

Was ist Beyond Compare?

Beyond Compare ist ein sehr gutes Vergleichswerkzeug (diff, visual diff, Text-compare), mit dem man schnell und leicht Unterschiede in seinen (Text) Dateien feststellen kann. Dieses "plugged" sich dann auch in die IDE ein:

Vorher (In der Historienansicht -> Unterschiede)

Nachher:

Dadurch öffnet sich der externe Betrachter:

Dieser hat auch eine Vielzahl von Funktionen, die hier sehr gut beschrieben sind.

(Es handelt sich dabei um Beyond Compare Lite 4 in einer "RAD Studio Edition; Version 4.1.5). Die Vollversion bietet auch außerhalb der IDE Möglichkeiten lokale Dateien, Verzeichnisse und auch binäre Dateien zu vergleichen.

Was ist CodeSite Express?

CodeSite Express ist ein Logging System, um zur Laufzeit herauszufinden, wie sich Code verhält und die gespeicherten Ergebnisse (nachträglich) zu betrachten. Dazu gibt es Klassen (wie TCodeSiteLogger). Es handelt sich hierbei auch um eine "Lite" Version ("Express"), die aber grundlegende Funktionen mitbringt. Unterschiede findet man hier. Eine Einführung ist in der Onlinehilfe integriert:

Foren-Tage 2017 in Hamburg: Tickets für den Community Abend

$
0
0

Die Foren-Tage sind eine mehrtägige Community-Konferenz für Software-Entwickler. Veranstaltet werden die Foren-Tage von den drei Delphi-Foren „Entwickler-Ecke“ und „Delphi-Treff“ und „Delphi-PRAXiS“ zusammen mit Embarcadero. Wir sind im Wesentlichen das Team, das von 2005 bis 2015 die Delphi-Tage realisiert hatte. Von der Community für die Community! Wir freuen uns auf Euch am 21.-23. September 2017 in Hamburg In diesen Jahren haben wir Erfahrungen gesammelt, die wir in die Foren-Tage einfließen lassen, die aus unserer Sicht nun die Weiterentwicklung dieser Veranstaltungsreihe darstellen. Die zentrale Idee dieser Veranstaltung ist es, der (deutschsprachigen) Delphi- und C++-Community eine Möglichkeit zu eröffnen, sich live und von Angesicht zu Angesicht auszutauschen. An mehreren Tagen werden wir Workshops und interessante Vorträge erleben, Spaß und gegenseitiger Austausch von Wissen werden dabei im Mittelpunkt stehen

Die Veranstaltung ist soweit in trockenen Tüchern und die Tickets sind nun für die Foren-Tage in Gänze verfügbar:

Hauptveranstaltung am Samstag:
https://www.xing-events.com/forentage.html

Community Abend am Freitag Abend:
https://en.xing-events.com/community_abend_forentage.html

Workshop-Tage am Donnerstag/Freitag:
https://en.xing-events.com/WorkshopsForenTage2017.html

Weitere Infos:
https://forentage.de

Agenda (vorläufig):
https://forentage.de/index.php/veranstaltung/agenda/

 

Tech Tipp #7: Eine kleine UDF in InterBase

$
0
0

Frage: Ich vermisse die Funktion XYZ in InterBase. Warum gibt es die nicht?

Antwort: In der Tat gibt es einige Funktionen in InterBase (für die DML) in InterBase, die man vielleicht von anderen Datenbanken her kennt, die aber in InterBase nicht vorhanden sind.....

Aber es gibt eine (einfache!) Lösung: Man schreibt sich diese Funktion(en) selbst.

Ein gutes Video von meinem Kollegen Stephen Ball findet man dazu auch hier: https://www.youtube.com/watch?v=9bfaU5mdlaY

Daraus erstmal zwei wichtige Regeln:

  • Eine UDF sollte simple und schnell sein
  • Eine UDF sollte niemals den Status der Datenbank direkt manipulieren

Ein kleines Beispiel: In MS SQL Server/T-SQL gibt es einen ISNULL() oder auch im MySQL ein IFNULL(). Diese kann man zwar auch mit einem CASE umschreiben, macht es aber unter Umständen weniger gut lesbar:

Interbase Original:

SELECT
    (CASE
    WHEN column IS NULL
    THEN 'Alternative Value'
    ELSE column
    END) AS column
FROM
    table

Der Wunsch könnte sein:

SELECT
    ISNULL(column,'Alternative Value') AS column
FROM
    table

Sieht besser aus.... ist aber in InterBase nicht direkt möglich. Dafür gibt es UDFs (User Defined Functions).

Wie baut man das jetzt ein? Über eine DLL (32/64 Bit) bzw ein SO (Shared Object für Linux/Mac), die man in das passende InterBase Verzeichnis kopiert (hier: Windows, 64 Bit): C:\\Program Files\\Embarcadero\\InterBase\\UDF

Schritt für Schritt:

  • Delphi starten (oder C++Builder)
  • Datei | Neu | Weitere
  • Dynamische Link-Bibliothek
  • Date | Neu | Unit - Delphi
  • Hier, in der Unit, implementiert man dann die Funktionen im Interface- und Implementation-Teil der neuen Unit
  • Zielplattform wählen/ergänzen (32/64 Bit, Windows/Linux/Mac)
  • Export der Funktionen
  • DLL erzeugen

Quelltext der DLL  / Unit

library myUDFs;

uses
  System.SysUtils,
  System.Classes,
  UUDFFunctions in 'UUDFFunctions.pas';

{$R *.res}

begin
end.
unit UUDFFunctions;

interface

function IsNull(s1, s2: PChar): PChar; cdecl;

exports IsNull name 'IsNull';

implementation

function IsNull(s1, s2: PChar): PChar; cdecl;
begin
  if string(s1) = '' then // es gibt keinen NULL String
    result := s2
  else
    result := s1;
end;

end.

 

Wichtige Bemerkungen bei der Variablenübergabe:

  • Alle Variablen werden von InterBase als Referenzparameter übergeben
  • Ausnahme: PChar (Zeichenketten werden generell als PChar übergeben), die damit schon selbst eine Referenz darstellen.
    Also ein function irgendwas(var i:Integer;s:PChar)

Der Import mittels SQL-Befehl in iSQL / IBConsole:

DECLARE EXTERNAL FUNCTION IsNull
  CSTRING(256) CHARACTER SET NONE,
  CSTRING(256) CHARACTER SET NONE
RETURNS CSTRING(256) CHARACTER SET NONE
ENTRY_POINT 'IsNull' MODULE_NAME 'MyUDFs';

Bemerkungen zu den Funktionsnamen und der UDF selbst

  • Der Funktionsname und der Entry-Point können gleich heissen! Müssen aber nicht (hier heisst alles "IsNull")
  • IsNull heisst die Funktion in der Delphi-Unit, die als "IsNull" exportiert wird und auch dem InterBase-System wird diese als IsNull bekanntgegeben.
  • Der DLL-Name kann ohne den Zusatz ".DLL" angegeben werden
  • Die UDF sollte/kann im \UDF-Verzeichnis der InterBase-Installation liegen, kann aber auch in eine spezifiziertem Verzeichnis ("EXTERNAL_FUNCTION_DIRECTORY Parameter der IBCONFIG liegen)
  • Die DECLARE gilt immer nur für die verbundene Datenbank! Jede UDF muss in jeder Datenbank(Datei) deklariert werden
  • Die Funktionen sieht man auch in der IBConsole:

Anschliessend funktioniert auch ein IsNull in InterBase

SELECT isnull(A."SPALTE",'Nix drin') AS RESULT
FROM
"TABELLENNAME" A;

Die Möglichkeiten sind damit (fast) unendlich.....

Source: myUDFs

RAD Studio 10.2 Tokyo Release 1 ist verfügbar (10.2.1)

$
0
0

Release Notes:

http://docwiki.embarcadero.com/RADStudio/Tokyo/de/10.2_Tokyo_-_Release_1

Download ISO:

https://cc.embarcadero.com/item/30786  (jedermann/frau) oder

https://cc.embarcadero.com/Item/30785  (registrierte Benutzer)

(Beide ISOs sind gleich.... )

Download Webinstaller:

https://cc.embarcadero.com/Item/30783

Beschreibung / Neuerungen

10.2 Tokyo – Release 1 ist ein Update für Delphi 10.2 Tokyo, C++Builder 10.2 Tokyo und RAD Studio 10.2 Tokyo, das für alle Kunden mit einem aktiven Update-Abonnement erhältlich ist.

10.2 Tokyo – Release 1 enthält die folgenden neuen Leistungsmerkmale, Verbesserungen und Fehlerkorrekturen:

  • Leistungsverbesserungen für den Delphi-Linux-Server für RAD Server und DataSnap.
  • Updates für Delphi- und C++-Compiler und -Linker, die Probleme beim Laden von Packages, insbesondere beim Debugging, auf Windows 10 Creators Update beheben.
  • Unterstützung für die neuesten Versionen von iOS und Xcode (iOS 10.3 und XCode 8.3.2) für den iOS App Store.
  • FireDAC-Unterstützung für MSSQL 2012, 2014, 2016 und ODBC-Treiber 13.
  • Wichtige Verbesserungen für den C++-Linker für das Linken großer Projekte.
  • Korrekturen und Verbesserungen für die Laufzeitbibliothek und die VCL.
  • Weitere Android-Verbesserungen zu Rendering und Leistung von Steuerelementen und Korrekturen von Problemen mit TEdit bei Android N.
  • FireDAC-Unterstützung für Exclusive Isolation Level (EN) und Transaction Wait Time (EN) von InterBase 2017.
  • Korrekturen für mehr als 140 von Kunden in Quality Portal berichtete Probleme.

Release 1 enthält auch Verbesserungen für "Tokyo Toolchain Hotfix" (veröffentlicht am 3. Mai 2017) und "Android Compatibility Patch" (veröffentlicht am 22. Juni 2017). Klicken Sie hier, um eine vollständige Liste der Features und Fehlerkorrekturen anzuzeigen.

Hinweis: Das 10.2 Tokyo – Release 1 kann nur von Kunden mit einem aktiven Update-Abonnement heruntergeladen und installiert werden.

Installation:

De/Neuinstallation mit der Möglichkeit die Einstellungen zu behalten.


Tech Tipp #8: iOS und macOS SDK Versionen

$
0
0

Frage: Ich habe das neueste Xcode installiert (hier: 8.3.3) und das Release 1 von Tokyo 10.2. Dennoch wird mir beim Importieren des SDKs nur angezeigt

  • iPhoneOS 10.3.1 bzw
  • MacOSX 10.12.4

Mein iPhone/iPad/iOS-Gerät hat aber die iOS Version 10.3.3 bzw macOS ist auf Version 10.12.6.

Das verwirrt mich!

Antwort: Das verwirrt mich auch. Die Lösung ist aber relativ einfach: Die Xcode-Version korreliert nicht mit der iOS/macOS-SDK-Version. Es gibt zur Zeit kein neueres SDK innerhalb von Xcode (veröffentlichte Versionen). Auch, wenn sich die Betriebssystemversion (iOS/macOS) erhöht, heisst das nicht zwangsläufig, daß es eine neuere SDK Version gibt.

Auf der Mac-Seite kann man das (im Terminal) schnell und leicht feststellen:

Last login: Wed Aug  9 09:13:59 on ttys000
MacBookPro:~ meissing$ xcodebuild -sdk -version

Was eine solche Ausgabe erzeugt (gekürzt):

iPhoneOS10.3.sdk - iOS 10.3 (iphoneos10.3)
SDKVersion: 10.3
Path: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk
PlatformVersion: 10.3
PlatformPath: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform
ProductBuildVersion: 14E8301
ProductCopyright: 1983-2017 Apple Inc.
ProductName: iPhone OS
ProductVersion: 10.3.1

MacOSX10.12.sdk - macOS 10.12 (macosx10.12)
SDKVersion: 10.12
Path: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk
PlatformVersion: 1.1
PlatformPath: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform
ProductBuildVersion: 16E185
ProductCopyright: 1983-2017 Apple Inc.
ProductName: Mac OS X
ProductUserVisibleVersion: 10.12.4
ProductVersion: 10.12.4

Also alles im grünen Bereich.

Apple hat die Xcode/SDK-Versionen hier dokumentiert:
https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html

Ältere Xcode Versionen und die damit enthaltenen SDKs findet man hier:
https://developer.apple.com/download/more/?name=Xcode

Pro-Tipp: Im Ordner Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/ finden sich alle SDKs der installierten Xcode-Version (normalerweise nur eins). Hier kann man (unsupported! Apple möchte, daß man immer mit dem aktuellsten SDK entwickelt) auch ältere SDKs aus älteren Xcode Versionen unterschieben (dazu muss man das alte Xcode installiert haben und die SDKs aus diesem extrahieren (Time Machine, separater Mac, macOS-VM, Kollege, ...)

Tech Tipp #9: InterBase local, RAD Studio und "unavailable database"

$
0
0

Frage: Ich nutze ein lokal installiertes InterBase. Ich möchte über Datenbankzugriffskomponenten darauf zugreifen. Aber sowohl FireDAC, als auch InterBase Express/IBX geben mir diese Nachricht:

FireDAC:

InterBase Express/IBX:

Folgende Beobachtungen habe ich gemacht:

  • Das passiert nur in der IDE - In der IBConole kann ich auf die Datenbanken zugreifen
  • Die Dateien sind definitiv vorhanden
  • Benutzernamen und -kennwort habe ich richtig eingegeben
  • Stelle ich in IBX auf "Remote" um (mit "localhost") funktioniert es
  • Stelle ich in FireDAC auf "TCPIP" um (mit server=localhost) funktioniert es

Wodran liegt das?

Antwort: Das liegt wahrscheinlich an den Umgebungsvariablen in der IDE vom RAD Studio/Delphi/C++Builder. Es gibt zwei Variablen, die hier zum Tragen kommen und vom RAD Studio für die Verbindung genommen werden. 

  • INTERBASE - Das Verzeichnis der InterBase Installation; 
  • IB_PROTOCOL - Der Instanzname; normalerweise/default "gds_db". Dies ist auch hier weiter dokumentiert. Faktisch ist das die Port-Nummer default:3050) von InterBase

Normalerweise sind diese nicht gesetzt; können aber (gerade bei Mehrfach-Instanzen von InterBase) das Ganze etwas durcheinander bringen. Man muss dann die Variablen setzen bzw ändern.

Generell können die Variablen unter "Tools | Optionen | Umgebungsoptionen | Umgebungsvariablen" gesetzt werden. Normalerweise ist dies nicht nötig, da es nur eine Instanz von InterBase gibt, aber das RAD Studio/Delphi/C++Builder kann man für die Standardwerte hier anpassen

INTERBASE
C:\Program Files\Embarcadero\InterBase
IB_PROTOCOL
gds_db

Nach dem Ändern der Umgebungsvariablen ist ein Neustart der IDE notwendig!


 

Eine andere Möglichkeit für den "unavailable database" Fehler kann InterBase selbst sein: Wenn man die "Developer-Edition" benutzt, nimmt diese nach 48 Stunden keine Verbindungen mehr an. Ein Neustart des InterBase Servers behebt dann auch das Problem.

 

Tech Tipp #10: ClearType von Delphi aus/einschalten

$
0
0

Frage: Ich möchte (aus welchen Gründen auch immer) für den aktuell angemeldeten Benutzer das ClearType von Windows ausschalten. Wie geht das?

Antwort: ClearType lässt sich unter Windows 7/8/10 mittels ClearType-Textoptimierungs-Program (cctune.exe) über die Bordmittel von Windows ein- bzw ausschalten und konfigurieren:

Dabei handelt es sich um eine Pro-User-Einstellung. Microsoft selbst stellt dafür den WinAPI-Befehl SystemParametersInfo bereit; mittels passender Aktion kann man hier das ClearType Verhalten beeinflussen.

Quick-and-Dirty Lösung (bitte weiter lesen!):

Ausschalten:

  SystemParametersInfo(SPI_SETFONTSMOOTHING,0,0,0);
  InvalidateRect(0, nil, True);

Einschalten:

  SystemParametersInfo(SPI_SETFONTSMOOTHING,1,0,0);
  InvalidateRect(0, nil, True);

Das jeweilige Absetzung von InvalidateRect(0, nil, True); erzeugt dabei einen kompletten Screen-Refresh....

Die Original-Paramter sind

BOOL WINAPI SystemParametersInfo(
  _In_    UINT  uiAction,
  _In_    UINT  uiParam,
  _Inout_ PVOID pvParam,
  _In_    UINT  fWinIni
);

Man kann, sollte das etwas besser gestalten

Einschalten:

  SystemParametersInfo(SPI_SETFONTSMOOTHING, Cardinal(true), 0, SPIF_UPDATEINIFILE OR SPIF_SENDCHANGE);
  SystemParametersInfo(SPI_SETFONTSMOOTHINGTYPE, FE_FONTSMOOTHINGCLEARTYPE, 0, SPIF_UPDATEINIFILE OR SPIF_SENDCHANGE);

Ausschalten:

  SystemParametersInfo(SPI_SETFONTSMOOTHING, Cardinal(false), 0, SPIF_UPDATEINIFILE OR SPIF_SENDCHANGE);

Dadurch erreicht man beim Einschalten vier Dinge:

  • Cardinaltype wird richtig/leserlicher gesetzt
  • Durch SPIF_UPDATEINIFILE wird das auch persistent in der Windows-Umgebung gespeichert
  • Durch SPIF_SENDCHANGE wird auch gleich die Message zur Aktualisierung der Oberfläche gesendet (ein InvalidateRect ist nicht mehr nötig)
  • Durch eine zusätzliche "Action" SPI_SETFONTSMOOTHINGTYPE wird der Type des ClearType gesetzt (siehe MSDN-Doku-Link weiter oben)

Beim Ausschalten erreicht man nur bessere/konformere Lesbarkeit und das senden der Window-Message zur Aktualisierung.

 

 

Neuigkeiten im RAD Studio 10.2.1 (Release 1) und GetIt

$
0
0

Es gibt einige interessante Neuigkeiten im RAD Studio 10.2 Tokyo Release 1 (AKA 10.2.1).

Einige möchte ich hier explizit erwähnen:

  • Kompatibilität zum Creators Update von Windows 10
    Es gab Probleme beim Debugger unter dem Creators Update, die das Laden von Packages (nicht nur beim Debugger) sehr langsam gemacht haben. Behoben!
  • Probleme beim Deployment mit iOS/Xcode in der letzten, aktuellen Version. Behoben!
  • C++Builder Linker Verbesserungen beim Linken großer Projekte
  • FireDAC-Unterstützung für Exclusive Isolation Level und Transaction Wait Time von InterBase 2017. 
  • Erste, nicht endgültige, Verbesserungen für das Laufzeitverhalten von Android-Anwendungen
  • Eine vollständige Liste findet sich hier

Beim VCL-Scaling von vererbten Formularen sind wir etwas über das Ziel hinausgeschossen; aber auch dafür gibt es einen Patch:
https://cc.embarcadero.com/Item/30798

Der Hotfix adressiert den Fehler RSP-18792. Der Hotfix ist *nach* der Installation vom Release 1 (10.2.1) anzuwenden.

Neu sind auch weitere Downloads für/über den GetIt Package Manager:

 

Video Tutorial #2/#3: CodeSite Express / Beyond Compare

$
0
0

Zwei weitere Videos aus meiner Video-Tipp-Reihe:


[YoutubeButton url='https://www.youtube.com/watch?v=EgZLt5l0mHM']

[YoutubeButton url='https://www.youtube.com/watch?v=QbkuOluQw2k']

Wi-Fi management from applications using C++Builder

$
0
0

Using C++Builder 10.2 Tokyo, explain how to switch Wi-Fi on Android.

Manage Wi-Fi switching using JWifiManager

I use di_JWifiManager which wrapped WifiManager.
di_JWifiManager is the Delphi interface.
Set the variable. _di_JWifiManager f_WifiManager; use it like this.

Required headers

Header file for using WifiManager.

#include <Androidapi.JNI.Net.hpp>
#include <Androidapi.Helpers.hpp>
#include <Androidapi.JNI.GraphicsContentViewText.hpp>
#include <Androidapi.JNIBridge.hpp>

Display design

It is a design for displaying on Android.


TEditTSwitchTTimerTLabel, was placed.

 

When the main form creation

Create _di_JWifiManager using TJWifiManager.

//---------------------------------------------------------------------------
void __fastcall Tfm_main_wifistatus::FormCreate(TObject *Sender)
{
    //Form creation.Using TAndroidHelper, get the WIFI_SERVICE.
    _di_JObject obj = TAndroidHelper::Activity->getSystemService(TJContext::JavaClass->WIFI_SERVICE);
    if (obj != nullptr)
    {
        //Wrap to TJWifiManager.
        f_WifiManager = TJWifiManager::Wrap(_di_ILocalObject(obj)->GetObjectID());
        if (f_WifiManager != nullptr)
        {
            Timer1->Enabled = true;
        }
    }
}

Monitor Wi-Fi status at Timer1 event.

void __fastcall Tfm_main_wifistatus::Timer1Timer(TObject *Sender)
{
    //Use a timer event to monitor the Wi-Fi state.
    //Write state change to Edit1->Text. and It also reflects Switch1->IsChecked.
    Timer1->Enabled = false;
    if (f_WifiManager != nullptr)
    {
        Switch1->IsChecked = f_WifiManager->isWifiEnabled();
        UnicodeString wifistr;
        (Switch1->IsChecked)?wifistr = "true": wifistr = "false";
        Edit1->Text = "f_WifiManager->isWifiEnabled() = " + wifistr;
    }
    Timer1->Enabled = true;
}

When you tap the Switch1.

Change the Wi-Fi status when tapping the Switch1.
This uses the setWifiEnabled() function.

void __fastcall Tfm_main_wifistatus::Switch1Switch(TObject *Sender)
{
    //This is a Switch1 change event.
    Timer1->Enabled = false;
    //Set the value of Switch1->IsChecked to setWifiEnabled()
    f_WifiManager->setWifiEnabled(Switch1->IsChecked);
    TThread::CreateAnonymousThread([this]()
    {
        sleep(1);
        TThread::Synchronize(TThread::CurrentThread, [this]()
        {
            Timer1->Enabled = true;
        });
    })->Start();
}

 

https://github.com/mojeld/cpp_builder_firemonkey_wifi

 

New in 10.2.1: Debug visualisers for Delphi generics

$
0
0

Debug visualisers are a type of IDE plugin that allows you to change the display of a variable in the various debug windows (Local Variables, Watches, Inspector, and Evaluate/Modify.) For example, the TDateTime visualiser takes the double value that represents time and instead displays that time converted to a string. You register a debug visualiser for a type, so all variables of that type, and optionally descendants of that type, go through your visualiser.

In previous versions, this type was specified by a plain string, such as 'TComponent', and there was no way to handle a generic type. If you registered 'MyGeneric<T>', the visualiser would never be called, because the concrete instantiations of that type do not use T - they might be 'MyGeneric<Integer>', 'MyGeneric<TButton>', and so forth.

In 10.2.1, we have introduced support for registering a visualiser for a generic type. Your visualizer can implement IOTADebuggerVisualizer250 as well as the prior IOTADebuggerVisualizer, where the GetSupportedType method allows you to specify that the type string is a generic:

 

.
  IOTADebuggerVisualizer250 = interface(IOTADebuggerVisualizer)
    ['{DC0C8D82-B783-4205-B3F4-D325BA8B3EEB}']
    { Return the Index'd Type.  TypeName is the type.  AllDescendants indicates
      whether or not types descending from this type should use this visualizer
      as well. IsGeneric indicates whether this type is a generic type. }
    procedure GetSupportedType(Index: Integer; var TypeName: string;
      var AllDescendants: Boolean; var IsGeneric: Boolean); overload;
  end;

This means you can register for MyGeneric<T> and your visualiser will be called for all MyGeneric<>s. This is all generic types, ie interfaces as well as classes. 

One note is that we do not yet support registering for descendants of a generic type, meaning that if you have MyDesc<T> = class(MyGeneric<T>) or MyDesc = class(MyGeneric<T>), you need to register a visualiser for MyDesc separately. This is because of some complexities in the internal evaluator.

Generics are widely used, especially for collections like dictionaries and lists, and in third-party libraries like Spring4D. We hope you will find visualiser support for generics useful!

Update: here is a code snippet demonstrating a template visualizer


To get the NetworkInfo using the ConnectivityManager of Android

$
0
0

 

Using ConnectivityManager with C++Builder

With C++Builder 10.2 Tokyo Android ConnectivityManager class is available.
Use the ConnectivityManager, you can get NetworkInfo
NetworkInfo see various network information.
inside that, The getType() function is Reports the type of network.
The getType() function return is int.

int type
0x00000000 TYPE_MOBILE
0x00000001 TYPE_WIFI
0x00000006 TYPE_WIMAX
0x00000009 TYPE_ETHERNET
0x00000007 TYPE_BLUETOOTH

I tried ways to get NetworkInfo.

Declare _di_JConnectivityManager variable.

_di_JConnectivityManager is the ConnectivityManager class interface.

 _di_JConnectivityManager    f_ConnectivityManager;

It creates to use '_di_JConnectivityManager'.

template <typename T1, typename T2> void __fastcall Tfm_main_wifistatus::getService(_di_JObject obj, T1& iobj)
{
    if (obj != nullptr)
    {
        iobj = T2::Wrap(_di_ILocalObject(obj)->GetObjectID());
    }
}
void __fastcall Tfm_main_wifistatus::FormCreate(TObject *Sender)
{
    //Form creation.Using TAndroidHelper, get the CONNECTIVITY_SERVICE.
    getService<_di_JConnectivityManager, TJConnectivityManager>(
        TAndroidHelper::Context->getSystemService(TJContext::JavaClass->CONNECTIVITY_SERVICE), f_ConnectivityManager);
}

Get the _di_JNetworkInfo using the getActiveNetworkInfo() function.

//TJConnectivityManager::JavaClass->TYPE_WIFI;
#define TYPE_WIFI 0x00000001
//TJConnectivityManager::JavaClass->TYPE_MOBILE;
#define TYPE_MOBILE 0x00000000
//TJConnectivityManager::JavaClass->TYPE_VPN;
#define TYPE_VPN 0x00000011
//TJConnectivityManager::JavaClass->TYPE_WIMAX;
#define TYPE_WIMAX 0x00000006

void __fastcall Tfm_main_wifistatus::Timer1Timer(TObject *Sender)
{
        UnicodeString net_str;
        _di_JNetworkInfo n_info = f_ConnectivityManager->getActiveNetworkInfo();
        if (n_info != nullptr)
        {
            switch (n_info->getType())
            {
            case TYPE_WIFI:
                net_str = L"(TYPE_WIFI)";    break;
            case TYPE_MOBILE:
                net_str = L"(TYPE_MOBILE)";  break;
            case TYPE_VPN:
                net_str = L"(TYPE_VPN)"; break;
            }
        }
        else
            net_str = L"(nullptr)";
}

You can get the status of a network interface.

Save Paradox Blob format to a file using BDE

$
0
0

C++Builder 10.2 Tokyo does not have BDE installed.
So, Install BDE separately in C++Builder 10.2 Tokyo.
It is after the end of the all of the installation.

 

Download BDE Installer for RAD Studio, Delphi, C++Builder 10.2 Tokyo

Download the installer from the URL below.
ID: 30752, BDE Installer for RAD Studio, Delphi, C++Builder 10.2 Tokyo 

 

Check the Paradox data.

Use the sample file named biolife.db.
This is sample data of Paradox.
I brought it from C++Builder 5 sample data.

There is a "Graphic" field in biolife.db. "Graphic" is Blob type.

 

Save the Blob data in the JPEG format using the BDE.

In VCL, JPEG can be processed using TJPEGImage.

#include <Vcl.Imaging.jpeg.hpp>

Use TTable to get all of biolife.db.

//---------------------------------------------------------------------------
void __fastcall TfmMain::bde_biofish_save()
{
    // created a new TTable and set the biolife table.
    std::auto_ptr<TTable> l_table( new TTable(this));
    l_table->DatabaseName    = "DBDEMOS";
    l_table->TableName      = "biolife.db";
    l_table->Active         = true;
    l_table->FindFirst();
    //Loop for acquiring all data.
    while (! l_table->Eof)
    {
        std::tr1::shared_ptr<TJPEGImage> l_jpeg(new TJPEGImage());
        std::tr1::shared_ptr<TMemoryStream> l_ms(new TMemoryStream());

        //Using the CreateBlobStream() function will create a new TStream.
        //Instances created with TStream need to be deleted.
        std::tr1::shared_ptr<TStream> ss(l_table->CreateBlobStream(
            l_table->FieldByName("Graphic"), TBlobStreamMode::bmRead));
        ss->Position = 8;
        l_ms->CopyFrom(ss.get(), ss->Size-8);
        l_ms->Position = 0;
        std::tr1::shared_ptr<TBitmap> b(new TBitmap());
        b->LoadFromStream(l_ms.get());
        //Convert calling Bitmap data to jpeg.
        l_jpeg->Assign(b.get());

        //When saving JPEG, the file name is "Species No" and "Species Name".
        l_jpeg->SaveToFile(l_table->FieldByName("Species No")->AsString + "_" +
            StringReplace(l_table->FieldByName("Species Name")->AsString, " ", "_", TReplaceFlags() <<rfReplaceAll) +
            ".jpeg");
        //Move to the next record.
        l_table->Next();
    }
}

Make the file name "Species No" + "Species Name" + ". Jpeg".
"Species No" + "Species Name" exists in DB field.

 

 

 

Confirm the output JPEG data

Back to the Future: Rückblick Forentage in Hamburg und EKON in Köln

$
0
0

In den letzten Tagen war es hier etwas ruhig..... Konferenzen und Urlaub muss auch mal sein.

Hier einige Eindrücke von den Forentagen in Hamburg:

Sebastian Gingter

Haupt-Session-Raum / Panorama

Die Vortragenden:

David Millington, Stefan Glienke, Bernd Ott, Sebastian Gingter, Volker Hillmann, Christina Kruse, Bernd Ua, Ulf Klarmann, Frank Lauter, Bruno Fierens, Uwe Raabe, ....

Und natürlich von der EKON aus Köln:

Marco Cantus Keynote

Bernd Ua Keynote

Einer meiner Vorträge

Mit insgesamt weit über 250 Teilnehmern wirklich tolle und erfolgreiche Veranstaltungen.

 

iPhone X, Face ID und Delphi

$
0
0

Apple bietet für das iPhone X eine neue Autorisierungsmöglichkeit an: Face ID. Generell ist Face ID, als Nachfolger von Touch ID (dem Fingerabdrucksensor seit dem iPhone 5S) auf API Ebene kompatibel zu Touch ID. Also sollte die kleine Unit von https://bitbucket.org/allesbeste/ios-touchid-wrapper-for-delphi auch hier mit Face ID funktionieren.

Und die Unit funktioniert auch mit Delphi und Face ID auf dem iPhone X:

Generell kapselt die Unit iOSapi.LocalAuthentication (vom oben angegeben Link) die absoluten, aber ausreichenden Grundfunktionalitäten aus dem LocalAuthetication-Framework: Die Fallback-Methode habe ich etwas umgeschrieben. Hier wird die Statusbar (ein anderes Thema für iPhone X) einfach rot oder grün gefärbt:

uses
[...] iOSapi.LocalAuthentication [...]


procedure TFormIrgendwas.TouchIDReply(success, error: Pointer); var bSuccess: Boolean; begin bSuccess := false; if not Assigned(error) AND Assigned(success) then begin bSuccess := ((Integer(success)) = 1); end; if bSuccess then begin // hat geklappt! Autorisiert self.SystemStatusBar.BackgroundColor := TAlphaColorRec.Darkgreen; end else begin // keine Autorisierung! self.SystemStatusBar.BackgroundColor := TAlphaColorRec.Darkred; end; // Form neu zeichnen self.Invalidate; end;

RAD Studio 10.2.2 Released Today

$
0
0

I am excited to announce that RAD Studio 10.2.2 was released today. 10.2 Tokyo, Release 2 (also known as 10.2.2) is an update of Delphi 10.2 Tokyo, C++Builder 10.2 Tokyo and RAD Studio 10.2 Tokyo available for any active Update Subscription customer.

 

10.2.2 Registered User Download Links:

Docwiki: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/10.2_Tokyo_-_Release_2  

 

Several key new features were added, including FireMonkey Quick Edit support, a number of new VCL controls, a new dark themed IDE option, a RAD Server single site deployment license in Enterprise and Architect editions, installer and welcome page enhancements and more.

 

Also included is newly added support for macOS High Sierra, and enhanced platform support for iOS 11 (including iPhone X), Android 8, Windows 10, and Linux, additional enhancements throughout various product areas, and over quality improvements to over 150 publicly reported issues.

 

 

Key RAD Studio 10.2.2 Features:

The new dark theme is designed for night-time work or lengthy use, with updated component icons that complement both the light and dark theme. Easily toggle between the newly added dark theme and the existing light theme through a newly provided option on the desktop toolbar in the IDE.

 

 

Improve developer productivity with the new Quick Edit feature for FireMonkey, allowing you to quickly perform common actions in the FireMonkey Form Designer.

 

 

 

Also new in 10.2.2 are four new VCL Windows GUI controls, designed with Windows 10 in mind.

  • TCardPanel: The new Card Panel is a specialized component that manages a collection of cards.
  • TStackPanel: The Stack Panel is a new container control that allows you to automatically align all parented controls vertically or horizontally while retaining each control's custom height and width settings.
  • TDatePicker and TTimePicker are modern date and time picker controls with support for multiple formatting options, a custom drop-down count and ok and cancel date and time selection buttons.

 

 

Also new is an updated IDE Welcome Page with new sample projects, videos from our YouTube channel, and a calendar of local and global events to help new users get started quickly.

 

Delphi, C++Builder and RAD Studio Enterprise and Architect editions now include a RAD Server Single Site/Single Server deployment license. Also covered by the included single site RAD Server license is BeaconFence deployment for a single location with unlimited users, and no square footage limitation

 

We've also enhanced our JavaScript client support for Sencha Ext JS with RAD Server through TDataSet JSON mapping.

 

Click on our new 10.2.2 product video below to see the key new features in action:


[YoutubeButton url='https://www.youtube.com/watch?v=iGnJANX18uw']

 

New to RAD Studio? Download the RAD Studio 10.2.2 Trial today!

Viewing all 238 articles
Browse latest View live


Latest Images

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>