Skip to content

Archiv fuer das Jahr 2013

30
Dez

C++ Builder + iOS: Versenden von E-Mails

Vielleicht geht es einigen anderen genauso wie mir. Nun kann man endlich mit dem C++ Builder für iOS Programmieren, was richtig cool ist. Manche Sachen sind in den Beispielen schon ganz gut erklärt. Andere wieder nicht. Diese muss man sich dann selbst zusammensuchen. So z. B. beim versenden von E-Mails. Darum möchte ich mein Wissen auch gerne mit euch Teilen.

Dazu erstellen wir im C++ Builder als erstes eine neue Mobile Firemonkey-Anwendung.

Ich arbeite für dieses Beispiel nur mit dem vorerstellten Dialog. Als erstes müssen wir in die Headerdatei folgende Includes einfügen:

#ifndef WIN32
#include >iOSapi.UIKit.hpp<
#include >iOSapi.CocoaTypes.hpp<
#endif

Der Einfachheit halber habe ich jetzt einfach ein #ifndef WIN32 darum gemacht. Somit wird dieser Code immer ausgeführt, sobald die Platform nicht Windows 32 Bit ist. Wollt ihr das Programm auch als 64 Bit compilieren, müsst ihr natürlich den entsprechenden ifdef für iOS machen.

Nachdem wir die Includes haben, brauchen wir 2 Funktionsdefinitionen:

	#ifndef WIN32
	_di_UIApplication SharedApplication(void);
	_di_NSURL StrToNSUrl(String str);
	#endif

Shared Application wird für die Mail-App benötigt (um Mails versenden zu können, muss man nämlich auf die Mail-App von iOS zugreifen). Als Rückgabewert haben die zwei beiden Funktionen einen Datentypen mit _di_ vorangestellt (welche für Delphi-Interface stehen).
StrToNSUrl wird für das umwandeln des Strings benötigt (NS sind iOS Datentypen).

Die ausprogrammierten Funktionen sehen dann wie folgt aus:

#ifndef WIN32
_di_UIApplication TFrameKontaktDetail::SharedApplication(void)
{
	return TUIApplication::Wrap(TUIApplication::OCClass->sharedApplication());
}
//---------------------------------------------------------------------------

_di_NSURL TFrameKontaktDetail::StrToNSUrl(String str)
{
	return TNSURL::Wrap(TNSURL::OCClass->URLWithString(NSSTR(str)));
}
//---------------------------------------------------------------------------
#endif

Um eine Mail zu versenden fehlen nur noch 2 weitere Zeilen:

#ifndef WIN32
String strURL = "mailto:tester@googlemail.com?subject=Test&body=Gesendet%20von%20iOS";
this->SharedApplication()->openURL(StrToNSUrl(strURL));
#endif

Die erste Zeile sagt: Öffne eine neue E-Mail an den Empfänger „tester@googlemail.com“ mit dem Betreff „Test“ und dem Text „Gesendet von iOS“.
Falls Ihr im Betreff oder als Text etwas mit Leerzeichen o. ä. übergeben wollt müsst ihr wie man sehen kann, die entsprechenden Escape-Sequenzen für HTML verwenden (%20 z. B. für Leerzeichen).
Sollte es nicht funktionieren, liegt es wahrscheinlich daran, dass kein E-Mail-Account eingerichtet ist. Dies ist nämlich Voraussetzung dafür.

Das wars auch schon 🙂

27
Dez

Kurz vor Jahresende…

…melde ich mich nochmal zu Wort. Habe es heute endlich mal geschafft meine WordPress-Installation auf 3.8 Upzudaten. Eigentlich wollte ich das ja schon letzte Woche machen. Irgendwie kam mir aber dann immer wieder etwas dazwischen. Dienstag, Mittwoch, Donnerstag ist ja sowieso ganz fix vorbei. Mit den ganzen Verwandschaftsbesuchen sind die Feiertage ja sowieso schon verplant.

Die Hälfte des Urlaubs ist nun schon fast rum. Das was ich schaffen wollte habe ich noch nicht wirklich (ganz) geschafft. Naja, ein wenig gelesen habe ich schon. Auch an meiner MedienVerwaltung habe ich wieder ein wenig was gemacht. Ein Teil der Daten liegt bereits in einer MySQL-Datenbank im Internet, so dass ich per Handy darauf zugreifen kann (wenn ich dann die entsprechende App dazu fertig habe :-)).

