October 31, 2025, 11:49:25 AM

News:

Own IWBasic 2.x ? -----> Get your free upgrade to 3.x now.........


Richedit streamin

Started by King64, June 18, 2009, 02:19:43 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

King64

Hi guys. I ported in ebasic some codes from a cprogramming post about richedit streamin:
http://cboard.cprogramming.com/windows-programming/54701-rich-edit.html
and that's my code:

$INCLUDE "windows.inc"
TYPE EDITSTREAM
  UINT dwCookie   
  UINT dwError     
  UINT pfnCallback
ENDTYPE

CONST SF_TEXT = 1
CONST EM_STREAMIN = WM_USER + 73

FILE   file1
DIALOG d1
STRING filename,filter

filter = "TXT file (*.txt)|*.txt||"
CREATEDIALOG d1,0,0,587,360,0x80C80080,0,"Rich Edit demo",&Handler
CONTROL d1,@RICHEDIT,"",7,35,570,294,0x50B010C4,1
DOMODAL d1
END
SUB Handler
SELECT @MESSAGE
CASE @IDINITDIALOG
CENTERWINDOW d1
BEGINMENU d1
MENUTITLE "File"
MENUITEM "Save",0,6
MENUITEM "Load",0,7
SEPARATOR
MENUITEM "Quit",0,1
ENDMENU
CASE @IDMENUPICK
SELECT @MENUNUM
CASE 1:'Quit
CLOSEDIALOG d1,@IDOK
CASE 6:'SAVE
filename = FILEREQUEST("Save file",d1,0,filter,"rtf")
if(len(filename))
if(OPENFILE(file1,filename,"W")=0)
CONTROLCMD d1,1,@RTSAVE,file1,1
CLOSEFILE file1
endif
endif
CASE 7:'LOAD
filename = FILEREQUEST("Load file",d1,1,filter,"txt")
if(len(filename))
reLoadFile(filename)
endif
ENDSELECT
ENDSELECT
RETURN
ENDSUB


SUB StreamIn(hFile:INT,buffer:POINTER,cb:INT,pcb:POINTER),INT

POINTER p

p=NULL
RETURN _ReadFile(hFile,buffer,cb,pcb,#<OVERLAPPED>p)

ENDSUB


SUB reLoadFile(fname:STRING)

INT hFile
EDITSTREAM es

hFile = _CreateFile(fname,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)
IF hFile<>INVALID_HANDLE_VALUE
es.dwCookie = hFile
es.dwError=0
es.pfnCallback = &StreamIn
SENDMESSAGE d1,EM_STREAMIN,SF_TEXT,es,1
SENDMESSAGE d1,EM_SETMODIFY,FALSE,0,1
ENDIF
_CloseHandle(hFile)
RETURN

ENDSUB

But that's not work  ??? . Any idea ? Thanks in advance for the answers  :)

Ionic Wind Support Team

You can load a rich edit directly by reading the users guide.

See Windows Programming -> Controls -> Using Rich Edit Controls.

Specifically the part about:

return = CONTROLCMD (window | dialog, ID, @RTSAVE, FILE | STRING, type)
and
return = CONTROLCMD (window | dialog, ID, @RTLOAD, FILE | STRING, type)

;)

Paul.
Ionic Wind Support Team

King64

Hi Paul, I know that way. I'm interested to understand how to load a file in a richedit control via API.  :)
The code works well on a C compiler, not when i translate it on EBasic.  What's wrong ?  ???

Ionic Wind Support Team

Whoever wrote the original wrote it wrong then ;)

You need to return 0 from the callback function, not the return of _ReadFile for one.   The 1st parameter for the callback is wrong, it is a pointer that points to the es variable that you send in the SendMessage command, which you need to dereference to get the file handle from.  Your are dereferencing a NULL pointer in the callback, you should just be passing NULL to _ReadFile.  But I am assuming you used windows.inc which has the last parameter declared wrong.

The correct declare is

DECLARE IMPORT,ReadFile(hFile as UINT,lpBuffer as POINTER,nNumberOfBytesToRead as UINT,lpNumberOfBytesRead as POINTER,lpOverlapped as POINTER)

