Skip to content

Archiv fuer den Monat Dezember, 2012

27
Dez

Nicht untätig.

Man hat zwar mittlerweile schon eine weile nichts mehr von mir gehört, aber trotzdem war ich nicht untätig. Letzte Woche habe ich meine WordPress Installation wiedermal geupdatet, was nun endlich auch wiedermal dringend nötig war. Außerdem habe ich schonmal mit meiner Blog-App für Android begonnen. Das holen der Daten per Web-Request ist eigentlich gar nicht so tragisch (sobald man zumindest mal weiß, dass Web-Requests in einem Thread abgearbeitet werden müssen), aber gut.
Ebenso habe ich mir den Bildschirm meiner Freundin geklaut. Also den Monitor. Weil sie ja jetzt eh einen neuen Laptop hat, ist sie kaum mehr hier oben wo mein Rechner steht und auch ihr Monitor. Und bevor dieser vergammelt, hab ich mir gedacht: Na gut dann nimmst du ihn eben.

Übrigens denke ich, kann die erste (Beta)Version meiner Blog-App bereits ab Mitte – Ende nächster Woche getestet werden. Viel wird diese dann wahrscheinlich noch nicht können, aber ein paar Posts anzeigen um was es ja bei so einer App geht wird schon funktionieren 🙂

Wo wir gerade beim Testen sind. Ich teste auch sehr gern mobile Geräte (Handy, Tablet). Von denen habe ich auch bereits ein paar geschrieben. Unter anderem folgende:

LG E900 Optimus 7
iPhone 4
LG P920 Optimus 3D
Galaxy Tab 2 10.1

Dabei wurden mir die beiden LGs von faq4mobiles zur Verfügung gestellt. Bzw. von Sponsoren. Dort wurden schon ein paar mal Geräte zum testen bereitgestellt. Das iPhone 4 war mein eigenes Gerät.

Als es den mobi-test-Blog eine weile lang gab, wurden neue Tester gesucht (was aber mittlerweile schon wieder ziemlich lange her ist). Jedenfalls hatte ich Glück und wurde ausgewählt. Ich konnte mein Glück kaum fassen, allerdings war es auch recht schnell wieder vorbei. Anscheinend gab es nämlich ein paar schwarze Schafe, was ja nichts neues ist, die gibt es ja überall. Jedenfalls sind laut angaben des Betreibers ein paar Geräte dermaßen zerkratzt und „verstümmelt“ zurückgekommen, dass er daraus die notwendige Konsequenz gezogen hat. Und zwar wurden alle Mitglieder aus dem Testteam geworfen. Da ich zu diesem Zeitpunkt noch kein Testgerät bekommen hatte und erst 2 Wochen im Team war, wurde ich auch gleich wieder „rausgeworfen“.

So und jetzt mach ich mal an meiner App weiter 🙂

22
Dez

Hello World! – Für Android.

Wie schon vor ner ganzen Weile angekündigt habe ich vor ein Hello World-Tutorial für Android zu schreiben. Und heute ist es so weit. Als erstes braucht Ihr Eclipse und den AVD(Android Virtual Device)-Manager. Dazu gibt es bei Google ein Bundle in dem beides bereits enthalten ist. Ein Klick auf „Download the SDK ADT Bundle for Windows“ lädt dann die knapp 400MB große Zip-Datei herunter.
Die heruntergeladene Zip-Datei könnt Ihr entpacken. In dem Ordner befinden sich dann „eclipse“, „sdk“ und „SDK Manager.exe“. Diese drei Ordner bzw. Dateien packt Ihr irgendwohin wo Ihr sie haben wollt. Den Ordner „sdk“ muss in „android-sdk-windows“ umbenannt werden. Danach kann „eclipse.exe“ aus dem gleichnamigen Verzeichnis gestartet werden.
Nachdem eclipse gestartet wurde, muss zumindest eine Android-Version heruntergeladen werden. Dazu klicken wir auf das fünfte Icon der Icon-Leiste (Android SDK Manager). Im erscheinenden Fenster machen wir ein Häckchen bei „Tools“ und in diesem Beispiel bei „Android 4.0.3 (API 15)“. Natürlich könnt Ihr später auch noch die anderen Versionen herunterladen. Mit „Install X Packages“ werden die ausgewählten Dateien heruntergeladen.
Ist der Download fertig können wir uns ein AVD erstellen. Dies geschieht mit sechsten Icon (Android Virtual Device Manager). Im erscheinenden Fenster rechts auf „New“ klicken. Im erscheinenden Fenster müssen die entsprechenden Einstellungen getroffen werden.

