Hello, again. >Well, I am quite sure I read somewhere that the handles should be locked >before calling that function. If so, you'd better call FN MOVEHHI before lock the handle. You know, what the hadle is, and the deffernce between handle and pointer. The reason why we use handle is that handle is relocatable. You must lock it when toolbox call ask the pointer, or when you do not want it moved. The following codes are my long string data solution. If err, return NIL handle. We don't have to check err every time, at least, and at last, only chech the handle is nil or not. (If nil, we got an err.) LOCAL FN disposeh(hndl&) DIM state% LONG IF hndl& state% = FN HGETSTATE(hndl&) LONG IF state% AND _resource% CALL RELEASERESOURCE(hndl&) XELSE DEF DISPOSEH(hndl&) END IF hndl& = _nil END IF END FN = hndl& LOCAL FN handNnum(hndl&,num%) DIM osErr% DIM size& DIM state% LONG IF hndl&<>_nil state% = FN HGETSTATE(hndl&) size& = FN GETHANDLESIZE(hndl&) osErr% = FN HUNLOCK(hndl&) osErr% = FN SETHANDLESIZE(hndl&,size&+2) LONG IF osErr%=_noErr osErr% = FN HLOCK(hndl&) % [hndl&],num% osErr% = FN HSETSTATE(hndl&,state%) XELSE hndl& = FN disposeh(hndl&) END IF END IF END FN = hndl& LOCAL FN handNlnum(hndl&,num&) DIM osErr% DIM size& DIM state% LONG IF hndl&<>_nil state% = FN HGETSTATE(hndl&) size& = FN GETHANDLESIZE(hndl&) osErr% = FN HUNLOCK(hndl&) osErr% = FN SETHANDLESIZE(hndl&,size&+4) LONG IF osErr%=_noErr osErr% = FN HLOCK(hndl&) & [hndl&],num& osErr% = FN HSETSTATE(hndl&,state%) XELSE hndl& = FN disposeh(hndl&) END IF END IF END FN = hndl& LOCAL FN handNstr(hndl&,txt$) DIM osErr% DIM size& DIM state% LONG IF hndl&<>_nil state% = FN HGETSTATE(hndl&) size& = FN GETHANDLESIZE(hndl&) osErr% = FN HUNLOCK(hndl&) osErr% = FN SETHANDLESIZE(hndl&,size&+LEN(txt$)) LONG IF osErr%=_noErr osErr% = FN HLOCK(hndl&) BLOCKMOVE @txt$+1,[hndl&]+size&,LEN(txt$) osErr% = FN HSETSTATE(hndl&,state%) XELSE hndl& = FN disposeh(hndl&) END IF END IF END FN = hndl& LOCAL FN strNhand(hndl&,txt$) DIM osErr% DIM size& DIM state% LONG IF hndl&<>_nil state% = FN HGETSTATE(hndl&) size& = FN GETHANDLESIZE(hndl&) osErr% = FN HUNLOCK(hndl&) osErr% = FN SETHANDLESIZE(hndl&,size&+LEN(txt$)) LONG IF osErr%=_noErr osErr% = FN HLOCK(hndl&) BLOCKMOVE [hndl&],[hndl&]+LEN(txt$),size& BLOCKMOVE @txt$+1,[hndl&],LEN(txt$) osErr% = FN HSETSTATE(hndl&,state%) XELSE hndl& = FN disposeh(hndl&) END IF END IF END FN = hndl& LOCAL FN handNhand(aHndl&,bHndl&) DIM osErr% DIM aState%,bState% LONG IF aHndl&<>_nil AND bHndl&<>_nil aState% = FN HGETSTATE(aHndl&) bState% = FN HGETSTATE(bHndl&) osErr% = FN HUNLOCK(aHndl&) osErr% = FN HUNLOCK(bHndl&) osErr% = FN HANDANDHAND(aHndl&,bHndl&) LONG IF osErr% = _noErr osErr% = FN HSETSTATE(bHndl&,bState%) XELSE 'out of mem bHndl& = FN disposeh(bHndl&) END IF osErr% = FN HSETSTATE(aHndl&,aState%) END IF END FN = bHndl& LOCAL FN getItem(hndl&,item%,delimiter$) DIM osErr% DIM count%,sOfs&,eOfs&,size&,delLen% DIM newHndl&,state% newHndl& = _nil LONG IF hndl&<>_nil size& = FN GETHANDLESIZE(hndl&) delLen% = LEN(delimiter$) count% = 0 eOfs& = -delLen% DO INC(count%) sOfs& = eOfs&+delLen% LONG IF sOfs&<=size& eOfs& = FN MUNGER(hndl&,sOfs&,@delimiter$+1,delLen%,_nil,_nil) XELSE eOfs& = -1 END IF UNTIL count%=item% OR eOfs&<0 LONG IF count%=item% AND eOfs&<0 AND item%<>1 eOfs& = size& END IF LONG IF eOfs&>=0 size& = eOfs&-sOfs& newHndl& = FN NEWHANDLE(size&) LONG IF newHndl&<>_nil state% = FN HGETSTATE(hndl&) osErr% = FN HLOCK(hndl&) osErr% = FN HLOCK(newHndl&) BLOCKMOVE [hndl&]+sOfs&,[newHndl&],size& osErr% = FN HUNLOCK(newHndl&) osErr% = FN HSETSTATE(hndl&,state%) END IF END IF END IF END FN = newHndl& LOCAL FN pickUp(hndl&,s$,e$) DIM temp&,result& temp& = FN getItem(hndl&,2,s$) result& = FN getItem(temp&,1,e$) temp& = FN disposeh(temp&) END FN = result& LOCAL FN replaceSS(hndl&,s$,t$) DIM osErr% DIM offset& DIM state% LONG IF hndl&<>_nil AND LEN(s$)>0 offset& = 0 state% = FN HGETSTATE(hndl&) osErr% = FN HUNLOCK(hndl&) DO offset& = FN MUNGER(hndl&,offset&,@s$+1,LEN(s$),@t$+1,LEN(t$)) UNTIL offset&<0 osErr% = FN HSETSTATE(hndl&,state%) END IF END FN LOCAL FN replaceSH(hndl&,s$,tHndl&) DIM osErr% DIM offset& DIM state% DIM tSize&,tState% LONG IF hndl&<>_nil AND LEN(s$)>0 AND tHndl&<>_nil offset& = 0 state% = FN HGETSTATE(hndl&) osErr% = FN HUNLOCK(hndl&) tSize& = FN GETHANDLESIZE(tHndl&) tState% = FN HGETSTATE(tHndl&) osErr% = FN HLOCK(tHndl&) DO offset& = FN MUNGER(hndl&,offset&,@s$+1,LEN(s$),[tHndl&],tSize&) UNTIL offset&<0 osErr% = FN HSETSTATE(hndl&,state%) osErr% = FN HSETSTATE(tHndl&,tState%) END IF END FN LOCAL FN str2hand(t$) DIM osErr% DIM hndl& hndl& = FN NEWHANDLE(LEN(t$)) LONG IF hndl& osErr% = FN HLOCK(hndl&) BLOCKMOVE @t$+1,[hndl&],LEN(t$) osErr% = FN HUNLOCK(hndl&) END IF END FN = hndl& LOCAL FN hand2str$(hndl&,maxLen%) DIM osErr% DIM t$,size&,state% t$ = "" LONG IF hndl&<>_nil IF maxLen%>255 THEN maxLen% = 255 size& = FN GETHANDLESIZE(hndl&) IF size&>maxLen% THEN size& = maxLen% state% = FN HGETSTATE(hndl&) osErr% = FN HLOCK(hndl&) BLOCKMOVE [hndl&],@t$+1,size& POKE @t$,size& osErr% = FN HSETSTATE(hndl&,state%) END IF END FN = t$ ************************************************************ * Osamu Shigematsu * * mail: shige@... / a1297991@... * * homepage : http://www.ravi.ne.jp/FBII/ * ************************************************************