Scheinbar macht das Befüllen des CListControl Schwierigkeiten, da der CString
des CAdresse-Namens nicht in 'LPSTR' konvertiert werden kann. Die Lösung hierzu
bringt folgendes Makro (ein Feature der MFC 7, dank an die FH für das Upgrade):
LPTSTR szr = CA2T(adr->getName() );
lvItem.pszText = szr;
Erklärung: "LP" steht für Pointer, "STR" für String (ach nee...). Und das dazwischen
kann den Wert "A" (ANSI character string), "W" (Unicode character string) und "T"
(Generic character string (equivalent to W when _UNICODE is defined, equivalent to A otherwise) ) annehmen.
CString erlaubt nur Konvertierungen nach LPTCSTR ("C" = constant), wir brauchen hier aber
einen editierbaren Buffer. Deshalb gibt es diverse Kopiermakros,
die einen PXSTR String (das X steht für A, W oder T und ist der ominöse Operator "PXSTR" in der Klasse
CString) in einen anderen String in einem anderen Charset kopieren können.
Da wir im Default Unicode nicht aktiviert haben, können wir den Ansi-String "Name"
in einem generischen String kopieren (mittels "CA2T"), diesen wiederum können wir ins
LVITEM packen.
Problem bei obigem Beispiel: Klappt nur bis zu einer Länge von 128 Zeichen. Abhilfe schafft
das Makro "CA2TEX", dem wir als Template-Parameter eine Maximallänge (leider konstanter Wert)
übergeben können.
LPTSTR szr = CA2TEX<1024>(adr->getName() );
Nach cleverer geht es, wenn wir die Klasse "CA2T" verwenden, die einen String kapselt.
CA2T pszA( adr->getName() );
lvItem.pszText = pszA;
Der Tooltip zu CA2T verrät folgendes "#define CA2T CA2W", d.h. intern wird auf Unicode umgestellt.
Die Doku findet man Inhalt-Baum an dieser Stelle:
MSDN Library 2003: "Visual Studio .NET" / "Visual C++" / "Referenz" / "Visual C++ Libraries" /
"ATL Refrence" / "ATL Macros" / "String Conversion Macros"
MSDN Library Januar 2005: "MSDN Library-January 2005" / "Development Tools and Languages" / "Visual Studio .NET" / "Product Documentation" /
"Visual C++" / "Reference" / "Visual C++ Libaries" / "ATL Reference" / "ATL Macros" /
"ATL Macros Alphabetical Reference" / "ATL and MFC String Conversion Macros"
Noch einfacher geht es mittels Typecasts (dass ein CString nur einen konstanten String
zurückgeben kann stört ja nicht, wenn man diesen einfach in einen modifizierbaren String casten kann):
lvItem.pszText = (LPSTR) (LPCTSTR) adr->getName();