Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#1

Edit_GetCueBannerText (Win XP)

  Alt 10. Nov 2003, 15:15
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ß.
  Mit Zitat antworten Zitat