Mit unserer Kaffeemaschine hatten wir auch nochmal Glück im Unglück. Habe die ja am Montag vorige Woche zur Reparatur gebracht. Allerdings wurde die nicht vor Ort repariert, sondern eingeschickt. Allerdings erst am Mittwoch. Also hatte ich schon wenig Hoffnung, das Reparierte Gerät noch vor Weihnachten zu erhalten. Allerdings hab ich dann doch Samstags schon wieder einen Anruf bekommen, dass es wieder da sei. Allerdings habe ich die Maschine erst am Montag holen können, da die erst Samstag-Mittag angekommen ist und das Reparaturcenter da schon zumacht.
Zumindest haben wir über die Feiertage Kaffee gehabt 🙂

16
Dez

Pech mit der Kaffeemaschine…

Wer meinen Blog regelmäßig liest, der wird sich wahrscheinlich auch an den Post mit der Kaffeemaschine erinnern (zuerst die aus Amazon mit dem Plastikgeruch, danach die gebrauchte). Nun, jetzt gibt es wieder ein anderes Problem.
Das Scharnier an dem der Deckel geöffnet ist hält nämlich nicht mehr auf der linken Seite. Scharnier ist vllt. etwas übertrieben, eher ein Plastikbolzen. Was allerdings nichts an der Situation ändert. Da der Deckel hinten etwas locker ist, „schließt“ er nicht mehr richtig.
Somit ist nicht mehr genug Druck auf dem Pad und es gibt nur noch so eine braun-durchsichtige Brühe, welche die Bezeichnung „Kaffee“ nicht verdient hat.

Also war ich heute mit dem Gerät im Elektrogeschäft wo ich diese auch gekauft habe und dort in der Service-Annahmestelle abgegeben. Leider wird die Maschine erst am Mittwoch mit der Post abgeholt. Somit ist die Wahrscheinlichkeit, dass ich das Reparierte/das Austauschgerät noch vor Weihnachten bekomme ziemlich gering.
Blöd, über die Feiertage kein Pad-Kaffee. Wir werden dann wohl die alte Filtermaschine meiner Eltern erstmal verwenden. Kaffeepadmaschine ist für 2 Personen halt einfach praktischer. Naja, die 1-2 Wochen werden wir auch ohne schaffen 🙂

11
Dez

iOS mit dem C++ Builder, endlich ist es da!

Lange erwartet, ist nun endlich das langersehnte Update von RadStudio XE5 da. Nun kann man auch mit C++ iOS-Apps entwickeln. Das Update gibt es bereits seit Freitag. Zwar hat man die letzten paar Tage auf Twitter schon viele Previews usw. gesehen, allerdings gab es noch nirgends so wirklich eine Meldung, dass die finale Version veröffentlicht wurde (die Beta läuft ja schon eine ganze Weile). Gestern habe ich dann auch wieder durch Twitter zufällig mitbekommen, dass das „Update 2“ für RadStudio nun veröffentlicht wurde, aber auch hier wieder kein Wort darüber, dass nun iOS für C++ unterstützt wird.

Heute ist mir dann aber doch eingefallen, dass der Download-Ordner bei der Betaversion „_Upd2“ angehängt hatte dabei hat es dann „Klick“ gemacht. Also erstmal ins Developer-Network und die vorhandenen Downloads gecheckt. Update 2. Wiederum: Keine Info, dass nun iOS mit C++ möglich ist. Also hab ich erstmal auf Download geklickt. Auf der Info-Seite die dann erstmal kommt habe ich nochmal nach dem Begriff „iOS“ gesucht. Und doch, ganz am Ende der Seite steht ein kleiner Hinweis.

Genauso wie wir, denke ich, dass auch schon viele andere C++-Entwickler auf dieses Update warten. Umso unverständlicher, dass es keine Rund-E-Mail oder was ähnliches gibt, dass dieses Update nun endlich zur Verfügung steht. Auch die auto-Update-Funktion brachte (zumindest bei mir) keine Meldung, was ich aber darauf zurückführe, dass das ganze RadStudio für Update 2 neu installiert werden muss.

