![]() |
Edit_GetCueBannerText (Win XP)
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:
Nun lässt sich der Text bspw. so übergeben:
const
ECM_FIRST = $1500; EM_SETCUEBANNER = ECM_FIRST + 1; EM_GETCUEBANNER = ECM_FIRST + 2;
Delphi-Quellcode:
oder einfacher mit dem o.g. Makro
// var
// unicodechars : array[0..1024]of widechar; lstrcpyW(unicodechars,'Geben Sie hier etwas ein'); SendMessage(hEdit,EM_SETCUEBANNER,0,LPARAM(@unicodechars));
Delphi-Quellcode:
Das Makro muss man natürlich selbst deklarieren, wobei man aber auch nur die o.g. Nachricht aufruft und den Puffer übergibt.
Edit_SetCueBannerText(hEdit,'Geben Sie hier etwas ein');
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:
dann müsste die Funktion in Delphi so aussehen:
#define Edit_GetCueBannerText(hwnd, lpwText, cchText) \
(BOOL)SNDMSG((hwnd), EM_GETCUEBANNER, (WPARAM)(lpwText), (LPARAM)(cchText))
Delphi-Quellcode:
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:
function Edit_GetCueBannerText(hEdit: HWND; lpwText: PWideChar;
cchText: longint): bool; begin Result := Bool(SendMessage(hEdit,EM_GETCUEBANNER,WPARAM(lpwText), LPARAM(cchText))); end; Zitat:
Abgesehen davon funktioniert beides nicht. Es sei denn, ich habe irgendwo versehentlich einen Fehler eingebaut:
Delphi-Quellcode:
Die Frage ist jetzt: Bekommt das jemand zum Laufen?
// 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); Und wenn Ja: Wie? Zum Testen ist übrigens ein Manifest (Common Controls 6.0) notwendig. Gruß. |
Re: Edit_GetCueBannerText (Win XP)
Wie siehts denn aus, wenn du @unicodechars durch @unicodechars[0] ersetzt?
|
Re: Edit_GetCueBannerText (Win XP)
Das war ja nicht der Punkt. Mir ging es um den ganz offensichtlichen Unterschied zwischen dem, was im PSDK über die Nachricht "EM_GETCUEBANNER" gesagt wird, und dem, was das Makro "Edit_GetCueBannerText" macht.
Letzten Endes muss ich aber zugeben, dass das Auslesen für mich nicht unbedingt wichtig ist. Macht ja auch nicht viel Sinn. Dieser "cue text" dient ja dazu, dem Benutzer einen etwas freundlicheren Hinweis darüber zu geben, was er in das Eingabefeld schreiben soll. Auf jeden Fall besser als ein Tooltipp. :) Und das Eingabefeld gilt trotz des angezeigten Textes nach wie vor als leer. In dem Fall ist es wichtiger, einen solchen "cue text" zu schreiben als ihn wieder auszulesen. Aber dennoch Danke für dein Interesse. |
Re: Edit_GetCueBannerText (Win XP)
Stehe gerade vor demselben Problem.
Hat das inzwischen jemand hinbekommen? |
Re: Edit_GetCueBannerText (Win XP)
Stehe auch gerade vor dem Problem und es gibt definitiv keine Lösung mit dieser MessageID (EM_GETCUEBANNER = $1502), außerdem stimmt da was im PSDK nicht.
Also das hier kann einfach nicht richtig sein: Zitat:
Das sieht zwar Richtig aus, geht aber dennoch nicht, abgesehen davon, daß es mit obriger Definition nicht übereinstimmt. Zitat:
Hab auch schon alles versucht: wParam=0, lParam=Buffer wParam=BufferLen, lParam=Buffer wParam=Buffer, lParam=0 wParam=Buffer, lParam=BufferLen dann noch jeweils mit StringLen=Result und String=PWideChar(Buffer) + OK=BOOL(Result) Nichts geht. Der String müßte als WideString rauskommen, wird ja auch nur so bei EM_SETCUEBANNER übergeben, aber selbst wenn der als ANSI ausgegeben würde, sollte etwas im Buffer erscheinen. |
Re: Edit_GetCueBannerText (Win XP)
Dass die Deklarationen nicht passen, hatte ich bereits im Edit-Tutorial erwähnt, himi. Eine Lösung habe ich dafür aber auch noch nicht gefunden.
Ein kleines PS: Microsoft hat den Fehler im aktuellen Windows SDK inzwischen korrigiert. Seit wann, weiß ich nicht. Ich habe nicht mehr an die Sache gedacht und deswegen auch in den letzten Versionen nicht nachgeschaut. Mittlerweile ist die Deklaration also richtig: Zitat:
PPS: Du wirst es nicht glauben, unter Vista geht es. Ich habe gerade mal die "Edit_R2.dpr"-Demo aus den Tutorials erweitert, weil ich den Text auslesen wollte. Sowohl per Makro (Edit_GetCueBannerText), als auch per Nachricht. Unter XP bekomme ich nur ein simples "Error" (if-Prüfung, weil das Makro eine bool-Funktion ist) und eine leere MessageBox. Unter Vista sehe ich zweimal meinen, vorher mit "Edit_SetCueBannerText" eingetragenen Text. Möglicherweise ein Bug in XP? :gruebel: |
Re: Edit_GetCueBannerText (Win XP)
OK, deine erklärung hatte ich dann wohl wieder vergessen.
Ein XP-Bug könnte gut sein ... ist ja auch erst da eingeführt wurden. Und ich hatte auch schon einiges Werte für EM_GETCUEBANNER probiert, so wie z.B. ECM_FIRST + 0. Konnte aber nirgends was finden -.-'' Also wenn der Fehler in Zukunft weg ist, dann werd ich die Funktion bei mir wieder freigeben ... hatte die wegen des Nichtzunktionierens auskommentiert ._. |
Re: Edit_GetCueBannerText (Win XP)
Ich muss mal ganz ehrlich fragen: Wozu braucht man das? Den Text setzen, ja, das macht Sinn. :stupid: Der User wird informiert, was er wo eintippen muss, das Eingabefeld ist trotzdem leer, und du sparst dir einen Tooltip o.ä. Aber warum sollte man diesen Text wieder auslesen wollen? :gruebel:
|
Re: Edit_GetCueBannerText (Win XP)
In der VCL (Delphi) ist das ja kein Problem, die speichert alles zwischen und gibt nur das Setzen an Controls weiter, aber ich hab mal angefangen mir ein paar eigene Klassen zu basteln, ohne Zwischenspeicher (außer dem Control-Handle wird nichts in der Klasse gespeichert).
Und da es nunmal hierfür auch einen Getter gibt, welcher den text also wieder aus dem Control holen muß, wird es halt gebraucht. |
Re: Edit_GetCueBannerText (Win XP)
Ah! Okay. :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz