What happened to the Messenger Plus! forums on msghelp.net?
Shoutbox » MsgHelp Archive » Messenger Plus! for Live Messenger » Scripting » [REQU] Patchou PlusWnd::Combo_GetItemText not exist why?

Pages: (2): « First « 1 [ 2 ] Last »
[REQU] Patchou PlusWnd::Combo_GetItemText not exist why?
Author: Message:
CookieRevised
Elite Member
*****

Avatar

Posts: 15519
Reputation: 173
– / Male / Flag
Joined: Jul 2003
Status: Away
RE: [REQU] Patchou PlusWnd::Combo_GetItemText not exist why?
code:
function cb_GetItem(w,d,n){
        var CB_GETCOUNT = 0x146
        var CB_GETLBTEXT = 0x148
        var CB_GETLBTEXTLEN = 0x149
        var t = w.SendControlMessage(d,CB_GETCOUNT, 0, 0)
        //Debug.Trace("Total= " +t)
        for(var i=0; i < t; i++) {
                var length = w.SendControlMessage(d, CB_GETLBTEXTLEN, i, 0)
                var Data = Interop.Allocate((length * 2) + 2)
                if (i == n) {
                        Interop.Call("user32", "SendMessageW", w.GetControlHandle(d), CB_GETLBTEXT, i, Data);
                        //w.SendControlMessage(d,CB_GETLBTEXT,i,Data) not work
                        return Data.ReadString(0)
                }
        }
}
- You don't need the loop.
- Inside the loop you don't need to check if the index is the same as the parameter
- w.SendControlMessage(d,CB_GETLBTEXT,i,Data) does not work because you need to give a pointer to the Data object, not the object itself: w.SendControlMessage(d,CB_GETLBTEXT,i,Data.DataPtr)

The above code can be done way shorter and much faster:
code:
function Combo_GetItemText2(pPlusWnd, sControlId, nItemIdx) {
        if (nItemIdx >= 0 && nItemIdx <= pPlusWnd.Combo_GetCount(sControlId)) {
                var nLength = pPlusWnd.SendControlMessage(sControlId, 0x149 /* CB_GETLBTEXTLEN */, nItemIdx, 0);
                var Buffer = Interop.Allocate(nLength * 2 + 2);
                pPlusWnd.SendControlMessage(sControlId, 0x148 /* CB_GETLBTEXT */, nItemIdx, Buffer.DataPtr);
                return Buffer.ReadString(0)
        } else {
                return ''
        }
}
And this can be made even more shorter and faster:
code:
function Combo_GetItemText(pPlusWnd, sControlId, nItemIdx) {
        var hControl = pPlusWnd.GetControlHandle(sControlId);
        var nLength = Interop.Call("User32", "SendMessageW", hControl, 0x149 /* CB_GETLBTEXTLEN */, nItemIdx, 0);
        var Buffer = Interop.Allocate(nLength * 2 + 3);
        Interop.Call("User32", "SendMessageW", hControl, 0x148 /* CB_GETLBTEXT */, nItemIdx, Buffer.DataPtr);
        return Buffer.ReadString(0);
}


quote:
Originally posted by Flash
its possible this way
code:
cb_GetItem(ww,"cbc",0) -> ww.cb_GetItem("cbc",0)
??
no


-------------------------------------------------------------------------------------------

PS: please do not make double posts. Double posting is posting more than once in a short time while nobody else made a reply. Read the forum rules.

This post was edited on 06-29-2007 at 12:06 AM by CookieRevised.
.-= A 'frrrrrrrituurrr' for Wacky =-.
06-29-2007 12:04 AM
Profile PM Find Quote Report
felipEx
Scripting Contest Winner
***


Posts: 378
Reputation: 24
35 / Male / Flag
Joined: Jun 2006
RE: [REQU] Patchou PlusWnd::Combo_GetItemText not exist why?
heheh Mr. CookieRevised :O
i has this code:

code:
function Combo_Text(PlusWnd, ControlId, Index){
    var CB_GETCOUNT = 0x146;
    var CB_GETLBTEXT = 0x148;
    var CB_GETLBTEXTLEN = 0x149;
    var CB_GETCURSEL = 0x147;
   
    if (!Index) Index = Interop.Call("user32", "SendMessageW", PlusWnd.GetControlHandle(ControlId), CB_GETCURSEL, 0, 0);
    if (Index < 0)    return "";
   
   
      var Data = Interop.Allocate((  Interop.Call("user32", "SendMessageW", PlusWnd.GetControlHandle(ControlId), CB_GETLBTEXTLEN, Index, 0)  * 2) + 2);
PlusWnd.GetControlHandle(ControlId), CB_GETLBTEXT, Index, Data);
      return Data.ReadString(0);
}


Edit.. Ohh..  you've posted before me :D (Combo_GetItemText is better hehe , nice job ^^)

This post was edited on 06-29-2007 at 05:02 PM by felipEx.
06-29-2007 12:20 AM
Profile E-Mail PM Find Quote Report
CookieRevised
Elite Member
*****

Avatar

Posts: 15519
Reputation: 173
– / Male / Flag
Joined: Jul 2003
Status: Away
RE: [REQU] Patchou PlusWnd::Combo_GetItemText not exist why?
I think you mean:
quote:
code:
Interop.Call("user32", "SendMessageW", PlusWnd.GetControlHandle(ControlId), CB_GETLBTEXT, Index, Data);

otherwise that code, as you showed it here, doesn't make any sense at all as it is missing a big part at the beginning...

And... (when that part would have been there), your code:

- will not return the proper text for the first item in the list because of if(!Index). This is not the proper way to handle an optional parameter. If Index is 0, to get the first item of the list, then (!Index) will be -1, aka True and thus the selected item will be returned instead of the first item in the list.
To check if an optional parameter is used or not you need to do: if (typeof(myvariable) === 'undefined')

- will go bananas when you give a too high index as a parameter because CB_GETLBTEXTLEN and other messages will return CB_ERR in that case and your datablock will have a bad length.

- will go bananas when nothing is selected in the list and you request the selected item because the new Index will be CB_ERR in that case.



If you use my snippets you wont have those problems and it would also be faster.
Here is that last and shortest snippet again, but with the addition of the optional index so that you can get the current selected item also (=addition of the second line):
code:
function Combo_GetItemText(pPlusWnd, sControlId, nItemIdx) {
        var hControl = pPlusWnd.GetControlHandle(sControlId);
        if (typeof(nItemIdx) === 'undefined') nItemIdx = Interop.Call("User32", "SendMessageW", hControl, 0x147 /* CB_GETCURSEL */, 0, 0);
        var nLength = Interop.Call("User32", "SendMessageW", hControl, 0x149 /* CB_GETLBTEXTLEN */, nItemIdx, 0);
        var Buffer = Interop.Allocate(nLength * 2 + 3);
        Interop.Call("User32", "SendMessageW", hControl, 0x148 /* CB_GETLBTEXT */, nItemIdx, Buffer.DataPtr);
        return Buffer.ReadString(0);
}

;)

This post was edited on 06-29-2007 at 01:23 AM by CookieRevised.
.-= A 'frrrrrrrituurrr' for Wacky =-.
06-29-2007 12:39 AM
Profile PM Find Quote Report
Flash
Junior Member
**

Avatar
All time Ready

Posts: 86
Reputation: 2
44 / Male / Flag
Joined: Aug 2006
O.P. RE: [REQU] Patchou PlusWnd::Combo_GetItemText not exist why?
good job cookie
My script: Psdp
06-29-2007 02:48 AM
Profile PM Find Quote Report
Pages: (2): « First « 1 [ 2 ] Last »
« Next Oldest Return to Top Next Newest »


Threaded Mode | Linear Mode
View a Printable Version
Send this Thread to a Friend
Subscribe | Add to Favorites
Rate This Thread:

Forum Jump:

Forum Rules:
You cannot post new threads
You cannot post replies
You cannot post attachments
You can edit your posts
HTML is Off
myCode is On
Smilies are On
[img] Code is On