Friday, September 30, 2016

FMX & Sony SmartWatch 3

Meine neue SmartWatch 3 ist gerade gekommen...

Ausgepackt - natürlich mit dem iPhone verbunden - eingerichtet -  Developer Modus - Testapp drauf:

Läuft!
 
LowLevel3D Demo aus den Beispielen...
Läuft!
 
Apps deinstallieren - kurz googeln : Stackoverflow ->  per adb.exe uninstall packagename
Läuft!
 
Test abgeschlossen - Timer stoppen 10 Min... :-)
 
So mag ich es...
 
Jetzt beginnt die Arbeit.

Wie alt man ist, stellt man fest wenn:

Ein Raum voller Programmierer... alle jünger ( < 25 )... Die Frage kommt: Und was machst Du?

Dann gibt man die ein oder andere Antwort und muss feststellen... Ich bin alt...

Woran merkt man das? Die haben alle eine völlig andere Sichtweise auf die Technik und  die Programmierung.

den:

  • Man(n) "schwafelt" von Zeiten als es noch kein Internet gab.
  • nicht jeder ein Handy, geschweige den ein Smartphone hatte.
  • Eine 1GB Festplatte 5000 DM kostete.
  • Es keinen Sinn machte größere Festplatten als 30MB zu kaufen, da das Betriebssystem nicht mehr adressieren konnte.
  • Man(n) mit dem Modem sich in eine Mailbox eingewählt hat um stundenlang ein Bild in 320x200 zu laden.
  • Das wenn man "online" war - keiner im Haus mehr telefonieren konnte.
  • Man(n) nach dem kompilieren erst mal die Diskette mit dem Linker einlegen musste
  • Man(n) Programme in Assembler programmierte und 1000Byte Code schon richtig viel war...
  • Ein auf den Druckkopf des Nadeldruckers geklebter Lichtsensor als Scanner funktionierte...

Verwunderte Augen schauen einen an... Und man(n) stellt fest... Ich komme aus der Steinzeit.

Und dann die Antwort die alles verändert. : "Ich wäre froh wenn ich so viel Erfahrung hätte"

Ich bin nicht alt... Ich bin nur schon viel länger dabei...




Wednesday, September 28, 2016

Delphitage 2016 - Nachlese

Die Delphitage 2016 waren sicherlich das Highlight des "Delphijahres".
Es ist zwar noch nicht ganz rum, aber den Spass den Ich/Wir auf dieser Veranstaltung hatten ist schwer zu toppen.

Am besten spiegelt es vielleicht diese Foto von Alexander (c), Olaf (r) und mir (l) wieder:



Interessante Gespräche rund um Delphi sind auf so einer Veranstaltung selbstverständlich, aber es bot sich auch genügend Zeit für private Gespräche.

Für mich immer wieder interessant zu sehen, wie vielschichtig die Umgebungen und Voraussetzung der anderen Developer sind.

Mein persönliches Fazit aus diesen Gesprächen: Viele Firmen und Projekte hängen noch an alten Delphi Versionen. Hierbei geht es um:

1.) Unicode Umstellung
2.) Datenbank-Komponenten (BDE usw.)
3.) Frendkomponenten

Für mich wäre es nicht mehr möglich mit einer Delphiversion vor XE6 - produktiv - zu arbeiten. Ob wohl mein (Monster-)Hauptprojekt auch noch nicht die Unicode-Umstellung vollzogen hat. Ich kenne daher die Probleme.

Bei entsprechendem Interesse würde ich in diesem Zusammenhang auch einen speziellen Workshop zu diesem Thema anbieten.

PS.: Interessant zu sehen... Es gibt einen neuen Menüpunkt auf der EMBT Homepage zu diesem Thema!

Saturday, September 24, 2016

FMX - Textlayout mit verschiedenen Farben (D2D)

Nachdem ich den Font-Free-Fehler aus FMX.TextLayout.pas beseitigt habe, konnte ich die TextLayout Ausgabe aus FMX.Canvas.D2D.pas entsprechend erweitern, sodass es endlich möglich ist Formatieren Text mit verschieden farbigen Paragraphen ausgeben zu können.

Hierfür waren einige Eingriffe in die Grundroutinen nötig.

Das Ergebnis sieht dann - so wie man es eigentlich erwartet - so aus:


Ich werde meine Änderungen mal an EMBT senden...

