Wednesday, December 6, 2017

Delphi Entwickler (m/w) gesucht!

Programmierer (m/w) für Delphi 2007 und XE 10.x.x!

Für die Weiterentwicklung einer Software für Gerichtsvollzieher in Deutschland suchen wir Programmierer mit hervorragenden Delphi Kenntnissen.

Unser Unternehmen ist der Marktführer im Bereich Gerichtsvollziehersoftware und seit über 30 Jahren auf dem Markt. Mehr als 2.200 Gerichtsvollzieher im Bundesgebiet zählen zu den Kunden. Die Software hat einen enormen Funktionsumfang und der Aufgabenbereich der Gerichtsvollzieher ist ausgesprochen groß.

Ihre Aufgaben:

  • Weiterentwicklung einer umfangreichen Software für Gerichtsvollzieher sowie einiger Nebenprodukte
  • Fehleranalyse und Optimierung
  • Unsere Anforderungen:
  • Hervorragende Kenntnisse in Delphi
  • Fähigkeit, sich in mehrere Millionen Zeilen Sourcecode einzuarbeiten
  • Optional: Erfahrung mit FireMonkey zur Entwicklung von Apple sowie Android Apps
  • Hohe Lernbereitschaft, da Sie viele Arbeitsabläufe eines Gerichtsvollziehers und der Justiz nebst zahlreicher Fachbegriffe erlernen müssen
  • Geduld, Freundlichkeit und eigenständiges Arbeiten
  • Gute Ausdrucksweise, einwandfreies Deutsch in Wort und Schrift

Wir bieten:

  • Sehr sicherer Arbeitsplatz und unbefristete Einstellung beim Marktführer
  • Langfristiges Beschäftigungsverhältnis
  • gute Aufstiegsmöglichkeiten.
  • Nur Festanstellung, kein Heimarbeitsplatz, kein Außendienst, gutes Arbeitsgerät – z.B. nutzen die Programmierer bis zu sechs 40“ UHD Bildschirme gleichzeitig.
  • Stetig neue Herausforderungen und Veränderungen
  • 3 im Thema eingearbeitete Programmierer sowie einige Gerichtsvollzieher zur Unterstützung
  • Ggf. Ausweitung Ihrer Tätigkeit (mehr Verantwortung, eigenständige Entwicklung, Schulungen, Präsentationen)
  • Kleines Unternehmen mit momentan 9 Angestellten
  • Ggf. Unterstützung bei einem notwendigen Umzug
  • Über Ihre aussagekräftigen Bewerbungsunterlagen, mit Beschreibung Ihrer Programmiererfahrung/–kenntnisse, Angabe Ihrer Gehaltsvorstellung und Nennung des frühestmöglichen Arbeitsbeginns freuen wir uns.

Für Rückfragen stehen wir gerne zur Verfügung.

Einen kleinen Einblick über unsere Produkte erhalten Sie auf unserer Webseite

Baqué & Lauter GmbH
Flamersheimer Weg 3
53881 Euskirchen Palmersheim

Monday, November 27, 2017

Back in my office.


After 19 days of workshops with nearly 1600 customer and more than 7000km on the road, I'm back in the office. So I need some time to look through the stacks of Paper on my desk, but after that I will do the FDK update before the end of the year.

Monday, October 2, 2017


Using Facebook or this blog?

OK - Perhaps technical Infos in this blog and Funstuff on Facebook...

I have to look for a cat using my FDK for the best Facebook user experience...


Sunday, September 24, 2017

Forentage 2017 - Sonderaktion

Hallo Zusammen!

Leider hatte ich die Bestellformulare mit einem Sonderpreis für mein FDK - im Auto - im Kofferraum -  im Saturnparkhaus vergessen.

Natürlich hätte es eine Sonderpreis für Bestellung auf den ForenTagen gegeben!

Also: Befristet bis zum 15.10.2017 gibt es mein FDK für 349,- € (statt 399,- €)

Einfach das Setup downloaden und registrieren!!

Infos unter :

Die nächste Version ist in Vorbereitung.

INFO: Die MVVM-Teile sind zur Zeit noch nicht enthalten!

Tuesday, September 5, 2017

Scanning barcodes the FDK-way

You like to scan barcodes in your app?

Ok, you probably googled this topic! But you will find solutions only for iOS or solutions only for Android. Perhaps a preinstalled third-party app must be installed.

Of course, there are solutions for both platforms, but for free?

And how long does it take to integrate this into your app?

Perhaps you consider the FDK approach:



  FScanbarcodes : ICanScanBarcodes;

