Page 1 sur 1
Limite EditorGadget
Publié : mer. 29/juin/2005 22:56
par LavaLava
Bonsoir,
J'aimerais connaitre les limites de stockage d'un editorgadget et comment on peut les modifier ...
J'essaye d'afficher un gros fichier texte (1Mo) dans un editorgadget et cela plante.
J'ai essayer avec AddGadgetItemText et par transfert de memoire ...
Merci
Publié : jeu. 30/juin/2005 8:04
par bernard13
bonjour
essaye ça
ca permet de definir la limite de taille d'un fichier a charger
Code : Tout sélectionner
Procedure LireFichier(Gagdet.l, Fichier.s)
Size = FileSize(Fichier)
Longueur = Size : Decalage = 0
L_Max = 63999
If Size > 0
If ReadFile(0,Fichier)
*Buffer = AllocateMemory(Size)
If *Buffer
ReadData(*Buffer, Size)
EndIf
CloseFile(0)
EndIf
If Longueur > L_Max
Repeat
Chaine.s = PeekS(*Buffer + Decalage, L_Max)
AddGadgetItem(gadget,-1,Chaine)
Longueur = Longueur - L_Max : Decalage = Decalage + L_Max
Until Longueur < L_Max
Chaine = PeekS(*Buffer + Decalage,Longueur)
AddGadgetItem(gadget,-1,Chaine)
Else
Chaine.s = PeekS(*Buffer,Longueur)
AddGadgetItem(gadget,-1,Chaine)
EndIf
FreeMemory(*Buffer)
EndIf
EndProcedure
Publié : jeu. 30/juin/2005 13:59
par LavaLava
Apparament ca marche !
Par contre je ne comprends pas pourquoi ?
Je faissais la même procedure que toi, au fractionnement prés.
Je sais que le PB ne gére pas d'origine les chaines supérieure à 64K, mais l'editorgadger n'est il pas juste un appel d'un api windows ?
En tout cas merci, car je n'aurais jamais pensé à ça ...
Re: Limite EditorGadget
Publié : jeu. 30/juin/2005 16:13
par gnozal
LavaLava a écrit :Bonsoir,
J'aimerais connaitre les limites de stockage d'un editorgadget et comment on peut les modifier ...
J'essaye d'afficher un gros fichier texte (1Mo) dans un editorgadget et cela plante.
J'ai essayer avec AddGadgetItemText et par transfert de memoire ...
Merci
Pour charger un gros fichier texte (ou le sauvegarder) avec un EditorGadget (contrôle RichEdit), je pense que les streams sont plus performants.
Regardez dans Win32.hlp, les messages EM_STREAMIN et EM_STREAMOUT.
Il y a des exemples pratiques dans les sources de l'ancien éditeur Purebasic sur le site
http://cvs.purebasic.com/
Publié : jeu. 30/juin/2005 16:19
par gnozal
LavaLava a écrit :Je sais que le PB ne gére pas d'origine les chaines supérieure à 64K, mais l'editorgadger n'est il pas juste un appel d'un api windows ?
Oui, c'est un contrôle RichEdit.
Mais les fonctions AddGadgetItem() ou SetGadgetText() par exemple utilisent des chaines...
Publié : jeu. 30/juin/2005 16:49
par Progi1984
Quel est alors la différence entre une chaine et un stream ?
Publié : jeu. 30/juin/2005 16:58
par gnozal
Progi1984 a écrit :Quel est alors la différence entre une chaine et un stream ?
Avec les messages EM_STREAMIN/OUT, le RichEdit utilise une zone mémoire (indépendante de la gestion des chaines de purebasic) via un callback pour charger ou sauvegarder son contenu.
The EM_STREAMIN message replaces the contents of a rich edit control with the specified data stream.
EM_STREAMIN
wParam = (WPARAM) (UINT) uFormat;
lParam = (LPARAM) (EDITSTREAM FAR *) lpStream;
Parameters
uFormat
One of the following data formats:
Value Meaning
SF_TEXT Text
SF_RTF Rich Text Format (RTF)
Both data formats may be combined with the SFF_SELECTION flag. If the SFF_SELECTION flag is specified, the stream replaces the contents of the current selection. Otherwise, the stream replaces the entire contents of the control.
The SF_RTF format may be combined with the SFF_PLAINRTF flag. If the SFF_PLAINRTF flag is specified, language-specific RTF keywords in the stream are ignored. Only keywords common to all languages are streamed in.
lpStream
Pointer to an EDITSTREAM structure. The control reads (streams in) the data by repeatedly calling the function specified by the structure's pfnCallback member.
Return Values
Returns the number of characters read.
The EDITSTREAM structure contains information about a data stream used with a rich edit control.
typedef struct _editstream {
DWORD dwCookie;
DWORD dwError;
EDITSTREAMCALLBACK pfnCallback;
} EDITSTREAM;
Members
dwCookie
Application-defined value that is passed to the callback function.
dwError
Error encountered while streaming. If there was no error, this member is zero.
pfnCallback
Pointer to an application-defined function that the control calls to transfer data.
This structure is used with the EM_STREAMIN message to read (stream in) data into a rich edit control, replacing its contents. It is used with the EM_STREAMOUT message to write (stream out) the contents of a rich edit control.
The control calls the callback function repeatedly, transferring a portion of the data with each call. The callback function has the following form:
DWORD CALLBACK EditStreamCallback(DWORD dwCookie,
LPBYTE pbBuff, LONG cb, LONG FAR *pcb);
dwCookie
Value of the dwCookie member of the EDITSTREAM structure.
pbBuff
Pointer to the buffer to read from or write to.
cb
Count of bytes to read or write.
pcb
Pointer to a variable that receives the number of bytes actually read or written.
Return Value
The return value is zero to continue to the stream operation, or nonzero to abort it.
Un conseil : jetez un coup d'oeil aux sources de l'ancien éditeur. On y apprend plein de choses ...
Publié : jeu. 30/juin/2005 22:32
par LavaLava
@gnozal
Effectivement, si pour le chargement cela passe, pour l'enregistrement du contenu de l'editor vers un fichier c'est pire qu'un âne mort ....
Je suis completement largué avec les em_stream ...
N'aurais tu pas un exemple ?
Merci
Publié : ven. 01/juil./2005 8:01
par gnozal
LavaLava a écrit :N'aurais tu pas un exemple ?
Merci
Je ne suis pas sur mon PC là, mais après une recherche STREAM + RICHEDIT sur le forum allemand, on trouve ceci :
Code : Tout sélectionner
; Procedures & Callbacks for loading + saving data in EditorGadget (Richedit)
; ----------------------------------------------------------------------------
; Hinweis:
; Die Idee und das Grundgerüst zum laden stammt von El_Choni
; aus dem englischen Forum - ich habe es etwas vereinfacht und
; die schreibe - Procedure erstellt.
;
;- Load *******
; Hier eine Procedure + Callback zum laden einer Datei:
;
; FileID freie ID für Dateioperationen
; File Die Datei ggf. mit Pfad
; Gadget Gadget ID vom EditorGadget()
Procedure FileStreamIn(FileID.l, File.s, Gadget.l)
;Procedure zum streamen einer Datei in das RichEdit
;Control
Protected File
Protected FileID
Protected Gadget
Protected StreamData.EDITSTREAM
;Wenn die Datei geöffnet werden kann, fortfahren.
If ReadFile(FileID, File)
;Das Handle der Datei speichern
StreamData\dwCookie = UseFile(FileID)
StreamData\dwError = #Null
;Die Adresse der Callback Procedure speichern
StreamData\pfnCallback = @StreamFileIn_Callback()
;Das RichEdit Control anweisen, den Stream zu aktivieren
SendMessage_(GadgetID(Gadget), #EM_STREAMIN, #SF_TEXT, @StreamData)
;Datei schliessen
CloseFile(FileID)
EndIf
EndProcedure
Procedure StreamFileIn_Callback(hFile, pbBuff, cb, pcb)
ProcedureReturn ReadFile_(hFile, pbBuff, cb, pcb, 0)!1
EndProcedure
;- Save *******
; Hier eine Procedure + Callback zum speichern einer Datei:
;
; FileID freie ID für Dateioperationen
; File Die Datei ggf. mit Pfad
; Gadget Gadget ID vom EditorGadget()
Procedure FileStreamOut(FileID.l, File.s, Gadget.l)
Protected File
Protected FileID
Protected Gadget
Protected StreamData.EDITSTREAM
;Wenn die Datei erzeugt werden kann, fortfahren.
If CreateFile(FileID, File)
;Das Handle der Datei speichern
StreamData\dwCookie = UseFile(FileID)
StreamData\dwError = #Null
;Die Adresse der Callback Procedure speichern
StreamData\pfnCallback = @StreamFileOut_Callback()
;Das RichEdit Control anweisen, den Stream zu aktivieren
SendMessage_(GadgetID(Gadget), #EM_STREAMOUT, #SF_TEXT, @StreamData)
;Datei schliessen
CloseFile(FileID)
EndIf
EndProcedure
Procedure StreamFileOut_Callback(hFile, pbBuff, cb, pcb)
ProcedureReturn WriteFile_(hFile, pbBuff, cb, pcb, 0)!1
EndProcedure
Un autre conseil : il n'y a pas que le forum français

Publié : sam. 02/juil./2005 22:04
par LavaLava
Pour les forums qui parlent pas francais, c'est vrai que je n'ai pas le reflexe de faire des recherches dedans ...
Apparament j'aurais du car ce source marche trés bien et c'est trés rapide !
Par contre, si tout fonctionne bien avec des petits fichiers cela bogue pour les gros (2Mo).
En fait, une fois charger je ne peux plus éditer correctement le texte dans l'editorgadget : la saisie est impossible sauf si j'efface des caractéres,alors je peux réecrire le nombre de caracteres effacés !
En tout cas merci pour ta patience ...
Publié : sam. 02/juil./2005 22:22
par Dr. Dri
pour ca il faut passer par l'api... de cette maniere tu peux augmenter le nombre de caractères autorisés...
Un truc dans le genre EM_LimitText
http://msdn.microsoft.com/library/defau ... ittext.asp
Dri
Publié : jeu. 07/juil./2005 16:13
par LavaLava
C'est exactement ce qu'il fallait faire ....
Merci !
Publié : jeu. 07/juil./2005 16:36
par nico
gnozal a écrit :
Un autre conseil : il n'y a pas que le forum français

Non, mais une recherche sur le Forum Français t'aurais donné plusieurs exemples déjà, avant d'avoir le réflexe de chercher sur les autres Forums commence par celui-ci!