Name ist eigentlich egal, ich nenne das Gerät in diesem Beispiel „ICS“.
Device: 3.2″ HVGA slider (ADP1) (320 x 480: mdpi)
Target: Android 4.0.3 – API Level 15
CPU/ABI: ARM (armeabi-v7a)
SD Card: Size: 64 MiB

Den rest können wir so lassen wie vorgegeben. Dann bestätigen wir mit Ok.

Nun können wir mit unserem Projekt beginnen. „File -> New -> Project“. Dann wählen wir den Ordner „Android“ und darunter „Android Application Project“. Ein Click auf „Next“ und die nächste Maske erscheint.
Application Name: HelloWorld
Project Name: HelloWorld:
Package Name: com.chrisblog.helloworld
Beim Packagenamen solltet Ihr eine „URL“ verwenden die euch gehört. Bei mir z. B. com.chrisblog.

Minimum Required SDK: API 8: Android 2.2 (Froyo). (Legt fest ab welcher Android Version die App auf Geräten installiert werden kann, höhere Versionen haben mehr Funktionen. Hier muss also abgewägt werden was euch wichtiger ist. Für unser Beispiel reicht jedoch Android 2.2).
Target SDK: API 15: Android 4.0.3
Compile With: API 15: Android 4.0.3
Theme: Egal, ich habe den Standard gelassen.

Wieder auf „Next“. Ich habe den hacken bei „Create custom launcher icon“ entfernt, da wir dies im Moment nicht brauchen. Der Rest bleibt wieder so wie er war. In der nächsten Maske sollte „Create Activity“ angehakt sein und „Blank Activity“ ausgewählt sein. Falls nicht wählen wir dieses aus und klicken wieder auf „Next“. Der Name der Activity kann so bleiben wie er ist. „Finish“ und wir können loslegen.

eclipse sollte nun automatisch „activity_main.xml“ geöffnet haben. Wenn nicht macht Ihr das selbst. Im „Package Explorer“ auf der linken Seite unter „HelloWorld -> res -> layout“ ist die entsprechende Datei zu finden. Danach wechseln wir vom „Graphical Layout“ in „activity_main.xml“.

Dort ändern wir die Beiden „RelativeLayout“s in „LinearLayout“s.

Den Eintrag der mit „<TextView“ beginnt löschen wir und schreiben an dessen Stelle folgenden Code:

    &lt;EditText 
        android:id="@+id/edtName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="Name"
        /&gt;

Danach noch ein Button:

    &lt;Button
        android:id="@+id/btnHello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello!"
        /&gt;

Dann wechseln wir in die Datei „MainActivity.java“ welche sich unter „src -> eureURL.helloworld“ befindet.
Wir brauchen noch folgende imports:

import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

Als nächstes „holen“ wir uns unser Editfeld und den Button „in den Code“. Dies machen wir in der Methode „onCreate“ nach „setContentView(R.layout.activity_main);“:

Button b = (Button)findViewById(R.id.btnHello);
final EditText edt = (EditText)findViewById(R.id.edtName);

Dann kommt das OnClick-Event welches wie folgt festgelegt wird:

b.setOnClickListener(new OnClickListener() {
			
   @Override
   public void onClick(View arg0) {
      Toast.makeText(getApplicationContext(), "Hello World!", Toast.LENGTH_LONG).show();
   }
});

Toast.makeText erzeugt eine Meldung. Der erste Parameter ist der ApplicationContext, der zweite der Text der ausgegeben werden soll. Der dritte Parameter gibt an ob die Meldung kurz oder lang angezeigt werden soll und mit „show()“ sagen wir dem ganzen, dass es jetzt angezeigt werden soll.

Jetzt kann die App schonmal gestartet werden und sollte „Hello World!“ ausgeben.