procedure TFormMain.ScanClick(Sender: TObject);
  FScanbarcodes := TAnyFactory.Factory.CreateObj<ICanScanBarcodes>;
  FScanBarcodes.ScanResult(Procedure (AResult : String)
      LBLScanResult.Text := AResult;
      FScanbarcodes := NIL;

Internal I'm using the ZXING Source for Android. For iOS you can choose between the ZBar or the ZXING version. ZBar ist based on the TMSWrapper for ZBar!

The ZXING Version is inspired by MVP Andrea Magni but without the FrameStand and other overhead.

Threading is done with my TAnyCommandProcessor, which can queue the workflow for the Bitmaps, that are captured with the TCameraComponent!

Tuesday, August 15, 2017


Why I Choose Delphi?

Starting with UCSD-Pascal in school on Apple II. I used my Sharp MZ-800 (Z80 CPU) with CP/M and Turbo Pascal 1.0. I had a special utility to write IBM-Disks on MZ-800. So I was able to transfer my “homework” to the IBM XT, to show my work in school, with Turbo Pascal 1.0, too.

At this point, I got an offer to do a business application. This application was my first real Pascal application, too.
Before that, all my programs were programmed in Z80 assemblers, like my own 1000 byte Disk-Operating-System - FL-DOS from 1986.

To keep the necessary procedures together, I collected procedures in “one” Pas File called Runtime.pas.

“Yes”, this unit is still alive today but called Basis.pas and wBasis.pas for Windows-Stuff. I collected a million lines of source-code and unites over the years. Some have changed but many are still in use.

Starting with e.g. C# would take me month or years to reproduce my “runtime” core procedures.

That is the practical side. Besides this, for me, a compiler has to produce an exe…
No P-Code, no script no runtime interpretation. “My” compiler has to produce a standalone application that brings everything with it. No runtime stuff that had to be prior installed.

Ok, .NET was a “not so bad idea”. To have code that could be optimized for the given CPU at first run. Do we have this kind of “run on RISC-CPU” environment?

So let’s compare:

#C could be a choice because the code is like Pascal or not so far away!
C / C++, source code looks like someone had rolled an Armadillo over the keyboard.

End of List…

Yes, you can do everything in Delphi! However, If you are looking for some special things, you always find the source in C* but not in Delphi. For these small parts. Compile with C* link an object or use a DLL, done.

Have I tried to switch to C#? Yes but, I’m so much faster in writing Delphi… It was a waste of time and btw. I hate MS-IDE. (I still use the original WordStar key mapping from my early days on CP/M).
Remember the famous words: “The clueless people shall spend their time reinventing the wheel, while the elite merely uses the WordStar key mappings”.

Let us not talk about Pascal / Delphi as a source-code. One of the big things is productivity. The IDE and the compilation speed. Turn cycles are a major point in development.

Set Breakpoint, F9 to compile and start, debug, STRG-F2 to stop, change something and hit F9 again…. If you like, you can do this thousand times in an hour.

For many years I took the RAD approach – button on the Form -> double-Click -> and go with the code… Why not!
This was the time where nobody talked about design patterns, separation of form and code or other things. Why? No Internet…
Yes, I know the Internet starts on 1989/1991 and my Application was for Win95. However, when did you start your first AOL Internet over Hayes-Modem “You have new Mail” – Client?

We don’t talk about Borland-Pascal for Windows – But I had a small working Demo of my Software, simulating the DOS-Screen in a Windows-Frame… (If you ask me, I’ve never done this).

My Company depends on Delphi and I have no problem with this…

Because Delphi is the best development tool, I’ve ever seen.

Sunday, July 30, 2017

SQL, how do you write your queries?

OK - I know there are many ways to do a simple SQL Query... Like:

Query.SQL.Text := 'SELECT * FROM PersonDB where LastName LIKE "'+ALastName+'%" order by LastName,FirstName ASC LIMIT 50';

of course using Parameter is a better way, like:

Query.SQL.Text := 'SELECT * FROM PersonDB where LastName LIKE :0 order by LastName,FirstName ASC LIMIT 50';
Query.SQL.Params[0].AsString := ALastName+'%';

Perhaps you set you statements in the ObjectInspector or you copy the statement from an other tool.

But what if you are new to SQL?

What kind of errors happens in your SQLQuery?
Misspelled fieldname? Missing brackets, missing space or ",".

The problem is,- normally -  you can only find  this errors by executing the statement...

In my FDK I have all database definition in my sourcecode. All fields can easily checked against this definition.

If I do a search for a Person in my PersonDB, I like to shorten the search result by typing not only the Lastname... I like a search of both Firstname and Lastname.

If I search for my name in this database I can put "Lau,Fr" into the Searchedit and I get the result of all Person starting with the Lastname LIKE "Lau%" and FirstName LIKE "Fr%".

Perhaps you do other combinations.
In this case you always have an If or Case statement to select the right SQL, - or - to Ignore NULL DB Fields.

In my latest development of my ORM/CRUD DB Interface, I tried to include this expectations in my FDK.

For the given search problem I have this solution in every application:
procedure TPersonViewModel.Search(Const ASearchFor : String);
  LastName  : String;
  P         : Integer;
  LastName  :=  ASearchFor.Trim+'%';  
  P := Pos(',',ASearchFor);
  if P > 0
    then begin
FirstName := Copy(LastName,succ(P),
    else FirstName   := '';

  // Normally
  if FirstName.Trim = ''
Query.SQL.Text := 'SELECT ...'// Without FirstName
    else Query.SQL.Text := 'SELECT ...';// With FirstName

But I don't like this untestable SQL in this procedure. So I came up with this:

procedure TPersonViewModel.Search(Const ASearchFor : String);
SearchResult : ICanCRUDSearch; // from my CRUD-Framework
// .. Same as above
  // .. Same as above and then

   {} Where('LASTNAME').LIKE(LastName.Trim).
   {}   begin_Optional(FirstName.Trim <> '').
   {}     _AND.Where('FIRSTNAME').LIKE(FirstName.Trim).
   {}   end_Optional.
   {} OrderBy('LASTNAME').OrderBy('FIRSTNAME ASC').
   {} Limit(100).
   {} Start(SearchResult);

   if SearchResult.SyntaxOnly then
   // Perform UserIO on SearchResult

And for Unit-Testing you can just call this same procedure and "Start" performs a systaxcheck only.

Perhaps you call it "Over Engineering" - I call it helpful. And more:

I love this kind of fluid-source-code. It's so easy to read and understandable.

The {} in front of each line are only to prevent the sourcecode formatter to kill my structure.

The Fluid-Interface helps you to build your statement - of course you should know a little bit of SQL, but...e.g.

After "Where" you can only use a comparer "LIKE, EQUAL, GREATER...". That's why "Where" is defined as

     ICanCRUDWhere = Interface
    Function  Where(Const AName : String) : ICanCRUDCompare;

  ICanCRUDCompare = Interface
    Function  LIKE(Const AValue : String) : ICanCRUDSearch;
    Function  EQUALS(Const AValue : String) : ICanCRUDSearch;
    // more...

The SearchResult stores the Data and you can iterate through it.

My FDK.FMXGridHelper can take this SearchResult and could direct perform the UserIO.

The CleanUp is done by RefCounting automatically.

Stay tuned for the next FDK update... More is coming...

Friday, July 14, 2017

Which Delphi Language Features are necessary?

Long time ago I was very satisfied with (Turbo)-Pascal.

Everything was fine! My world full of Records, (Fixed)Arrays and Shortstring has made me happy.

There was no need for a Database - I could read and write my Records - as easy as it could be - with blockread and blockwrite...

At this time I was able to write any program I wanted. (for the Kids: Program was the name in these days, today you would call it App)

Then "suddenly" records where bad and I "had to" use classes...

Too Bad... No block-read/write any more.. At this time you had to use Streams... (It finally leads to the same call, but "nobody" knows this...) 

Next Step: You could do fancy things with class operators and implicit. So back to Records?

Then, "suddenly" classes are bad and you have to code against Interfaces to decouple things for Unittests. Have you ever done Unittest in these "old" days?

As time goes by, new compilers were ignored... Delphi 2007 could be used for everything... Windows, Windows-Server(ISAPI.DLL) and ASP.NET...

Sometimes I took a look at new compilers, but without ASP.NET and this new very bad thing called Unicode,  I ignored  them.

So let's jump a few years into mobile development... Many new stuff...
Zero based Unicode Strings - no more Ansi- or Shortstrings, ARC, ARM, 64 Bit, Attributes, Generics, TPL and more...

After 6 years of development - using "new" language features - this features become so handy that I hate every hour of programming old apps with Delphi 2007.

Unbelievable, have you tried "cool stuff" without Generics, lately? Not using generics is like doing the same stuff over and over again. In the old day's we called it copy&paste (OK, Generics is doing copy&paste internally, but it feels better).
And what's about Unit-Test? Are you still using a Hello-World-One-Button-Apps with a Button labeled "Button1" on it to test new Source-Code?

Testdriven-Development - That is the right workflow to speed up development. Of course with Testinsight as you can read in my blogpost from April.

Do you want to see the power of Testdriven-Development - visit my Session at Forentage 2017.

Using new language features? All I can get...

Forentage 2017 - Meine Session.

Hallo zusammen! (English text below)

Ich habe gerade die Bestätigung für meine Session auf den Forentage 2017 erhalten.

Ich nenne sie:

MVVM-Lite oder wie man eine Trennung von Form (View) und Logik (ViewModel) mit ein paar Zeilen Code erreichen kann!

Eine Voraussetzung für die Testbarkeit von Programmen ist die Trennung von UI und Logik, diese Session zeigt, wie dies - ohne die Verwendung eines Framework - mit den einfachsten Möglichkeiten unter VCL & FMX erreichen kann.

Um eine schnellere Entwicklung zu erreichen, werde ich diese Session als Testdriven-Development zeigen.

Hello Everybody!

I just got the confirmation of my session on the Forentage 2017.

I call it:

MVVM-Lite or how to achieve a separation of form (View) and logic (ViewModel) with a few lines of code!

A prerequisite for the testability of programs is the separation of UI and logic, this session shows how to do this without using a framework - with the simplest possibilities under VCL & FMX.

To achieve a faster development, I will show this session as Testdriven-development.

Lesson is in German language. If I find the time I will do an english video later...

Tuesday, July 11, 2017

Are you using Attributes?

Why not?  Too complicate? Not needed?

Let's take a look at this little stupid class:

  [ Bar(42) ]
  [ FooBar('Test') ]
  TFoo = class
      [ FieldName('StringField') ]
      [ FieldLength(30) ]
      FField1 : String;
      [ FieldName('IntegerField') ]
      FField2 : Integer;

How can we get this Attribute-Values?

Over the RTTI of course...

What do you think about this approach:

  TRTTIHelper.OnClassHasAttributes( TFoo )
   {} .OnAttribute< BarAttribute >(
        procedure( Bar : BarAttribute )
            _Result1 := Bar.IntValue;
          end )
   {} .OnAttribute< FooBarAttribute >(
        procedure( FooBar : FooBarAttribute )
            _Result2 := FooBar.StrValue;
          end );

And the fields? Perhaps you prefer this:
 Procedure (Field : TRttiField; Attr : FieldNameAttribute)
     if Field.Name = 'FField2' then
       _Result2 := Attr.Value;

 Procedure (Field : TRttiField; Attr : FieldLengthAttribute)
     if Field.Name = 'FField1' then
       _Result1 := Attr.Value;

This Helper has many overloads like TProc<T1,T2,T3> from System.Sysutils,

Stay tuned for the next update of my FDK and just write:


Rule of Thumb: „Uses is faster than self-typing“!

Friday, June 23, 2017

Delphi hat einen Fehler...?

(Oder wie verbringe ich einen halben Tag mit Fehlannahmen...)

Klar, nicht nur einen, aber so ist das eben mit Software...

Da es keine fehlerfreie Software gibt, kann man diese Frage getrost mit ja beantworten. Aber wie suchen "wir" den Fehler?

Natürlich am besten mit Unit-Tests... Aber UI? OK...Ein anderes Thema


<F9> Testen -> Exception

Exception position ist nicht im eigenen Source, sondern tief in der RTL. Auch noch in einen Assembler-Teil.

OK - Kann nur die Liste nicht initialisiert sein...

Also Breakpoint setzen und nochmal...
<F9> Testen -> Debugger hält brav am Breakpoint an...

FListe in die Watchvariablen übernehmen... Nöö geht nicht... Und dann fängt es an falsch zu laufen...

1. Fehlannahme : OMG, Die IDE kann schon wieder eine Variable nicht anzeigen...

also fix ne lokale Variable "LListe" und mit der arbeiten...

<F9> Testen -> Debugger hält brav am Breakpoint an...
<F7>, <F7>,<F7> - Prima alles richtig... <F7> FListe := LListe;
Bang - Exception;

OK - Logger anwerfen... Geht ja dank FDK mit einer Zeile...

Das Log sieht gut aus... Oberflächlich betrachten... Alles wird schön erzeugt.... Alles Prima!

<F9> Testen -> Debugger hält brav am Breakpoint an...
<F7>, <F7>,<F7> - Prima alles richtig... <F7> FListe := LListe;
Bang - Exception;

2. Fehlannahme : Shit, ich Idiot, greife von einem Thread aus auf eine Liste in der Klasse zu...

FListe ist kein Object, aber

kein Thema Uses Delphiprofi.FDK.Classes;

Class -> Class(TClassWithSync) // Erzeugt eine FSync : TObject für einen TMonitor...

  FListe := LListe;

Jetzt aber....Breakpoint auf die Zuweisung...

<F9> Testen - Exception... What... Der ist gar nicht bis zum BreakPoint gekommen... Nochmal durch steppen...

<F9> Testen - <F7>, <F7>,<F7> - Prima alles richtig... <F7> TMonitor.Enter(FSync) - Bang...

Das gibt es doch gar nicht, ich bin doch lokal in der Klasse wieso kann er nicht auf FSync zugreifen...

3. Fehlannahme : Ich habe einen Fehler in 10.2 gefunden... Ich kann aus einem Thread nicht mehr auf private Felder eine einer Klasse zugreifen...(Kaum zu glauben, ist aber so {nicht})

Also das Ganze mit 10.1

<F9> usw... Bang... gleicher Fehler...

Das ist jetzt aber doof... Also schnell den Browser mit dem "System Dashboard" wieder zu machen...

OK.. Dann mal ohne Thread...

Ups... Jetzt geht es... Wieso das den?

Also wieder mit Thread - Am Thread kann es auf keinen Fall liegen, das mache ich immer so... erstmal ein Paar Logeinträge mehr erzeugen...

<F9> Log... Bla, Bla Bla... TMainViewModel.BeforeDestruction - WTF... Wer war das.... Ist doch kein Interface... Also kein Problem mit dem REFCount... Hätte ich doch besser mein MVVM-Framework genommen, aber nein für so einen kleine App...

Breakpoint setzen...
Wird von der MainView aufgerufen mit FreeAndNIL(FViewModel) aber wieso?

Wer lesen kann ist klar im Vorteil... Finde den Fehler...

procedure TFormMain.FormDeactivate(Sender: TObject);

Das kommt davon, wenn man auf die schnelle mit der IDE etwas zusammen klicken will... Einfach eine Zeile zu hoch im Objektinspektor....

procedure TFormMain.FormDestroy(Sender: TObject);

Wäre besser gewesen...

Ohne den gelernten Workflow -> Ich sehe meinen Fehler nicht - muss am Delphi liegen... Was leider hin und wieder mal vor kommt... Wäre das nicht passiert...

Logisch - und um es richtig zu stellen...
Natürlich geht es jetzt auch mit 10.2 und aus dem Thread...

Kaum macht man es richtig, schon funktioniert es...

Wednesday, June 14, 2017

Schulungs- & Consulting-Termine 2017

Die Nachfrage bezüglich Consulting vor Ort und andere "Programmierhilfen" steigt momentan fast Täglich - was mich sehr freut!

Hierbei geht es von kurzer Hilfe per Skype & TeamViewer bis zu mehrtägigen Schulungen oder Programmieraufträgen.

Vielleicht liegt es an der neue Delphi-Version oder an den kommenden Veränderungen. (iOS 11)

Ich würde daher im 3. oder 4. Quartal - bei einer entsprechenden Teilnehmeranzahl - jeweils eine mehrtägige Schulung anbieten.

Selbstverständlich - wie man es von Mir mittlerweile erwartet - dreht es sich hierbei um Firemonkey.

Aber was ist mit der VCL?

Sourcecode welcher "für" VCL geschrieben ist, wird in der Regel nicht Plattform unabhängig sein, Sourcecode der jedoch für "FMX" geschrieben ist, kann normalerweise ohne Veränderungen auch für VCL-Programme compiliert werden.

Daher braucht man bei non-UI Dingen eigentlich keinen Unterschied machen... Um soliden, testbaren Sourcecode zu schreiben braucht man eigentlich nur folgendes Handwerkszeug: Linken gegen Interfaces, untereinander nicht verlinkte Units und Unittest...


Die Themen sind die üblichen Verdächtigen:
- Designpattern
- Interfaces
- Unit-Test.
- Threading

Darüber hinaus wird immer wieder gefragt:
- Wie mache ich was?
- Mache ich das eigentlich richtig?
- Geht das nicht einfacher?
- MVVM oder Klick-aufs-Form

Frei nach dem Motto: "Usen ist schneller als coden" erhält jeder Teilnehmer mein FDK.

Termine und der Veranstaltungsort stehen noch nicht fest, aber bei Interesse bitte unbedingt vorab schon mal eine E-Mail an mich schreiben mit dem Betreff "Schulungstermine"

Monday, May 22, 2017

Hype Driven Development.

Wer kennt das nicht? Man(n) kommt von einer Tagung oder hat ein cooles YouTube Video gesehen. Dann passiert es - Das muss ich auch machen...
Gut oder schlecht... (Wenn man einige Blogs zu diesem Thema liest ist die Meinung: eher schlecht)
Klar kann man noch mit Delphi 7 mit dem Sprachumfang von UCSD-Pascal programmieren. Eigentlich spricht da nix gegen, oder?
Hey, die Programme laufen und machen das, was die Kunden wünschen - also alles bestens, oder? Viele betreiben so die eigene Firma und verdienen ihr Geld... Also kann es ja nicht schlecht sein!
Aber sollte man nicht hin und wieder über den Tellerrand schauen? Der Satz: "Wir haben das doch immer so gemacht.", wird oft benutzt.
Eigentlich sind doch Programme nie fertig. Es immer mal ein neues Feature eingefügt oder eine Funktionalität verbessert. I.d.R. alles single-Thread, Main-Thread...
Ist das Programm überhaupt noch wartbar? Sollte man mal das Layout überarbeiten, vielleicht das Menü auf Ribbon umstellen oder eine Datenbank verwenden? Die Geschwindigkeit mit Threads verbessern?
Vielleicht hilft ein Hype den Sprung zu schaffen... Klar gibt es dann immer eine Lernkurve, aber ist das den so tragisch? Den alten Kopf mal wieder auf "Klassenarbeit steht an", Niveau bringen... 
Oft habe ich bei Schulungen oder Tagungen diese Sätze gehört:
  • Interfaces - Ja hab ich schon mal gehört, nutzen wir aber nicht.
  • Threads - ja das macht bei uns der Peter, aber der ist seit 4 Wochen krank, wenn der wieder da ist, Frag ich Ihn mal.
  • Factory's - brauche ich nicht, es geht auch so.
  • Dependency Injection - Du immer mit Deinem neumodischen Zeug.
  • Unit Tests - Wollten wir auch mal machen, steht ganz oben auf meiner Liste, aber ich bin bisher nicht dazu gekommen mir das mal an zu sehen.
  • Generics - Hab ich schon mal gehört, das ist doch das Ding mit den spitzen Klammer, oder? Ich nehme für sowas immer einen Pointer.
  • Git/Mercurial - Ist mir zu kompliziert ich zippe meinen Source einfach zusammen.
  • MVVM - Brauch ich nicht, ich kopiere den Source von einem Form in das nächste. Ich will ja auch beim Debuggen sehen, was passiert wenn ich den Button-Klicke.
  • JSON - Hab ich noch nie gebraucht, was macht man damit?

Vielleicht wäre hier ein bisschen Hype-Driven-Development angesagt...

Aber warum das Ganze? Wofür soll ich getrennte testbare Units programmieren, wenn ich sowieso keine Unit-Test mache? Sicherlich kann man sich "zu Tode entkoppeln". Ab wann ist zuviel des Guten eigentlich zuviel?

Mit MVVM, Factories  und nur gegen Interfaces linken, kann schnell zu einer Sucht werden und die IDE findet bei einem Klick auf die Variable immer nur die Factory oder das Interface, leider NIE die gerade aktuelle Implementierung. Was macht ein Klick auf den Button? Das steht da leider nur dann richtig lesbar, wenn man seine Proceduren wirklich gut benennt. Aber auch dann muss man erstmal die entsprechende Unit (ViewModel) finden, die in dieser Implementierung für diese Plattform verwendet wird.
Eine Interfacevariable wir immer nur mit dem Typen und der Adresse angezeigt - ich sehe im Debugger nicht die Belegung. (Vielleicht mal einen Visualizer programmieren?)
Einfacher wird es nicht und wenn man(n) dann noch unstrukturiert auf neue Techniken  los geht - dann ist man(n) schnell in einer Falle die alles noch viel schlimmer macht, als es vorher schon war.

Wäre das der Moment auf meine Schulungs- und Consultingangebote hin zu weisen?

Also doch nicht jeden Hype mit machen, aber sich die "neuen" Techniken rauspicken, die eine bessere Source-Code-Übersicht, besseres Laufzeitverhalten oder höhere Kundenzufriedenheit ermöglichen!

Ich muss nicht jeden Hype mitmachen - nur die Guten...


Thursday, April 27, 2017

FDK - Early-Bird

Die Stunden für eine Early-Bird-Bestellung des FDK's sind angebrochen.

Wer also noch die 100,- € sparen möchte, sollte jetzt das Angebot noch nutzen.

Ab den 01.05.2017 gilt der volle Preis...



Die Betreiber dieser Seiten nehmen den Schutz Ihrer persönlichen Daten sehr ernst. Wir behandeln Ihre personenbezogenen Daten vertraulich und entsprechend der gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerklärung.
Die Nutzung unserer Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf unseren Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder E-Mail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Daten werden ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergegeben.
Wir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich.

Kommentarfunktion auf dieser Webseite

Wenn Sie uns per Kontaktformular Anfragen zukommen lassen, werden Ihre Angaben aus dem Anfrageformular inklusive der von Ihnen dort angegebenen Kontaktdaten zwecks Bearbeitung der Anfrage und für den Fall von Anschlussfragen bei uns gespeichert. Diese Daten geben wir nicht ohne Ihre Einwilligung weiter.


Diese Seite nutzt aus Gründen der Sicherheit und zum Schutz der Übertragung vertraulicher Inhalte, wie zum Beispiel der Anfragen, die Sie an uns als Seitenbetreiber senden, eine SSL-Verschlüsselung. Eine verschlüsselte Verbindung erkennen Sie daran, dass die Adresszeile des Browsers von "http://" auf "https://" wechselt und an dem Schloss-Symbol in Ihrer Browserzeile.
Wenn die SSL Verschlüsselung aktiviert ist, können die Daten, die Sie an uns übermitteln, nicht von Dritten mitgelesen werden.

Serverseitige Datenverarbeitung

Der Autor diese Blogs nutzt diese Webseite als Dienst von Aus diesem Grund hat der Autor keinen Einfluss auf die Datenverarbeitung / Löschung.


Weitere Informationen zum Datenschutz von Blogger:



Diese Datenschutzerklärung klärt Sie über die Art, den Umfang und Zweck der Verarbeitung von personenbezogenen Daten (nachfolgend kurz „Daten“) innerhalb unseres Onlineangebotes und der mit ihm verbundenen Webseiten, Funktionen und Inhalte sowie externen Onlinepräsenzen, wie z.B. unser Social Media Profile auf (nachfolgend gemeinsam bezeichnet als „Onlineangebot“). Im Hinblick auf die verwendeten Begrifflichkeiten, wie z.B. „Verarbeitung“ oder „Verantwortlicher“ verweisen wir auf die Definitionen im Art. 4 der Datenschutzgrundverordnung (DSGVO).


Frank Lauter
Hostetstr. 153
52223 Stolberg
weitere Information im Impressum

Arten der verarbeiteten Daten:

- Bestandsdaten (z.B., Namen, Adressen).
- Kontaktdaten (z.B., E-Mail, Telefonnummern).
- Inhaltsdaten (z.B., Texteingaben, Fotografien, Videos).
- Nutzungsdaten (z.B., besuchte Webseiten, Interesse an Inhalten, Zugriffszeiten).
- Meta-/Kommunikationsdaten (z.B., Geräte-Informationen, IP-Adressen).

Kategorien betroffener Personen

Besucher und Nutzer des Onlineangebotes (Nachfolgend bezeichnen wir die betroffenen Personen zusammenfassend auch als „Nutzer“).

Zweck der Verarbeitung

- Zurverfügungstellung des Onlineangebotes, seiner Funktionen und Inhalte.
- Beantwortung von Kontaktanfragen und Kommunikation mit Nutzern.
- Sicherheitsmaßnahmen.
- Reichweitenmessung/Marketing

Verwendete Begrifflichkeiten

„Personenbezogene Daten“ sind alle Informationen, die sich auf eine identifizierte oder identifizierbare natürliche Person (im Folgenden „betroffene Person“) beziehen; als identifizierbar wird eine natürliche Person angesehen, die direkt oder indirekt, insbesondere mittels Zuordnung zu einer Kennung wie einem Namen, zu einer Kennnummer, zu Standortdaten, zu einer Online-Kennung (z.B. Cookie) oder zu einem oder mehreren besonderen Merkmalen identifiziert werden kann, die Ausdruck der physischen, physiologischen, genetischen, psychischen, wirtschaftlichen, kulturellen oder sozialen Identität dieser natürlichen Person sind.

„Verarbeitung“ ist jeder mit oder ohne Hilfe automatisierter Verfahren ausgeführte Vorgang oder jede solche Vorgangsreihe im Zusammenhang mit personenbezogenen Daten. Der Begriff reicht weit und umfasst praktisch jeden Umgang mit Daten.

„Pseudonymisierung“ die Verarbeitung personenbezogener Daten in einer Weise, dass die personenbezogenen Daten ohne Hinzuziehung zusätzlicher Informationen nicht mehr einer spezifischen betroffenen Person zugeordnet werden können, sofern diese zusätzlichen Informationen gesondert aufbewahrt werden und technischen und organisatorischen Maßnahmen unterliegen, die gewährleisten, dass die personenbezogenen Daten nicht einer identifizierten oder identifizierbaren natürlichen Person zugewiesen werden.

„Profiling“ jede Art der automatisierten Verarbeitung personenbezogener Daten, die darin besteht, dass diese personenbezogenen Daten verwendet werden, um bestimmte persönliche Aspekte, die sich auf eine natürliche Person beziehen, zu bewerten, insbesondere um Aspekte bezüglich Arbeitsleistung, wirtschaftliche Lage, Gesundheit, persönliche Vorlieben, Interessen, Zuverlässigkeit, Verhalten, Aufenthaltsort oder Ortswechsel dieser natürlichen Person zu analysieren oder vorherzusagen.

Als „Verantwortlicher“ wird die natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die allein oder gemeinsam mit anderen über die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten entscheidet, bezeichnet.

„Auftragsverarbeiter“ eine natürliche oder juristische Person, Behörde, Einrichtung oder andere Stelle, die personenbezogene Daten im Auftrag des Verantwortlichen verarbeitet.

Maßgebliche Rechtsgrundlagen

Nach Maßgabe des Art. 13 DSGVO teilen wir Ihnen die Rechtsgrundlagen unserer Datenverarbeitungen mit. Sofern die Rechtsgrundlage in der Datenschutzerklärung nicht genannt wird, gilt Folgendes: Die Rechtsgrundlage für die Einholung von Einwilligungen ist Art. 6 Abs. 1 lit. a und Art. 7 DSGVO, die Rechtsgrundlage für die Verarbeitung zur Erfüllung unserer Leistungen und Durchführung vertraglicher Maßnahmen sowie Beantwortung von Anfragen ist Art. 6 Abs. 1 lit. b DSGVO, die Rechtsgrundlage für die Verarbeitung zur Erfüllung unserer rechtlichen Verpflichtungen ist Art. 6 Abs. 1 lit. c DSGVO, und die Rechtsgrundlage für die Verarbeitung zur Wahrung unserer berechtigten Interessen ist Art. 6 Abs. 1 lit. f DSGVO. Für den Fall, dass lebenswichtige Interessen der betroffenen Person oder einer anderen natürlichen Person eine Verarbeitung personenbezogener Daten erforderlich machen, dient Art. 6 Abs. 1 lit. d DSGVO als Rechtsgrundlage.


Wir treffen nach Maßgabe des Art. 32 DSGVO unter Berücksichtigung des Stands der Technik, der Implementierungskosten und der Art, des Umfangs, der Umstände und der Zwecke der Verarbeitung sowie der unterschiedlichen Eintrittswahrscheinlichkeit und Schwere des Risikos für die Rechte und Freiheiten natürlicher Personen, geeignete technische und organisatorische Maßnahmen, um ein dem Risiko angemessenes Schutzniveau zu gewährleisten.

Zu den Maßnahmen gehören insbesondere die Sicherung der Vertraulichkeit, Integrität und Verfügbarkeit von Daten durch Kontrolle des physischen Zugangs zu den Daten, als auch des sie betreffenden Zugriffs, der Eingabe, Weitergabe, der Sicherung der Verfügbarkeit und ihrer Trennung. Des Weiteren haben wir Verfahren eingerichtet, die eine Wahrnehmung von Betroffenenrechten, Löschung von Daten und Reaktion auf Gefährdung der Daten gewährleisten. Ferner berücksichtigen wir den Schutz personenbezogener Daten bereits bei der Entwicklung, bzw. Auswahl von Hardware, Software sowie Verfahren, entsprechend dem Prinzip des Datenschutzes durch Technikgestaltung und durch datenschutzfreundliche Voreinstellungen (Art. 25 DSGVO).

Zusammenarbeit mit Auftragsverarbeitern und Dritten

Sofern wir im Rahmen unserer Verarbeitung Daten gegenüber anderen Personen und Unternehmen (Auftragsverarbeitern oder Dritten) offenbaren, sie an diese übermitteln oder ihnen sonst Zugriff auf die Daten gewähren, erfolgt dies nur auf Grundlage einer gesetzlichen Erlaubnis (z.B. wenn eine Übermittlung der Daten an Dritte, wie an Zahlungsdienstleister, gem. Art. 6 Abs. 1 lit. b DSGVO zur Vertragserfüllung erforderlich ist), Sie eingewilligt haben, eine rechtliche Verpflichtung dies vorsieht oder auf Grundlage unserer berechtigten Interessen (z.B. beim Einsatz von Beauftragten, Webhostern, etc.).

Sofern wir Dritte mit der Verarbeitung von Daten auf Grundlage eines sog. „Auftragsverarbeitungsvertrages“ beauftragen, geschieht dies auf Grundlage des Art. 28 DSGVO.

Übermittlungen in Drittländer

Sofern wir Daten in einem Drittland (d.h. außerhalb der Europäischen Union (EU) oder des Europäischen Wirtschaftsraums (EWR)) verarbeiten oder dies im Rahmen der Inanspruchnahme von Diensten Dritter oder Offenlegung, bzw. Übermittlung von Daten an Dritte geschieht, erfolgt dies nur, wenn es zur Erfüllung unserer (vor)vertraglichen Pflichten, auf Grundlage Ihrer Einwilligung, aufgrund einer rechtlichen Verpflichtung oder auf Grundlage unserer berechtigten Interessen geschieht. Vorbehaltlich gesetzlicher oder vertraglicher Erlaubnisse, verarbeiten oder lassen wir die Daten in einem Drittland nur beim Vorliegen der besonderen Voraussetzungen der Art. 44 ff. DSGVO verarbeiten. D.h. die Verarbeitung erfolgt z.B. auf Grundlage besonderer Garantien, wie der offiziell anerkannten Feststellung eines der EU entsprechenden Datenschutzniveaus (z.B. für die USA durch das „Privacy Shield“) oder Beachtung offiziell anerkannter spezieller vertraglicher Verpflichtungen (so genannte „Standardvertragsklauseln“).

Rechte der betroffenen Personen

Sie haben das Recht, eine Bestätigung darüber zu verlangen, ob betreffende Daten verarbeitet werden und auf Auskunft über diese Daten sowie auf weitere Informationen und Kopie der Daten entsprechend Art. 15 DSGVO.

Sie haben entsprechend. Art. 16 DSGVO das Recht, die Vervollständigung der Sie betreffenden Daten oder die Berichtigung der Sie betreffenden unrichtigen Daten zu verlangen.

Sie haben nach Maßgabe des Art. 17 DSGVO das Recht zu verlangen, dass betreffende Daten unverzüglich gelöscht werden, bzw. alternativ nach Maßgabe des Art. 18 DSGVO eine Einschränkung der Verarbeitung der Daten zu verlangen.

Sie haben das Recht zu verlangen, dass die Sie betreffenden Daten, die Sie uns bereitgestellt haben nach Maßgabe des Art. 20 DSGVO zu erhalten und deren Übermittlung an andere Verantwortliche zu fordern.

Sie haben ferner gem. Art. 77 DSGVO das Recht, eine Beschwerde bei der zuständigen Aufsichtsbehörde einzureichen.


Sie haben das Recht, erteilte Einwilligungen gem. Art. 7 Abs. 3 DSGVO mit Wirkung für die Zukunft zu widerrufen


Sie können der künftigen Verarbeitung der Sie betreffenden Daten nach Maßgabe des Art. 21 DSGVO jederzeit widersprechen. Der Widerspruch kann insbesondere gegen die Verarbeitung für Zwecke der Direktwerbung erfolgen.

Cookies und Widerspruchsrecht bei Direktwerbung

Als „Cookies“ werden kleine Dateien bezeichnet, die auf Rechnern der Nutzer gespeichert werden. Innerhalb der Cookies können unterschiedliche Angaben gespeichert werden. Ein Cookie dient primär dazu, die Angaben zu einem Nutzer (bzw. dem Gerät auf dem das Cookie gespeichert ist) während oder auch nach seinem Besuch innerhalb eines Onlineangebotes zu speichern. Als temporäre Cookies, bzw. „Session-Cookies“ oder „transiente Cookies“, werden Cookies bezeichnet, die gelöscht werden, nachdem ein Nutzer ein Onlineangebot verlässt und seinen Browser schließt. In einem solchen Cookie kann z.B. der Inhalt eines Warenkorbs in einem Onlineshop oder ein Login-Status gespeichert werden. Als „permanent“ oder „persistent“ werden Cookies bezeichnet, die auch nach dem Schließen des Browsers gespeichert bleiben. So kann z.B. der Login-Status gespeichert werden, wenn die Nutzer diese nach mehreren Tagen aufsuchen. Ebenso können in einem solchen Cookie die Interessen der Nutzer gespeichert werden, die für Reichweitenmessung oder Marketingzwecke verwendet werden. Als „Third-Party-Cookie“ werden Cookies bezeichnet, die von anderen Anbietern als dem Verantwortlichen, der das Onlineangebot betreibt, angeboten werden (andernfalls, wenn es nur dessen Cookies sind spricht man von „First-Party Cookies“).

Wir können temporäre und permanente Cookies einsetzen und klären hierüber im Rahmen unserer Datenschutzerklärung auf.

Falls die Nutzer nicht möchten, dass Cookies auf ihrem Rechner gespeichert werden, werden sie gebeten die entsprechende Option in den Systemeinstellungen ihres Browsers zu deaktivieren. Gespeicherte Cookies können in den Systemeinstellungen des Browsers gelöscht werden. Der Ausschluss von Cookies kann zu Funktionseinschränkungen dieses Onlineangebotes führen.

Ein genereller Widerspruch gegen den Einsatz der zu Zwecken des Onlinemarketing eingesetzten Cookies kann bei einer Vielzahl der Dienste, vor allem im Fall des Trackings, über die US-amerikanische Seite oder die EU-Seite erklärt werden. Des Weiteren kann die Speicherung von Cookies mittels deren Abschaltung in den Einstellungen des Browsers erreicht werden. Bitte beachten Sie, dass dann gegebenenfalls nicht alle Funktionen dieses Onlineangebotes genutzt werden können.

Löschung von Daten

Die von uns verarbeiteten Daten werden nach Maßgabe der Art. 17 und 18 DSGVO gelöscht oder in ihrer Verarbeitung eingeschränkt. Sofern nicht im Rahmen dieser Datenschutzerklärung ausdrücklich angegeben, werden die bei uns gespeicherten Daten gelöscht, sobald sie für ihre Zweckbestimmung nicht mehr erforderlich sind und der Löschung keine gesetzlichen Aufbewahrungspflichten entgegenstehen. Sofern die Daten nicht gelöscht werden, weil sie für andere und gesetzlich zulässige Zwecke erforderlich sind, wird deren Verarbeitung eingeschränkt. D.h. die Daten werden gesperrt und nicht für andere Zwecke verarbeitet. Das gilt z.B. für Daten, die aus handels- oder steuerrechtlichen Gründen aufbewahrt werden müssen.

Nach gesetzlichen Vorgaben in Deutschland, erfolgt die Aufbewahrung insbesondere für 10 Jahre gemäß §§ 147 Abs. 1 AO, 257 Abs. 1 Nr. 1 und 4, Abs. 4 HGB (Bücher, Aufzeichnungen, Lageberichte, Buchungsbelege, Handelsbücher, für Besteuerung relevanter Unterlagen, etc.) und 6 Jahre gemäß § 257 Abs. 1 Nr. 2 und 3, Abs. 4 HGB (Handelsbriefe).

Nach gesetzlichen Vorgaben in Österreich erfolgt die Aufbewahrung insbesondere für 7 J gemäß § 132 Abs. 1 BAO (Buchhaltungsunterlagen, Belege/Rechnungen, Konten, Belege, Geschäftspapiere, Aufstellung der Einnahmen und Ausgaben, etc.), für 22 Jahre im Zusammenhang mit Grundstücken und für 10 Jahre bei Unterlagen im Zusammenhang mit elektronisch erbrachten Leistungen, Telekommunikations-, Rundfunk- und Fernsehleistungen, die an Nichtunternehmer in EU-Mitgliedstaaten erbracht werden und für die der Mini-One-Stop-Shop (MOSS) in Anspruch genommen wird.

Kommentare und Beiträge

Wenn Nutzer Kommentare oder sonstige Beiträge hinterlassen, können ihre IP-Adressen auf Grundlage unserer berechtigten Interessen im Sinne des Art. 6 Abs. 1 lit. f. DSGVO für 7 Tage gespeichert werden. Das erfolgt zu unserer Sicherheit, falls jemand in Kommentaren und Beiträgen widerrechtliche Inhalte hinterlässt (Beleidigungen, verbotene politische Propaganda, etc.). In diesem Fall können wir selbst für den Kommentar oder Beitrag belangt werden und sind daher an der Identität des Verfassers interessiert.

Des Weiteren behalten wir uns vor, auf Grundlage unserer berechtigten Interessen gem. Art. 6 Abs. 1 lit. f. DSGVO, die Angaben der Nutzer zwecks Spamerkennung zu verarbeiten.

Auf derselben Rechtsgrundlage behalten wir uns vor, im Fall von Umfragen die IP-Adressen der Nutzer für deren Dauer zu speichern und Cookies zu verwenden, um Mehrfachabstimmungen zu vermeiden.

Die im Rahmen der Kommentare und Beiträge angegebenen Daten, werden von uns bis zum Widerspruch der Nutzer dauerhaft gespeichert.


Die Nachfolgekommentare können durch Nutzer mit deren Einwilligung gem. Art. 6 Abs. 1 lit. a DSGVO abonniert werden. Die Nutzer erhalten eine Bestätigungsemail, um zu überprüfen, ob sie der Inhaber der eingegebenen Emailadresse sind. Nutzer können laufende Kommentarabonnements jederzeit abbestellen. Die Bestätigungsemail wird Hinweise zu den Widerrufsmöglichkeiten enthalten. Für die Zwecke des Nachweises der Einwilligung der Nutzer, speichern wir den Anmeldezeitpunkt nebst der IP-Adresse der Nutzer und löschen diese Informationen, wenn Nutzer sich von dem Abonnement abmelden.

Sie können den Empfang unseres Abonnements jederzeit kündigen, d.h. Ihre Einwilligungen widerrufen. Wir können die ausgetragenen E-Mailadressen bis zu drei Jahren auf Grundlage unserer berechtigten Interessen speichern bevor wir sie löschen, um eine ehemals gegebene Einwilligung nachweisen zu können. Die Verarbeitung dieser Daten wird auf den Zweck einer möglichen Abwehr von Ansprüchen beschränkt. Ein individueller Löschungsantrag ist jederzeit möglich, sofern zugleich das ehemalige Bestehen einer Einwilligung bestätigt wird.

Erstellt mit von RA Dr. Thomas Schwenke


Angaben gemäß § 5 TMG:

Frank Lauter
Hostetstr. 153
52223 Stolberg (Rhld.)


Telefon: 02402 / 90 55 264
Telefax: 02402 / 90 55 265

Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV:

Frank Lauter
Hostetstr. 153
52223 Stolberg (Rhld.)


Weitere Informationen zum Impressum von Blogger :

Haftungsausschluss (Disclaimer)

Haftung für Inhalte

Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen.
Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.

Haftung für Links

Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar.
Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.


Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet.
Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.



Die Betreiber dieser Seiten nehmen den Schutz Ihrer persönlichen Daten sehr ernst. Wir behandeln Ihre personenbezogenen Daten vertraulich und entsprechend der gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerklärung.
Die Nutzung unserer Webseite ist in der Regel ohne Angabe personenbezogener Daten möglich. Soweit auf unseren Seiten personenbezogene Daten (beispielsweise Name, Anschrift oder E-Mail-Adressen) erhoben werden, erfolgt dies, soweit möglich, stets auf freiwilliger Basis. Diese Daten werden ohne Ihre ausdrückliche Zustimmung nicht an Dritte weitergegeben.
Wir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich.

Kommentarfunktion auf dieser Webseite

Wenn Sie uns per Kontaktformular Anfragen zukommen lassen, werden Ihre Angaben aus dem Anfrageformular inklusive der von Ihnen dort angegebenen Kontaktdaten zwecks Bearbeitung der Anfrage und für den Fall von Anschlussfragen bei uns gespeichert. Diese Daten geben wir nicht ohne Ihre Einwilligung weiter.


Diese Seite nutzt aus Gründen der Sicherheit und zum Schutz der Übertragung vertraulicher Inhalte, wie zum Beispiel der Anfragen, die Sie an uns als Seitenbetreiber senden, eine SSL-Verschlüsselung. Eine verschlüsselte Verbindung erkennen Sie daran, dass die Adresszeile des Browsers von "http://" auf "https://" wechselt und an dem Schloss-Symbol in Ihrer Browserzeile.
Wenn die SSL Verschlüsselung aktiviert ist, können die Daten, die Sie an uns übermitteln, nicht von Dritten mitgelesen werden.

Plattform der EU-Kommission zur Online-Streitbeilegung:

Tuesday, April 25, 2017

Unittest with Testinsight.

TestInsight is a unit testing IDE Plugin for Delphi from Stefan Glienke - but I think you already knew that! @Stefan:Usefull Tool!

I've used Unit-Test (the GUI-Version) for a long time, because I like to have the GUI. The console-output is of course better if you are using a batch to compile and test your application.

For my Firemonkey Development Kit, I tried DUnitX the first time, but - to be honest - Oliver has done this step. The missing GUI was always my breakpoint. :-)

One of my rules is: If I start a new Application, I try to use at least one new technique or one of the 4-Letter-Things (CRUD,REST,JSON,MVVM).  But this list was empty (for the moment). So DUnitX came back in view...

I heard about TestInsight ist the past, but never gave it a try. For my knowledge it was "only" an other GUI for the Testframework - so no need to take a look.

But one feature <F2> is the best I've seen for many years to speed up development.

Testdriven development is - not so common, I've learned on many events, talking to other developers - but I like this kind of development, especially when implementing new businesslogics.

The Feature is - Run Test on save.

Take your Projekt, add a Testprojekt to the Group, mark it as TestInsight and go on with your development. If you are ready with the Interface - we all code against Interfaces - implement all tests you what to cover. Then back to your main Application. On every Save - all tests run in background.

E.g.: Array[Index] is higher then High(Array) the Test will find it after the next save... No breaks in the development flow. Go and write Array[Index-1] - save - Success...

Next Step - run DUnitX on Android and iOS.. Should work anyway - Not tested yet.

Wednesday, April 19, 2017

Neue Monitore: VMWare Flicker

Neue Monitore...

Gut, mein Rechner kann gar nicht schnell genug sein... Übertaktung, Wasserkühlung, SSD RAID 10, Cache-Controler für die SSD usw.

Bei den Monitoren (3 Stk.) war ich jedoch noch auf 1920x1600. Hat mir eigentlich immer gereicht... Wenn da nicht die neue NVIDIA 1080ti gewesen wäre...

OK - Wie immer wenn man Hardware tauscht : A passt nicht zu B. Da meine alten Bildschirme noch DVI hatten aber keinen Eingang für DP, mussten also auch noch 3 neue TFT's her.

Jetzt "natürlich mit" 2560x1440 - UHD wollte ich dann doch nicht... NVidia G-Sync natürlich und/bzw. 144Hz..

Logisch das ich dann auch eine neue Umschaltbox für den Mac brauchte und einen entsprechenden Adapter... Also noch mal 100€ on top.

Die Freude war nur von kurzer Dauer...

Nativ war alles schick und die 1080ti läuft super... Aber unter VMWare - nur noch geflackert... Vom Browser, beim scrollen, wenn sich ein Fenster öffnet.. Nicht aus zu halten...

Antwort von VMWare : Ich habe keinen Support (mehr) - nur noch für die Apple Version. (Obwohl ich natürlich die immer die neuste Version kaufe). Aber ich sollte mal die 3D-Acceleration abschalten...

Damit könnte ich zur Not noch leben, Flackern ist weg... Aber mein Tan-Generator mit Flacker-Tan funktioniert nicht mehr...

Nach ein paar Tests hat sich gezeigt, es war die Einstellung des Speichers, der reserviert werden darf auf dem Host... Ein Setting von 2GB - und alles läuft.

Jetzt muss ich nur noch raus finden, wie ich Windows davon abhalte, wenn ich einen Monitor auf den Mac-Mini schalte, die Monitor Anzahl und die Position jedes mal an zu passen. PnP abschalten oder was auch immer... Sonst wird das debuggen im IPhone Simulator zum Nervenkrieg...

Ich werde berichten...

Sunday, April 9, 2017

Windows 10 Update und Delphi 2007


Nach dem Update auf die neue Windows 10 Version - nicht vergessen aus


Die Dateien Borland.*.Targets nach


zu kopieren...

Tuesday, April 4, 2017

ORM oder doch lieber eine Schichttrennung?


Mit der ersten Windows-Delphi Version fingen alle an "RAD" zu programmieren...

Formular -> Möglichst viele Komponenten visuell oder auch nicht aufs Form klicken und dann immer an den "richtigen" Stellen einen Doppelklick und den Code rein... GGf. noch im OI Verbindungen von Komponente A nach Komponente B herstellen.

<F9> - No errors - ship it...

Plötzlich kommen "die Leute" mit so neumodischem Zeug wie Unittest's oder MVVM...

Also alles wieder aufdröseln und doch trennen...

Nachdem man das alles umgesetzt hat steuern "die Anderen" wieder dagegen und "erfinden" Visual-Live-Bindings also nix im Code, sondern wieder im Formular... OK - muss man ja nicht machen...

Eigentlich ist man mit sich und seinem Source-Code im Reinen.

Da ist die View, eine andere Unit ist das ViewModel, eine dritte Unit hält das DatenModel und die Datenzugriffskomponente, aber ggf. ist das auch eine weitere Unit... Vielleicht hat man für den Datenzugriff auch ein Interface genommen um überhaupt nicht gegen eine physikalische Datenbank zu linken. Good Job! Im Kreis stellen und auf die Schulter klopfen.
Jetzt kommt die erste Änderung.
Die Änderung passiert als ersten auf der Datenbankebene. Warum? Eine andere Software braucht noch ein Feld... OK... Meine Software muss das ja nicht unterstützen, oder doch? Naja, zu mindestens sollten meine Zugriffe das Feld nicht ändern oder löschen und ggf. bei einem neuen Datensatz initialisieren. Fein - meiner REST-Schnittstelle ist das egal... Darum soll sich der Server kümmern. Aber im Netz muss ich schnell meine Tabellen-Definition anpassen. Fertig... Der Rest meiner Software ist unberührt. Zum Glück muss ich nicht in 30 Formularen etwas anklicken, den die Formulare sind doof und wissen sowie so nix da von. (Gut das man beim erstellen der App's für iOS, Android und Windows daran gedacht hat, und sowie so alles per CRUD/REST/JSON implementiert hat).
Anpassung: Eine Unit-Datenbankdefinition und in der INSERT INTO noch das Feld initialisieren. (Wenn überhaupt nötig)
Bleiben wir mal bei der Datenbank definition (Um zurück zum Titel zu kommen).
Sollte die Datenschicht - also die Unit die einen Datensatz im Speicher hält auch verantwortlich sein für den Zugriff auf die Datenbank?
Momentan mache ich es so...:
Unit "Person.Model.pas" hat den Person-Record (also eigentlich eine Factory die ein Interface auf eine Class zurück gibt, die die Daten hält.)
Dann gibt es die Datenbank.Define.pas hier stehen die Definitionen aller Datenbanken/Tabellen, die ich in der App verwenden. Will ich die Datenbank ändern gibt es eine Unit und für die eigentlichen Daten, jeweils eine...
Jetzt kommen die Leute auf die Bühne die Attribute lieben und sagen: Warum soll ich das trennen, ich kann doch per Attribut in meinem DatenModel direkt angeben wie die Daten gespeichert werden sollen.. Also eigentlich genau wie bei REST/JSON hier kann ich ja z.B. wie in SuperObjects oder bei DUnitX direkt "alles" angeben...
Klar, hier gibt es schon fertige Packages die sowas können... Also das RAD neu erfinden?
Ich habe zu ORM noch eine geteilte Meinung. Deswegen habe ich auf dem letzten Delphi-Meetup die gleiche Frage gestellt... Und 10 verschiede Meinungen gehört... (Ich möchte sagen alle genannten Argument hatten ihre Berechtigung)
Vielleicht bilde ich mir eine Meinung, wenn ich "sowas" selber mal implementiere... Schließlich habe ich ja auch meine eigene JSON, REST Komponente, meinen eigenen XML Reader/Writer meine eigene Tethering Komponente geschrieben.
Also - kommt auf die Liste:
#Todo, #FDK, #ORM
Ich baue mal meinen Fluidcreator für Datenbankdefinitionen um... Mal sehen wie sich das im Source anfühlt...

Friday, March 31, 2017

FMX & Styles

FMX und Styles

OK, ein Stylebook auf ein Formular zu klicken ist ja nun kein Problem und dann?

Es gibt Leute, die haben sich extra ein Android-Handy gekauft, weil Ihnen das iOS zu "bund" oder was auch immer war... (oder auch anders herum).

Jetzt nimmt man einen Style - und alles sieht anders aus. Verärgert man damit seine Nutzer?

Für einen CI-Style sprechen sicherlich genau so viele Argumente, wie für einen nativen Plattform-Style.

Aber ist es den so einfach einen Style für alle Plattformen zu verwenden? Eigentlich schon...
Wäre da nicht das Problem, dass die mitgelieferten Styles - Handmade - sind. Daher sind die Grafiken leider nicht deckungsgleich. Bedeutet?

Alle Angaben der Regionen aus dehnen die einzelnen Style-Elemente herausgenommen werden sind unterschiedlich. Also muss man die für alle Plattformen anpassen?

Ich muss zugeben ich habe noch nicht alle Einzelheiten aller Plattformen verglichen - weil es hier pro Plattform noch Besonderheiten gibt... Als der Teil ist noch WIP.

Aber mein Ansatz war folgender:

Ich erzeuge über den Bitmap Style-Designer alle Default-Styles und speichere mir die Bezeichnungen:

AndroidL Light
Windows 10 Modern

Dann nehme ich den Windows 10 Modern Default Style als Basis. Alle Plattformen nähern sich sowieso diesem Style... ;-)

Dann noch Icon suchen/erzeugen/von freien Quellen laden... Leider gibt es keine Size/Position-Hilfe im Styledesigner. Außerdem wollte ich auf keinen Fall die Icons in 4 Auflösungen per Hand zusammenklöppeln... Hierfür also schnell ein kleines Programm geschrieben, dass die Icons in immer gleichbleibender Reihenfolge laden und in die PNG's speichern kann. Und die Auflösung 1.0 noch mit einem Grid versehen. So fällt das "rechteckziehen" leichter.

Dann noch das SpeedButton-Style-Object im Style oft genug kopieren und alles zuweisen...

Und schon hat man seinen Style - der auf allen Plattformen funktioniert.
Die richtigen Größen der Elemente erzeugt mein FDK, hierum brauchte ich mich also nicht kümmern. Fertig sieht es dann so aus...

Es gibt im FDK noch eine Funktion die aus jeder Grafik, einen klickbaren Button mit Schatten und Pushdown-Animation machen kann. Somit hat man die Option entweder den Button nativ zu verwenden (Toolbar, oben) oder als Klickdown-Button (Leiste unten) besonders klasse finde ich den Effekt bei transparenten PNG's.

Die fertige App sieht das auf allen Plattformen so aus: Ok, die Schatten sind ein Style-Bruch und werden in der Store-Version wahrscheinlich noch rausfliegen.
So einfach kann es gehen - und ich habe hierfür nur eine Woche gebraucht. ;-)
Warum eine Woche? Bis alles so gepasst hat wie ich es mir vorstelle und das ganze zusammenklicken mit der Maus im Bitmap-Style-Designer war halt einfach viel Arbeit. Nochmal mache ich das so nicht. Nächster Schritt ist ein Style-Creator der diese unnötigen arbeiten automatisch macht... (Ich habe mich ja auf Button beschränkt) Hätte ich die anderen Elemente auch noch erzeugen/ändern müssen wäre es wahrscheinlich ein Monat geworden. Das FMX-Style-Format ist ja so ähnlich wie DFM/FMX/TXT aber ich hatte einfach noch keine Zeit hierfür eine Routine zu schreiben... Ich hoffe noch an den Source für den Bitmap-Style-Designer zu kommen und einfach diese Software zu erweitern... Anfrage läuft. 
Wie gesagt WIP...

