Der GULP IT-Projektmarktindex misst seit 1998 kontinuierlich die über den GULP Server zugestellten Projektangebote. Der daraus gewonnene Index ist ein idealer Gradmesser für die Angebots- und Nachfragesituation am IT-Projektmarkt.

Link: GULP IT-Projektmarktindex: Der Gradmesser für die Angebots- und Nachfragesituation am IT.

Möchte man im Hauptmenü einer MFC-basierten Anwendung einen Menübefehl mit einem gesetzten “Häkchen” versehen, so gibt es verschiedene Möglichkeiten, dies zu tun. In diesem Zusammenhang habe ich bereits des Öfteren Code der folgenden Art gefunden:

// ---------------------------------------------
// Klasse.h
// ---------------------------------------------
class CKlasse : public CWnd
{
public:
	...
	afx_msg void OnBefehl( void );
	...
	DECLARE_MESSAGE_MAP()
};

// ---------------------------------------------
// Klasse.cpp
// ---------------------------------------------

BEGIN_MESSAGE_MAP
	ON_COMMAND( ID_BEFEHL, OnBefehl )
END_MESSAGE_MAP

void CKlasse::OnBefehl(void)
{
	// Ist das Häkchen vor dem Menübefehl gesetzt?
	UINT oldstate, checkstate;
	HMENU hMenu = AfxGetMainWnd()->GetMenu()->GetSafeHmenu();
	oldstate = ::GetMenuState( hMenu, ID_BEFEHL, MF_BYCOMMAND );
	checkstate = oldstate;
	checkstate &= MF_CHECKED;
	if ( checkstate == MF_CHECKED )
	{	// Das Häkchen ist gesetzt. Entferne das Häkchen nun.
		oldstate = 0;
		::CheckMenuItem( hMenu, ID_BEFEHL, oldstate );

		...
	}
	else
	{	// Das Häkchen ist nicht gesetzt. Setze es
		oldstate ^= MF_CHECKED;
		::CheckMenuItem ( hMenu, ID_BEFEHL, oldstate);

		...
	}
}

Das ist grundsätzlich nicht falsch und funktioniert ja auch. Insgesamt bietet die MFC dafür aber einen deutlich eleganteren Mechanismus, den ich nachfolgend mal kurz beschreiben möchte.

Möglichkeiten der MFC

Die MFC bietet für die einleitend beschriebene Problemstellung einen Mechanismus an, der mit Hilfe der Message-Map-Makros folgendermaßen implementiert werden kann:

// ---------------------------------------------
// KlasseNeu.h
// ---------------------------------------------
class CKlasseNeu : public CWnd
{
	BOOL m_bBefehlIsChecked;
public:
	...
	afx_msg void OnBefehl( void );
	afx_msg void OnUpdateBefehl( void );
	...
	DECLARE_MESSAGE_MAP()
}; 

// ---------------------------------------------
// KlasseNeu.cpp
// ---------------------------------------------

BEGIN_MESSAGE_MAP(CKlasseNeu, CWnd)
	ON_COMMAND( ID_BEFEHL, OnBefehl )
	ON_UPDATE_COMMAND_UI( ID_BEFEHL, OnUpdateBefehl )
END_MESSAGE_MAP()

void CKlasseNeu::OnBefehl(void)
{
	m_bBefehlIsChecked = !m_bBefehlIsChecked;

	if( m_bBefehlIsChecked )
	{
		...
	}
 	else
 	{
 		...
 	}
}

void CKlasseNeu::OnUpdateBefehl( CCmdUI* pCmdUI )
{
	pCmdUI->SetCheck( m_bBefehlIsChecked );
}

Das ist – wie man sehen kann – nicht nur viel einfacher zu lesen, sondern vom Coding her auch wesentlich eleganter, da man auf diese Weise gar nicht direkt auf die UI-Elemente zugreifen muss.

Weitere Möglichkeiten der MFC

Der Command- und Update-Mechachnismus bietet aber noch weitere Möglichkeiten. Zum Beispiel kann man mit dem ON_UPDATE_COMMAND_UI eine einzige Methode für mehrerer Update-Aktionen verwenden. Dies hat den Vorteil, dass die man die Klassendefinitionen in vielen Fällen stark reduzieren kann, weil man nicht mehr so viele Methoden benötigt. Beispiel:

// ---------------------------------------------
// KlasseNeu.cpp
// ---------------------------------------------

BEGIN_MESSAGE_MAP( CKlasseNeu, CWnd )
	ON_UPDATE_COMMAND_UI( ID_BEFEHL1, OnUpdateMenu )
	ON_UPDATE_COMMAND_UI( ID_BEFEHL2, OnUpdateMenu )
	ON_UPDATE_COMMAND_UI( ID_BEFEHL3, OnUpdateMenu )
END_MESSAGE_MAP()

void CKlasse::OnUpdateBefehl( CCmdUI* pCmdUI )
{
	switch( pCmdUI->m_nID )
	{
		case ID_BEFEHL1:
			pCmdUI->Enable( ... )
			pCmdUI->SetCheck( ... )
			break;
		case ID_BEFEHL2:
			pCmdUI->Enable( ... )
			...
			break;
		case ID_BEFEHL3:
			...
			break;
		default:
			// Unbekannter Befehl
			break;
	}
}

Es sollte auch berücksichtigt werden, dass in einem ON_UPDATE_COMMAND_UI-Handler nicht zu komplexe und berechnungsintensive Aktionen verwendet werden, da diese Handler sehr häufig aufgerufen werden.

In Analogie zum ON_UPDATE_COMMAND_UI-Handler gibt es auch einen ähnlich aufgebauten ON_COMMAND-Handler mit dem Namen ON_COMMAND_EX, der z.B. so eingesetzt werden kann:

ON_COMMAND_EX( ID_BEFEHL1, OnBefehl );
ON_COMMAND_EX( ID_BEFEHL2, OnBefehl );
ON_COMMAND_EX( ID_BEFEHL3, OnBefehl );

Mit der Methode

afx_msg BOOL OnBefehl( UINT nCmdUI );

kann man dann vollkommen analog zu den ON_UPDATE_COMMAND_UI-Methoden das hier machen:

BOOL CKlasseNeu::OnBefehl( UINT nCmdUI )
{
	switch( nCmdUI )
	{
		case ID_BEFEHL1:
			...
			break;
		case ID_BEFEHL2:
			...
			break;
		case ID_BEFEHL3:
			...
			break;
		default:
			// Unbekannter Befehl
			break;
	}
}

Insbesondere bei sehr übersichtlichen und miteinander verwandten Befehlen (z.B. Befehle aus dem Datei-Menü etc.), bietet sich eine solche Implementierung durchaus an.

Mit Version 9.0 sind die Microsoft Foundation Classes (MFC) um das MFC Feature Pack erweitert worden. Einen Überblick über alle Klassen geben die als XPS und PDF (Download) vorliegenden MFC Hierarchy Charts:

  • MFC Hierarchy Chart Part 1 of 3: Classes Derived From CObject (pdf, xps).
  • MFC Hierarchy Chart Part 2 of 3: Classes That Derive From CCmdTarget Or CWnd (pdf, xps).
  • MFC Hierarchy Chart Part 3 of 3: Classes Not Derived From CObject (pdf, xps).
03. December 2010 · Comments Off · Categories: c++, MFC

Was bringt das Service Pack 1 speziell für c++-Entwickler? Die Frage beantwortet der Artikel VS2010 SP1 Beta: What’s in It for C++ Developers im MSDN.

Möchte man im Visual Studio 2010 die sehr nützliche Aufgabenliste verwenden, so muss man diese in den Optionen (unter Text-Editor, C/C++, Formatierung) aktivieren:

Standardmäßig war sie bei mir deaktiviert.

24. August 2010 · Comments Off · Categories: Geokodierung, Google Maps

