Hallo.
Ich habe ein kleines Rätsel, das gelöst werden muss.
Unter Win XP gibt es die Möglichkeit, mit "EM_SETCUEBANNER" bzw. dem Makro "Edit_SetCueBannerText" einen grau dargestellten Text in ein Editfeld zu schreiben. Das ist aus der Suchfunktion im Explorer bekannt: Dort, wo man den Text reinschreiben kann, der
in den gesuchten Dateien enthalten sein soll, steht standardmäßig
Geben Sie in der Datei enthaltene Worte ein.
Um die Funktion nutzen zu können, benötigt man (zumindest für alte Delphi-Versionen) folgende Deklarationen:
Delphi-Quellcode:
const
ECM_FIRST = $1500;
EM_SETCUEBANNER = ECM_FIRST + 1;
EM_GETCUEBANNER = ECM_FIRST + 2;
Nun lässt sich der Text bspw. so übergeben:
Delphi-Quellcode:
// var
// unicodechars : array[0..1024]of widechar;
lstrcpyW(unicodechars,'Geben Sie hier etwas ein');
SendMessage(hEdit,EM_SETCUEBANNER,0,LPARAM(@unicodechars));
oder einfacher mit dem o.g. Makro
Edit_SetCueBannerText(hEdit,'Geben Sie hier etwas ein');
Das Makro muss man natürlich selbst deklarieren, wobei man aber auch nur die o.g. Nachricht aufruft und den Puffer übergibt.
So weit, so gut.
Nun soll man den Text aber auch mit EM_GETCUEBANNER bzw. "Edit_GetCueBannerText" auslesen können. Und da geht das Rätsel los. Wenn ich mich nach der Vorlage in der "CommCtrl.h" (s.
PSDK) richte
Code:
#define Edit_GetCueBannerText(hwnd, lpwText, cchText) \
(BOOL)SNDMSG((hwnd), EM_GETCUEBANNER, (WPARAM)(lpwText), (LPARAM)(cchText))
dann müsste die Funktion in Delphi so aussehen:
Delphi-Quellcode:
function Edit_GetCueBannerText(hEdit: HWND; lpwText: PWideChar;
cchText: longint): bool;
begin
Result := Bool(SendMessage(hEdit,EM_GETCUEBANNER,WPARAM(lpwText),
LPARAM(cchText)));
end;
Richtig? (Jetzt mal abgesehen davon, dass ich "hEdit" und nicht "hwnd" benutzt habe.) Schaut man aber ins
PSDK, dann findet man unter EM_GETCUEBANNER die folgende Beschreibung:
Zitat von
PSDK (EM_GETCUEBANNER):
Parameters
wParam
Not used; must be zero.
lParam
Pointer to a
Unicode string that receives the text set as the textual cue.
So, und damit bin ich verwirrt.
Abgesehen davon funktioniert beides nicht. Es sei denn, ich habe irgendwo versehentlich einen Fehler eingebaut:
Delphi-Quellcode:
// var
// iLen : longint;
// laut PSDK:
ZeroMemory(@unicodechars,sizeof(unicodechars));
SendMessage(hEdit1,EM_GETCUEBANNER,0,LPARAM(@unicodechars));
MessageBoxW(wnd,unicodechars,
nil,0);
// laut "CommCtrl.h"-Makro
ZeroMemory(@unicodechars,sizeof(unicodechars));
iLen := sizeof(unicodechars);
SendMessage(hEdit1,EM_GETCUEBANNER,WPARAM(@unicodechars),LPARAM(iLen));
MessageBoxW(wnd,unicodechars,
nil,0);
// spaßeshalber mal umgedreht, hätte ja sein können ...
ZeroMemory(@unicodechars,sizeof(unicodechars));
iLen := sizeof(unicodechars);
SendMessage(hwndEdit1,EM_GETCUEBANNER,WPARAM(iLen),LPARAM(@unicodechars));
MessageBoxW(wnd,unicodechars,
nil,0);
Die Frage ist jetzt: Bekommt das jemand zum Laufen?
Und wenn Ja: Wie?
Zum Testen ist übrigens ein Manifest (Common Controls 6.0) notwendig.
Gruß.