Zum Schluss können wir das ganze so modifizieren, dass der eingegebene Name angezeigt wird:

b.setOnClickListener(new OnClickListener() {
			
   @Override
   public void onClick(View arg0) {
      Toast.makeText(getApplicationContext(), "Hello " + edt.getText() + "!", Toast.LENGTH_LONG).show();
   }
});

Wird die App nun gestartet und klickt man auf den Button „Hello!“ wird der entsprechende Text der im Textfeld „Name“ steht ausgegeben. Zugegeben, schön ist die App nicht gerade, allerdings erfüllt sie ihren Zweck.

18
Dez

Wie verwende ich sqlite in C++?

Wer eine kleine Datenbank in seine Anwendung einbauen möchte ist bestimmt schonmal auf sqlite gestoßen. Unter C# ist die Einbindung ziemlich einfach und mit einer DLL sehr schnell gemacht. In C++ sieht das ganze etwas komplizierter aus, ist aber vom Prinzip her auch ziemlich einfach zu handhaben.
(Ich benutze als Entwicklungsumgebung den C++ Builder von Embarcadero in der Version XE3).
Als erstes brauchen wir die Source-Files. Diese laden wir uns hier herunter. Wir benötigen das sqlite-amalgamation Package mit den C++-Headerdateien.

Die Headerdateien müssen aus dem zip-Ordner entpackt werden und dem Projekt hinzugefügt werden. Dann muss die „sqlite“-Header eingebunden werden:

#include "sqlite3.h"

Danach kann auch gleich losgelegt werden. Wir brauchen folgende Variablen:

int     nResult = 0, nCols = 0;
sqlite3 *db;
sqlite3 *stmt;

Dann wird die Verbindung mit der Datenbank hergestellt. Im Falle von SQLite ist das im Prinzip nur eine Datei. Ist diese noch nicht vorhanden, wird sie erzeugt. Und so gehts:

sqlite3_open("Sample.db", &db);

Und schon können wir mit den Statements loslegen. Als erstes wird natürlich eine Tabelle angelegt:

if (sql3_prepare_v2(db, "CREATE TABLE Test(a INTEGER, b INTEGER);", -1, &stmt, 0) != SQLITE_OK)
   ShowMessage("Error");

Mit einem „Step“ wird der Befehl ausgeführt und falls es keinen Rückgabewert gibt muss das Statement auch gleich finalisiert werden:

sqlite3_step(stmt);
sqlite3_finalize(stmt);

Danach können wir fortfahren und ein paar Daten in die Tabelle schreiben:

if (sql3_prepare_v2(db, "INSERT INTO Test(1, 2);", -1, &stmt, 0) != SQLITE_OK)
   ShowMessage("Error");

sqlite3_step(stmt);
sqlite3_finalize(stmt);

Zum Schluss das auslesen der Tabelle. Zuerst holen wir uns die Anzahl der Spalten:

nCols = sqlite3_column_count(stmt);

Danach lesen wir die Daten aus. Wir laufen durch eine Schleife, die erst unterbrochen wird, sobald das Ergebnis des „Steps“ nicht mehr einer „SQLITE_ROW“ entspricht. Solange dies der Fall ist lesen wir den aktuellen Namen der Spalte und den aktuellen Wert der Zeile in der entsprechenden Spalte aus und geben diesen mit einem einfachen ShowMessage aus:

if (sql3_prepare_v2(db, "SELECT * FROM Test;", -1, &stmt, 0) != SQLITE_OK)
   ShowMessage("Error");

while(true)
   result = sqlite3_step(stmt);

   if (result == SQLITE_ROW)
   {
      for(int nCol = 0; nCol < nCols; nCol++)
      {
         String strName = sqlite3_column_name(stmt, nCol);
         String strWert = (char*)sqlite3_column_text(stmt, nCol);
         ShowMessage(strName + ": " + strWert);
      }
   }
   else
      break;

sqlite3_finalize(stmt);

Ganz zum Schluss müssen wir die Datenbank natürlich wieder schließen:

sqlite3_close(db);
16
Dez

Wie binde ich eine Delphi-DLL im C++-Builder ein?