Sunday, March 5, 2017

In das MVP Programm aufgenommen...

In das MVP Programm aufgenommen...

Meine Bemühungen Delphi und Firemonkey weiter zu bringen sind wohl nicht unbemerkt geblieben,
daher freue ich mich, dass ich heute als

aufgenommen wurde.
The MVP-Directory is updated (05.04.17)


Monday, February 27, 2017

Vortrag zu FMX in Holland

Ich freue mich auf den Event in Holland zu dem mich Bob Swart eingeladen hat.

Hier bietet sich nicht nur die Gelegenheit wieder mal einen FMX Vortrag zu halten, sondern auch mein FDK vorzustellen.

Es ist schön zu sehen, dass meine Aktivitäten über die Grenzen hinaus Anklang finden...

Friday, February 17, 2017

Для моих русских читателей.

Привет мои русские друзья!

Моя статистика говорит, что многие из русскоязычных стран посещают мой блог меня. Может быть, я хочу контакт, который говорит на немецком или английском и помочь мне с переводом моих текстов.



Erste Schritte in den Internationalen Markt!

Erste Schritte in den internationalen Markt!

OK, klar man programmiert seit 35 Jahren - nur für den deutschen Markt... Also hat man sich auch nie darüber Gedanken machen müssen was es den da sonst noch so gibt...