Wie weit ist Frankfurt von Hawaii entfernt? Das ist doch praktisch: Mit http://www.luftlinie.org/ kann man diese Frage einfach und schnell beantworten. Es sind 12092.853 km.

Das englischsprachige Analogon zu dieser Seite ist unter der Adresse http://www.distance.to/ zu finden. Auf dieser Seite lautet das Ergebnis zu obiger Anfrage 7514.15 miles.

Die Entfernungsberechnung basiert auf Google Maps.

20. July 2010 · Comments Off · Categories: Datenbanken · Tags: ,

Leider ist es nicht möglich, einen mit SQL Server 2008 erstellten Datenbank-Dump in eine SQL Server 2005-Datenbank einzuspielen. Umgekehrt besteht ebensowenig die Möglichkeit, aus einer 2008er-Datenbank einen 2005er-Dump zu erzeugen. Daher ist es in diesem Fall notwendig, einen kleinen Umweg zu gehen.

SQL Server 2008 Export

Mit dem Skript-Assistenten (Im Kontextmenü einer Datenbank des SQL Server Management Studios unter “Tasks” den Befehl “Generate Scripts…” ausführen) kann ein SQL-Skript generiert werden, dass sowohl das Schema als auch die Daten berücksichtigt. Im zweiten Schritt des Assistenten gilt es, die Datenbank auszuwählen, für die man das Skript erstellen möchte. Unterhalb der Auswahlliste muss das Häkchen vor “Script all objects in the selceted database” gesetzt sein, damit die gesamte Datenbank exportiert wird. Im nächsten Schritt setzt man den Eintrag “Script for Server Version 2008″ von “SQL Server 2008″ auf “SQL Server 2005″ und “Script Data” auf “True”. Möchte man die Datenbank-Instanz auf dem SQL Server 2005 ebenfalls durch das Skript erstellen lassen, dann muss man auch “Script Database Create” auf “True” setzen. Nun kann man den Assistenten mit “Finish” beenden.

SQL Server 2005 Import

Bei größeren Datenbanken wird das Ausführen des im vorangehenden Abschnitts generierten Scripts im Microsoft SQL Server Management Studios aus Speicherplatzgründen fehlschlagen. Aus diesem Grund ist der Einsatz des sqlcmd-Befehls erforderlich (via Eingabeaufforderung), mit dem auch größere Script ausgeführt werden können.

sqlcmd -s ServerNameDatenbankName
       -q D:...ScriptDatei.sql -o D:...LogDatei.log

Der Importvorgang kann nun einige Minuten in Anspruch nehmen.

Links

Ich bin mir nicht sicher, ob ich heute Mittag geblitzt worden bin. Wenn dem allerdings so sein sollte, dann war ich mit geschätzten knapp 80 bei erlaubten 50 km/h doch ziemlich schnell unterwegs. Jedoch war mir nicht bewusst, dass an dieser Stelle tatsächlich nur 50 km/h erlaubt sind. Daher musste ich das mal direkt recherchieren und bin dabei auf die folgenden interessanten Links gestoßen:

Auf der Suche nach einer Komponente / Bibliothek zur Ermittlung von Routen oder Distanzen zwischen zwei und mehreren Orten via OSM bin ich auf die beiden folgenden URLs gestoßen.

Es wird deutlich, dass es bereits mehrere Projekte gibt, die sich mit diesem Thema intensiv beschäftigen. Allerdings bleiben die nicht ganz unwesentlichen Fragen bezüglich Qualität und Handhabung noch zu klären.

12. January 2010 · Comments Off · Categories: OSM, Softwareentwicklung · Tags:

Die Klasse COSMCtrl ermöglicht die Verwendung der OpenStreetMap in eigenen MFC-basierten Anwendungen. Das Beispiel-Projekt ist Teil eines Workspaces vom 2008er-Studio. Getestet habe ich die Implementierung mit dem 2005er-Studio, sodass hier einige Anpassungen notwendig waren. Nichtsdestotrotz hat’s gut geklappt… und funktioniert wunderbar!

Link: http://www.naughter.com/osmctrl.html