Nun ja, jedenfalls habe ich jetzt Update 2 installiert und das Entwickeln für iOS funktioniert damit. Da wir in der Firma auch für iOS entwickeln wollen, hab ich vor einer Weile ein Macbook bekommen (da ich ja auch schon in der Beta war). Entwickeln für iOS ist nämlich logischerweise nur möglich wenn man ein entsprechendes Endgerät (=Mac) hat.
Übrigens sollte man auch kurz erwähnen, dass der iOS-Simulator nicht mit C++ funktioniert. Grund ist die unterschiedliche Prozessor-Architektur (der Simulator wird auf x86-Basis ausgeführt). Also braucht man zusätzlich zum Mac mindestens noch ein iOS-Gerät.

Da das Update nun endlich erschienen ist und man darüber sprechen darf, wird es in nächster Zeit von mir für iOS ein paar Tutorials geben 🙂

20
Nov

UPS-Abholdienst

Ich habe ja die Tage mein Nexus 5 wieder an Google zurückgeschickt. War schon leicht genervt, dass das Gerät per UPS wieder zurückgeschickt werden sollte. Denn die nächste UPS-Annahmestelle befindet sich von uns ca. 30 Minuten entfernt. Öffnungszeiten bis 18 Uhr. Natürlich blöd, denn wenn ich da nach der Arbeit hinfahre schaffe ich das so gut wie nicht.

Hab dabei hin- und herüberlegt wie ich das wohl am besten unter einen Hut bekomme. Bis ich dann doch den entscheidenden Tipp bekommen habe: Abholauftrag erstellen. Darüber war ich erstmal auch etwas verwundert. Funktioniert das nicht nur bei Firmen? Aber nein. Auf die UPS-Seite gegangen. Abholauftrag erstellt – dazu muss man noch nichtmal registriert sein. Super!

Ja, ich habe einen Rücksendeschein. Adresse eingeben, früheste/späteste Abholzeit angegeben, klick, klick fertig. Meiner Oma noch das Päckchen in die Hand gedrückt und gesagt, dass das am nächsten Tag vom Paketdienst abgeholt wird. Hat alles super funktioniert! Da wird mir UPS doch gleich etwas sympatischer 🙂

14
Nov

C++11 – Ein paar neue Features vorgestellt

Heute möchte ich ein paar Features vorstellen die mit dem neuen Standard gekommen sind.

Initialisieren

Sehr praktisch ist z. B. das Initialisieren in der Headerdatei. Somit kann man direkt beim deklarieren einen Initialwert zuweisen:

class MyTest
{
   private:
      std::string strName    = "Mustermann";
      std::string strVorname = "Max";
}

auto

Als nächstes das auto-Keyword. Damit muss man den Typ nicht mehr selbst definieren:

auto i = 5;
auto str = "Test";
auto db = 10.5;

So ergibt die erste Zeile z. B. als Typ einen Integer, die zweite einen String und die dritte Zeile einen Double. Richtig Interessant wird das auto-Keyword aber erst in Kombination von Lambda-Funktionen bzw. Vectoren. Fangen wir mit den Lambda-Funktionen an.

Lambda

Was ist eine Lambda-Funktion? Eine Lambda-Funktion ist eine anonyme Funktion, die Innerhalb einer anderen Funktion deklariert werden kann. So kann man leicht Hilfsfunktionen basteln, die man nur in einer bestimmten Funktion braucht. Um diese aber einfach zu verwenden müsste man sich einen Funktionszeiger deklarieren. Das würde dann in etwa so aussehen:

typedef void(FunctionPointer)(std::string);
FunctionPointer *p;
// Hier wird eine Lambdafunktion erzeugt und dem Funktionszeiger "p" zugewiesen
p = [](std::string strName) -> void { std::cout < < "Hello " << strName.c_str(); };
p("Christian");

Ich habe mir also einen Funktionszeiger deklariert. Diesem weise ich eine Lambda-Funktion zu, welche nichts anderes macht als ein „Hello Name“ auszugeben. Wie muss man die Lambda-Funktion verstehen? Von außen können Variablen übernommen werden:

[=] Die äußeren Werte werden kopiert, heißt: Bei einer Variable int x, die in meiner Klasse steht, kann ich mit einer Kopie des Wertes in der Funktion arbeiten
[&] Auf die äußeren Werte kann per Referenz zugegriffen werden

Außerdem sind Kombinationen möglich:

[&, =db] Auf alle Werte wird per Referenz zugegriffen, außer auf „db“, hier wird mit einer Kopie gearbeitet.

Nach den eckigen Klammern wird angegeben, welche Parameter die Funktion nimmt (hier einen String in dem ein Name übergeben werden soll). Mit „-> void“ legt man fest welchen Rückgabewert die Lambda-Funktion hat. Im Fall von „void“ kann der Rückgabewert auch weggelassen werden. Danach kommt in geschweiften Klammern der Programmcode, der ausgeführt werden soll.

Wie gesagt, wird der Funktionspointer aber mit dem auto-Schlüsselwort nicht mehr benötigt, was es für uns um einiges einfacher macht:

auto p = [](std::string strName) { std::cout < < "Hello " << strName.c_str(); };
p("Christian");

Vector mit auto

Ziemlich cool wird es auch mit den Vectoren. Wer mit diesen arbeitet wird mit Sicherheit solche Konstrukte kennen:

std::vector<std::string> myVec;
myVec.push_back("Test1");
myVec.push_back("Test2");
myVec.push_back("Test3");
myVec.push_back("Test4");
myVec.push_back("Test5");

for(std::vector</std::string><std::string>::const_iterator cit = myVec.begin(); cit != myVec.end(); ++cit)
   std::cout < < (*cit).c_str() << std::endl;

Die for-Schleife kann man jetzt ganz einfach und abkürzen:

   for(std::string str : myVec)
      std::cout < < str.c_str() << std::endl;

Und nochmal vereinfachen kann man es mit dem auto-Schlüsselwort:

   for(auto str :myVec)
      std::cout < < str.c_str() << std::endl;

Dies war zwar nur ein kleiner Ausschnitt der neuen Features, allerdings die, die ich persönlich mitunter am besten Finde.

11
Nov

Ein paar Tage mit dem Nexus 5

Vorletzte Woche wurde das Nexus 5 zum Verkauf freigegeben. Viel TamTam wurde darum nicht gemacht. Seitens Google gab es.nicht wirklich eine Vorstellung. Die Internetgemeinde war schon ziemlich gespannt.
Als das Nexus 5 dann „endlich“ vorgestellt wurde stellte sich zumindest schon mal heraus, dass die Server nicht wie beim Vorgängermodell zeitweise kaum mehr erreichbar waren, sondern dem Ansturm mehr oder weniger Stand hielten.

Wie so viele andere auch habe ich mir das Gerät am Erscheinungstag bestellt und am Dienstag darauf direkt geliefert bekommen. Allerdings werde ich mein Nexus wieder zurückschicken. Warum? Nicht weil es schlecht ist, sondern weil mein HTC One anscheinend keiner haben will. Eigentlich wollte ich mein HTC für 400€ weiterverkaufen – es befindet sich nach wie vor in einem Neuzustand. Da ich auf meine Geräte immer sehr gut Aufpasse und keines meiner Geräte ohne Schutztasche verwendet befinden diese sich immer in einem entsprechendem Zustand.
Nun denn. Auch für 350€ will das One anscheinend keiner haben und für weniger gebe ich es nicht her. Bzw. werde ich mir das Nexus nicht kaufen wenn ich noch Geld draufzahlen muss. Also schicke ich das Gerät wieder zurück. Allerdings möchte ich euch trotzdem einen kleinen Eindruck über dieses Gerät verschaffen, den ich in diesen paar Tagen gewonnen habe.

Die Verarbeitung ist sehr gut. Man findet keine Spaltmaße und auch ansonsten ist alles TipTop. Am Nexus findet man keine Tasten oder Touch-Sensoren. Bis auf die Laut-/Leiserwippe und den Ein-/Ausschalter sind keine Tasten vorhanden. Wie gewohnt werden die Home-/Zurück-/Multitasking-Buttons beim Stock-Android über das Display realisiert. Überhalb des Displays befindet sich die Hörermuschel, sowie die kaum sichtbaren Sensoren und die Frontkamera. Unterhalb des Displays ist die nicht sichtbare Benachrichtigungs-LED. Diese ist nur sichtbar wenn diese wirklich leuchtet. Keine Nachricht, keine sichtbare LED.
Cool: Empfängt man Nachrichten usw. leuchtet die LED weiß. Anscheinend passt diese aber die Farbe auch entsprechend den Apps an (oder die Apps sind so programmiert). Jedenfalls leuchtet die LED z. B. bei Facebook-Benachrichtigungen Blau.

Weiter mit dem Gehäuse. An der Unterkante befindet sich Lautsprecher, Mikrofon und dazwischen der MicroUSB-Anschluss. An der Oberkante befindet sich ein weiteres Mikrofon, sowie der 3,5mm Klinkenanschluss. Übrigens befindet sich im Lieferumfang kein Headset.

Das Gerät ist unglaublich schnell. Viele von euch werden es kennen. Wenn man schonmal ein iPhone und ein Android in der Hand hatte und dort z. B. die Facebook Timeline durchgescrollt hat ist einem sicher aufgefallen, dass es beim iPhone doch etwas flüssiger läuft. Nicht so beim Nexus 5. Dort läuft alles super ohne Ruckler. Auch Spiele usw. stellen für das Gerät kein Problem dar.
Das Display ist super. Bei der Auflösung kann man mit bloßem Auge keine Pixel mehr erkennen und auch die Farben sind super. Die Kamera konnte ich leider nicht wirklich testen.

Beim Ton schimpfen viele, dass dieser zu Leise sei. Meiner Meinung nach war dieser auch super. Ich höre mit den Lautsprechern zwar sowieso nicht so laut, aber für mich war er laut genug. Auch die Klangqualität war i. O.

Einzig und allein der Akkus ist mit 2300 mAh nicht gerade groß bemessen und hat die gleiche Kapazität wie der meines Ones. Wer kein Google Now benötigt sollte es ausschalten. Danach kam ich z. B. ganz gut über den Tag.

6
Nov

Watchever

Man hört ja ständig in der Werbung, etc. con Watchever. Also hab auch ich mir gedacht „Okay, die ersten 30 Tage sind sowieso kostenlos, also versuchst du das ganze mal“.

Als erstes hab ich mir dann die iPhone-App installiert. Und siehe da, auch von dort aus klappt die Registrierung einwandfrei. Und in meinen Augen gibts auch noch einen Vorteil. Man bekommt für 8,99€ 3 Monate (nur bei Erstanmeldung). Coole Sache, so bekommt man 2 Monate geschenkt.
Außerdem kann man die 8,99€ ganz einfach per In-App-Purchase zahlen. Schon funktioniert alles.

Das Serien- u. Filmangebot ist teilw. ziemlich gut. Anders gesagt, auch wenn es nicht jede Serie gibt, so sollte sich doch für jeden etwas finden. Ich habe mir bis jetzt eine komplette Staffel einer Serie angesehen, sowie einen Film und ein paar einzelne Episoden von Serien.
Das Streamen funktioniert auch ziemlich gut. Mit 6000er DSL kann man die Serien (sofern möglich) super in HD schauen.

Mit den Geräten mit denen man Streamen kann sieht es etwas durchwachsen aus. Auf dem iPhone hat ein kurzer Test ganz gut funktioniert. Auf einem Android-Tablet funktionoert es auch einigermaßen, solange man nicht in den Standby-Modus wechselt solange ein Film angesehen wird. Nachdem das Tablet im Standby war und ich danach weiterschauen wollte, hatte sich die Watchever-App komplett verabschiedet und nicht mehr funktioniert. Auch ein Neustart der App brachte dabei keine Besserung. Nur ein Neustart des Tablets schaffte Abhilfe.
Bei den unterstützten Android-Geräten ist das auch so eine Sache. Dabei werden zwar laut der Watchever-Seite einige unterstützt, aber neuere Geräte (wie z. B. HTC One, Nexus 5) tauchen dort gar nicht auf. Auf meinem HTC One ist z. B. auch nur die Watchever-Lite-App verfügbar, die doch sehr sehr eingeschränkt ist.