So, heute gibts wiedermal einen Post zum Thema Programmierung. Keine Angst, das Android Hello World kommt auch bald. Letzte Woche stand ich vor dem Problem: „Wie kann ich eine Delphi-DLL im C++ Builder einbinden?“. Die Lösung ist eigentlich relativ einfach.

Als erstes legen wir eine Delphi-DLL an: „Datei -> Neu -> Weitere -> Delphi-Projekte -> Dynamische Link-Bibliothek“. Das ganze speichert Ihr unter dem Namen eurer Wahl ab. Als nächstes legen wir eine Funktion an:

function Summe(a, b: integer): integer; cdecl;
begin
   result := a + b;
end;

Ganz wichtig dabei ist das „cdecl“ sonst funktioniert es nicht richtig.

Logischerweise muss die Funktion dann auch „exportiert“ werden, damit man darauf Zugreifen kann. Das macht man folgendermaßen:

exports
   Summe;

Damit ist der Delphi Teil auch schon fertig. Hier nochmal die Komplette Datei:

library DLLDemo;

uses
   System.SysUtils,
   System.Classes;

function Summe(a, b: integer): integer; cdecl;
begin
   result := a + b;
end;

exports
   Summe;

{$R *.res}

begin
end.

Als nächstes kommt der C++ Teil. Ich habe meiner Projektgruppe einfach eine neue VCL-Formularanwendung hinzugefügt: Rechtsklick auf Projektgruppe -> „Neues Projekt hinzufügen -> C++-Builder-Projekte -> VCL-Formularanwendung“.
Auf das Formular habe ich ganz einfach 2 Editfelder gezogen und einen Button. Danach müssen wir in die Headerdatei wechseln. Dort müssen wir ein paar Sachen definieren. Zuerst die DLL-Funktion auf die wir zugreifen wollen:

typedef int (DLLFUNC)(int a, int b);

Außerdem brauchen wir einen Zeiger auf den eben erstellten „Typ“ und eine Variable vom Typ HINSTANCE:

DLLFUNC *pDLLFunc;
HINSTANCE hInstance;

Die Headerdatei sollte dann so ähnlich aussehen:

#ifndef DLLAppH
#define DLLAppH
//---------------------------------------------------------------------------
#include &lt;System.Classes.hpp&gt;
#include &lt;Vcl.Controls.hpp&gt;
#include &lt;Vcl.StdCtrls.hpp&gt;
#include &lt;Vcl.Forms.hpp&gt;
//---------------------------------------------------------------------------