1. Entscheidung

Mal alles auf Englisch machen. OK Schulenglisch ist vorhanden sollte erst mal mit den Kenntnissen aus der Programmierung ausreichen. Vielleicht nicht, aber man wird sehen...

Documentation und online Hilfe erledigt.

2. Entscheidung

Fehlermeldungen sollten für den User anpassbar sein. Auch kein Thema. Alle Texte einmal in diverse Sprachen übersetzen, die Routine die die Fehlertexte aufbereitet angepasst. Kleines Tool für das erzeugen der Übersetzungen und packen als Resource. Kein Problem. Jeder kann noch eine Textdatei in den Programm Pfad legen "de-de.txt" oder so... Und schon geht auch das. Das gilt auch für Sprachen die man nicht kann. Google Translate liefert vielleicht kein optimales Ergebnis aber man wird es verstehen... Nativ-Speaker können das ja noch anpassen und die bessere Übersetzung hier einreichen... (Klar, mit dem richtigen Budget könnte man das professioneller machen).

3. Entscheidung

Die Software soll sich an das Länder-ID des Windows-Systems anpassen. Auch kein Thema... Normalerweise wäre das richtig... Oder?
Leider kann man das nicht pauschal sagen... Besonders nicht, wenn die Software mit einem deutschen Server kommuniziert. Der könnte es zwar auch anders, aber liefert erstmal ein Datum in "seinem" Format... "dd.nn.yyyy hh:mm:ss".
Wenn die "schlaue" Software aber ein TDateTime.TryParse ohne eine Länderkennung macht... Nimmt diese Funktion das Format gemäß Ländereinstellung... Und das ist bei einem us-Windows leider anders...