PS: Die Blocksatzroutine ist kein Feature per D2D mit DWRITE_TEXT_ALIGNMENT_JUSTIFIED  das ist natürlich für Windows nur eine Zeile... "Meine" Blocksatz Routine funktioniert auf allen Plattformen.

Friday, September 23, 2016

FMX & Blocksatz

Hallo!

Leider kann FMX - genau wie die alten RTF Routinen - kein Blocksatz. Da ich aber Texte am liebsten im Blocksatz lese, habe ich einen kleinen Wrapper für das Layout-Rendering programmiert.


 
 
Schriftumschaltungen wie Fett usw. funktionieren schon.. Farbige Texte noch nicht, da die Windows Routine das leider nicht kann. Es gibt auch leider zwischen den Plattformen noch einige unterschiede, aber das wird der Wrapper berücksichtigen.

Thursday, September 22, 2016

FMX - IFDEF oder gibt es etwas besseres.

Warum haben wir IFDEF's in unseren Sourcecode?

Weil wir:
  1. unseren Code mit verschiedenen Delphi Versionen übersetzen wollen und hierfür Änderungen nötig sind.
  2. Funktionalitäten an- und abschalten wollen.
  3. auf die Prozessor Struktur reagieren müssen. (32/64 Bit)
  4. auf unterschiedliche Betriebssystem reagieren müssen...
Das sind doch die wichtigsten Gründe, oder?

Gibe es hier nicht bessere Lösungen?

Na Klar...

Nicht für alle 4 Punkte...

Um es einfach zu sagen: Die RTL macht es vor!

Über die Plattform-Dienste werden die eigentlichen Implementationen je nach Plattform registriert und der Rest linked gegen ein Interface...

Wenn es gut genug ist für dir RTL - sollten wir dieses Designpattern auch in unseren Applications anwenden.

Aber was ist, wenn wir kein IFDEF nehmen können, weil wir zur Laufzeit entscheiden müssen?

Klar nen IF auf eine Variable wird jeder sagen!

Ich mache es so (vereinfacht für das Beispiel! Im eigentlich Code passe ich das Ganze noch an den Text an):


type
  TMyOSPlatform = (Windows, OSX, iOS, Android);
  TOSPlatforms = Set of TMyOSPlatform;
 
 

Procedure InitFMX;
begin
  TGetByID.Default.Register(Windows,
   Function (Const Prop : String) : Single
     begin
       Case TFDKHelper.CaseSelector(Uppercase(Prop),[
        {0} 'WIDTH',
        {1} 'HEIGHT',
        {2} 'MARGINLEFT' ]) of
         0 : Result := 121;
         1 : Result := 22;
         2 : Result := 40;
       end; // of case
     end);

   TGetByID.Default.Register(OSX,
    Function (Const Prop : String) : Single
     begin
       Case TFDKHelper.CaseSelector(Uppercase(Prop),[
        {0} 'WIDTH',
        {1} 'HEIGHT',
        {2} 'MARGINLEFT' ]) of
         0 : Result := 128;
         1 : Result := 24;
         2 : Result := 40;
       end; // of case
     end);

   TGetByID.Default.Register(iOS,
    Function (Const Prop : String) : Single
     begin

       Case TFDKHelper.CaseSelector(Uppercase(Prop),[
        {0} 'WIDTH',
        {1} 'HEIGHT',
        {2} 'MARGINLEFT' ]) of
         0 : Result := 138;
         1 : Result := 24;
         2 : Result := 40;
       end; // of case
     end);

   TGetByID.Default.Register(Android,
    Function (Const Prop : String) : Single    
     begin
       Case TFDKHelper.CaseSelector(Uppercase(Prop),[
        {0} 'WIDTH',
        {1} 'HEIGHT',
        {2} 'MARGINLEFT' ]) of
         0 : Result := 140;
         1 : Result := 28;
         2 : Result := 40;
       end; // of case
    end);
end;

ByPlatform :=
  Function (Prop : String) : Single
   begin
     Result := TGetByID.Default.From(IDAktPlatform,Prop);
   end;

Procedure Whatever;
begin

  Button.Width        := ByPlatform('Width');
  Button.Height       := ByPlatform('Height');  
  Button.Margins.Left := ByPlatform('MarginLeft');
end;



So ist der Zugriff im Code einfacher!