There may be other problems with the code, but that is just from looking at it.

Paul.





Ionic Wind Support Team

Ionic Wind Support Team

Actually it was your interpretation of the original that was wrong.

DWORD_PTR dwCookie

Is a pointer to a dword.  Which is technically incorrect but works because the C code does this:

HANDLE hFile = (HANDLE) dwCookie;

The address of the first element of a structure (udt) is the same as the udt itself.  The (HANDLE) typecasts the pointer to a UINT.

Again I have to ask, why not use the built in functionality?  The code is the same and will work with any rich edit control, even if you create the control with CreateWindowEx.

Paul.
Ionic Wind Support Team

King64

Thank you Paul . Yes, i made some mistakes porting the code in EBasic. Now it works.  ;D
Now i changed the declaration in windows.inc

DECLARE IMPORT, _ReadFile ALIAS ReadFile(hFile AS INT,lpBuffer AS POINTER,nNumberOfBytesToRead AS INT,lpNumberOfBytesRead AS POINTER,lpOverlapped AS OVERLAPPED),INT

with

DECLARE IMPORT, _ReadFile ALIAS ReadFile(hFile AS INT,lpBuffer AS POINTER,nNumberOfBytesToRead AS INT,lpNumberOfBytesRead AS POINTER,lpOverlapped AS POINTER),INT

and the code

$INCLUDE "windows.inc"
TYPE EDITSTREAM
  POINTER dwCookie   
  UINT dwError     
  POINTER pfnCallback
ENDTYPE

CONST SF_TEXT = 1
CONST EM_STREAMIN = WM_USER + 73

FILE   file1
DIALOG d1
STRING filename,filter

filter = "TXT file (*.txt)|*.txt||"
CREATEDIALOG d1,0,0,587,360,0x80C80080,0,"Rich Edit demo",&Handler
CONTROL d1,@RICHEDIT,"",7,35,570,294,0x50B010C4,1
DOMODAL d1
END
SUB Handler
SELECT @MESSAGE
CASE @IDINITDIALOG
CENTERWINDOW d1
BEGINMENU d1
MENUTITLE "File"
MENUITEM "Save",0,6
MENUITEM "Load",0,7
SEPARATOR
MENUITEM "Quit",0,1
ENDMENU
CASE @IDMENUPICK
SELECT @MENUNUM
CASE 1:'Quit
CLOSEDIALOG d1,@IDOK
CASE 6:'SAVE
filename = FILEREQUEST("Save file",d1,0,filter,"rtf")
if(len(filename))
if(OPENFILE(file1,filename,"W")=0)
CONTROLCMD d1,1,@RTSAVE,file1,1
CLOSEFILE file1
endif
endif
CASE 7:'LOAD
filename = FILEREQUEST("Load file",d1,1,filter,"txt")
if(len(filename))
reLoadFile(filename)
endif
ENDSELECT
ENDSELECT
RETURN
ENDSUB


SUB StreamIn(dwCookie:POINTER,buffer:POINTER,cb:INT,pcb:POINTER),INT

UINT hfile

hfile=#<UINT>dwCookie
_ReadFile(hfile,buffer,cb,pcb,NULL)
RETURN 0

ENDSUB


SUB reLoadFile(fname:STRING)

UINT hFile
EDITSTREAM es

hFile = _CreateFile(fname,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)
IF hFile<>INVALID_HANDLE_VALUE
es.dwCookie = &hFile
es.dwError=0
es.pfnCallback = &StreamIn
SENDMESSAGE d1,EM_STREAMIN,SF_TEXT,es,1
SENDMESSAGE d1,EM_SETMODIFY,FALSE,0,1
ENDIF
_CloseHandle(hFile)
RETURN

ENDSUB

:)

Let me know for eventual mistakes or suggestions.  ;)

sapero

Paul, maybe this is a oftopic, but please look at the attached image. I'm using IE6 from XPSP3

Ionic Wind Support Team

Looks fine in IE7 on SP3.  So either it was an IE bug that was corrected, or a SMF bug that doesn't affect IE7 and above.

Paul.
Ionic Wind Support Team