Klar könnte der Server das Datum "direkt" richtig liefern, wenn er die Länderkennung des Zielsystems auswerten würde... Aber das hat "Man(n)" ja noch nie gebraucht...

Wednesday, February 1, 2017



Die Auslieferung des FDK hat begonnen.

Es hat ein bisschen länger gedauert als erwartet, aber das soll die Freude nicht schmälern.

Die gute Nachricht lautet : Bis zum 30.04.2017 gilt noch der Early-Bird-Preis von 299,- €

Momentan gibt es "nur" die Voll-Version in der Source-Code Distribution. Für andere Versionen hat sich bisher keiner Interessiert, daher erstmal nur diese.

Eine Demo-Version ist auch Planung, aber das kann noch ein bisschen dauern, daher habe ich den Early-Bird Zeitraum nochmal verlängert.

Mein eigener Installer löst direkt mehrere Aufgaben.
  • Die Installation / De-Installation
  • Pflege- und Änderbarkeit der Kundendaten (Adresse, Telefon usw.)
  • Online-Shop - Inkl. Rechnungslegung
  • Neukunden-Registrierung

Das Setup Programm steht ab SOFORT zum download bereit unter:

Alle die bereits eine FDK-Early-Bird-Version bestellt haben, sollten bereits im E-MAIL-Postfach eine entsprechende Nachricht mit den Zugangsdaten finden.
Das gilt auch für die Entwickler, die auf den Delphitagen 2016 eine Version gewonnen haben. Leider fehlt mir von einem noch die EMAIL, also bitte melden! 

Das FDK ist für Delphi 10.1 (2) entwickelt - läuft aber auch mit XE 10 Seattle und mit kleinen Einschränkungen auch auf  XE 8. XE 7 & 6 habe ich nicht mehr getestet.
Das Setup läuft auf Windows Vista, 7, 8 und 10.
Also viel Spass
und Happy Coding...
PS: Momentan ist die Bezahlung immer per Vorkasse andere Bezahlsysteme wie amazon-Pay oder Paypal sind in Vorbereitung.
Eine Kurzanleitung (PDF) für den Einstieg ist in deutscher Sprache enthalten. Alle Code-Insight Dokumentationen sind in englischer Sprache - das gilt auch für den Installer.
Auch wenn dieses Developer Kit für FMX entwickelt wurde, sind 90% der Units auch für das VCL-Framework zu gebrauchen.
Die Auslieferung der Version 1.0 umfasst neben den Demos, Sourcecode Formatter, LiveTemplates, Resourcebasierte Exception-Texte in English, Deutsch (Spanisch, Russisch, Französisch und Niederländisch nur per Google-Übersetzer), folgende Units im Source:
Es folgen noch weitere Dateien...