class TForm1 : public TForm
{
__published:	// Von der IDE verwaltete Komponenten
	TEdit *Edit1;
	TEdit *Edit2;
	TButton *Button1;
	void __fastcall Button1Click(TObject *Sender);
private:	// Benutzer-Deklarationen
	typedef int (DLLFUNC)(int a, int b);
	DLLFUNC *pDLLFunc;
	HINSTANCE hInstance;
public:		// Benutzer-Deklarationen
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Weiter gehts in der „.cpp“-Datei. Im Konstruktor wird die DLL geladen. Falls dies fehlschlägt wird eine Fehlermeldung ausgegeben. Die „.dll“-Datei muss sich im gleichen Verzeichnis befinden wie die „.exe“-Datei.

hInstance = ::LoadLibrary(L"DLLDemo.dll");

if (!hInstance) {
   ShowMessage("Die DLL konnte nicht geladen werden!");
}

Im OnClick Ereignis unseres Buttons schreiben wir folgenden Code:

this-&gt;pDLLFunc = (DLLFUNC*)::GetProcAddress(hInstance, "Summe");

if (!this-&gt;pDLLFunc) {
   ShowMessage("Laden der Funktion &gt;&gt; Summe &lt; &lt; fehlgeschlagen!"); } int nSum = (this-&gt;pDLLFunc)(this-&gt;Edit1-&gt;Text.ToInt(), this-&gt;Edit2-&gt;Text.ToInt());

ShowMessage(nSum);

Mit „GetProcAdress“ „laden“ wir die Funktion. Der erste Übergabeparameter ist die Variable des Typs HINSTANCE in der das Ergebnis der LoadLibrary-Funktion stehlt, der zweite Prameter ist der Funktionsname der Funktion die wir aufrufen wollen. Falls dies fehlschlägt geben wir eine Fehlermeldung aus.
Andernfalls Rufen wir die Funktion mit den in den 2 Editfeldern stehenden Zahlen auf und geben das Ergebnis mittel eines ShowMessage aus.

Das wars. Schon könnt Ihr eine Delphi-DLL im C++ Builder verwenden.

10
Dez

Schnee…

Wir nähern uns Weihnachten. Kann man auch an dem ganzen Schnee erkennen (zumindest bei uns). Ich hab ja eigentlich so auch nichts gegen den Schnee – solange der nicht über Nacht fällt, damit ich morgens Schneeräumen muss. Heute bin ich z. B. um 4:45 Uhr aufgestanden um Schnee zu schippen. Um kurz vor 5:45 Uhr war ich dann auch fertig. Und dabei war noch nicht mal alles geräumt, sondern nur das nötigste. Heute und morgen solls ja auch wieder schneien, ich hoffe aber nicht wieder über Nacht so viel.
Zumindest habe ich schon so gut wie alle Weihnachtsgeschenke. Zurzeit fehlen mir noch für 3 bzw. 4 Personen welche und da weiß ich schon Größtenteils was ich da kaufe.
Und da wir uns so rasant Weihnachten nähern gibts auch jede Menge Weihnachtsgewinnspiele. Leider hatte ich bis jetzt noch kein Glück… Wie jedes Jahr eigentlich.

Auf Weihnachten bekomme ich dann einen Kindle. Bin ja mal gespannt. Eigentlich war ich immer der Meinung: Nein ich kaufe mir keinen Kindle. Ich habe lieber Bücher zu Hause im Regal stehen. Nun habe ich mich aber doch entschieden mal so ein Gerät zu auszuprobieren. Denn für Unterwegs sind die Dinger einfach praktischer als ein Buch. Naja ich werde sehen ob ich gefallen daran finde. Zumindest die meisten Amazon-Bewertungen lesen sich ziemlich gut 🙂
Wo wir gerade beim Kindle sind. Bis zu Weihnachten möchte ich den 5. Band von „Das Lied von Eis und Feuer“ fertig sein, damit ich nach Weihnachten gleich mit dem Kindle den 6. Band lesen kann. Aktuell fehlen mir noch ca. 200 Seiten. Und wenn ich dann mit der „Das Lied von Eis und Feuer“-Serie fertig bin, stehen „Die Tribute von Panem“ auf dem Plan.
Übrigens gibts bei Amazon die 2. Staffel von Game of Thrones zum vorbestellen. Vorraussichtlicher Liefertermin liegt im April. Ich hab mir gleich mal eine Version „gesichert“.

Wie läufts mit meinem Android-Projekt? Zugegeben, in letzter Zeit war ich ziemlich „faul“ was das betrifft. Da auch der Emulator auf dem Laptop nicht so richtig läuft (stürzt immer ab) und ich mich mit dem Thema noch nicht so wirklich beschäftigt habe, kümmere ich mich um das Projekt meisten nur in der Mittagspause, falls ich da dann im Büro bin und Lust dazu habe. Zumindest kann ich schonmal eine Anfrage ins Internet feuern und bekomme das Ergebnis zurück. Ich denke auch, dass ich im Betriebsurlaub ein bisschen mehr Zeit haben werde um mich damit zu beschäftigen.
Außerdem habe ich mir auch vorgenommen meinen Rechner im Betriebsurlaub nochmal neu aufzusetzen. Ganz so glorreich war die Installation von AntiVir auf dem Windows8 Rechner nämlich nicht. Woher soll ich denn auch wissen, dass das Programm ständige BlueScreens verursacht? Deinstallation klappt natürlich auch nicht, weil gleich wieder ein Bluescreen produziert wird, auch im Abgesicherten Modus und sonst habe ich keine Idee wie ich das Programm runterbekommen soll, naja… Komischerweise stürzt mein Rechner immer nachdem ersten start ab, nachdem Neustart funktioniert alles Problemlos.

Übrigens ist das der 190. Blogeintrag. Fehlen also nur noch 10 bis zum „200-Jubiläum“.