Schön dafür ist aber (sofern die normale App für euer Geräte verfügbar ist), dass es einen Offline-Modus gibt. D. h. ihr könnt euch zu Hause übers WLAN Serien herunterladen und diese dann Unterwegs einfach ansehen ohne Traffic zu verbrauchen. Dies setzt natürlich ein gewisses Maß an freiem Speicher voraus. Super Idee.

Was bei mir auch nicht so richtig funktionieren will ist die Playstation 3 App. Bei Serien habe ich z. B. immer das Problem, dass beim weiterschalten auf die nächste Folge spätestens nach der zweiten Schluss ist. Danach wird der Stream einfach nicht mehr geladen, was für mich heißt -> App neu starten. Allerdings bringt das auch nicht immer den gewünschten Erfolg und ich muss das ganze System neu starten…
Am PC hingegen funktioniert eigentlich alles ziemlich gut.

28
Okt
Ausgepackt

[Testbericht] iPhone 5S – Teil 3: Der Fingerabdrucksensor und die Kamera

Ne ganze Weile hats gedauert, aber jetzt gibts endlich den dritten (und diesmal damit letzten Teil) des Testberichts für das iPhone 5S. Eigentlich wollte ich ihn letzte Woche schon fertig schreiben. Wieso ich das nicht gemacht habe/nicht dazu kam, erfahrt ihr in einem separaten Post, denn hier geht es ja um das iPhone.

Sehen wir uns also als erstes mal den Fingerabdrucksensor Mehr lesenRead more

19
Okt

Zeit? Mangelware!

Letztes Wochenende war es auch schon so. Freitag kommt man um ca. 13 Uhr von der Arbeit nach Hause. Dann erstmal ein wenig was essen und ein wenig was in der Wohnung machen. Abends waren wir dann mit meinen Eltern verabredet. Also um kurz vor 5 losgefahren und dann von meinen Eltern aus weiter zum Essen. Danach noch ein wenig bei meinen Eltern mit ihren Nachbarn gesessen und schon war der Freitag gelaufen.
Samstags dann ein „wenig“ länger geschlafen. Also um ca. halb 9 aufgestanden. Erstmal mit meiner Freundin gefrühstückt und dann nach draußen. Auf das Auto meiner Freundin die Winterreifen montiert (und ja, momentan braucht man die eigentlich noch nicht). Dann ihr Auto noch gewaschen und die Gartenmöbel verräumt. Schon wars auch schon wieder 4 Uhr rum. Danach noch ein wenig vor den PC und TV und auch der Samstag war vorbei.
Am Sonntag dann auch erstmal gemütlich gefrühstückt und ein wenig vorm PC gesessen. Nachmittags kamen dann die Eltern meiner Freundin. Währen die zwei Damen sich dann mit der Nähmaschine beschäftigten habe ich mir mit ihrem Dad Wanted angesehen. Schwupps, auch der Sonntag war vorbei.

Von der Woche brauchen wir gar nicht erst reden. Jeden Tag in der Arbeit und die Zeit vergeht wie im Flug. Eigentlich wollte ich dann gestern auch die Winterreifen auf mein Auto montieren. Allerdings sagt der Wetterbericht für nächste Woche ~20°C, also mach ich das wohl doch erst nächsten Freitag. Also hatte ich gestern etwas Zeit um wieder etwas die Wohnung aufzuräumen. Gesagt getan. Abends dann mit den Eltern meiner Freundin zum Essen gegangen und bei uns zu Hause dann noch ein wenig zusammengesessen.

Heute war ich mit meinem Dad Holzarbeiten. Von 9 – ~14Uhr. Danach was gegessen, ab ins Bad und zum neuen Intersport der in Deggendorf aufgemacht hat. Heute gabs noch 20%. Also noch nen Pulli gekauft, noch kurz bei meinen Eltern nen Kaffee getrunken und nun sitze ich eh schon hier.
Morgen sind wir dann noch zum Mittagessen bei meinen Eltern eingeladen und dann sehen wir mal 🙂