Limite EditorGadget
Limite EditorGadget
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
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
bonjour
essaye ça
ca permet de definir la limite de taille d'un fichier a charger
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
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 ...
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
Pour charger un gros fichier texte (ou le sauvegarder) avec un EditorGadget (contrôle RichEdit), je pense que les streams sont plus performants.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
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/
- Progi1984
- Messages : 2659
- Inscription : mar. 14/déc./2004 13:56
- Localisation : France > Rennes
- Contact :
Quel est alors la différence entre une chaine et un stream ?
Librairies & Applications : https://www.purebasic.fr/french/viewtop ... f=8&t=6220
Site Web : https://rootslabs.net
Site Web : https://rootslabs.net
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.Progi1984 a écrit :Quel est alors la différence entre une chaine et un stream ?
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.
Un conseil : jetez un coup d'oeil aux sources de l'ancien éditeur. On y apprend plein de choses ...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.
Je ne suis pas sur mon PC là, mais après une recherche STREAM + RICHEDIT sur le forum allemand, on trouve ceci :LavaLava a écrit :N'aurais tu pas un exemple ?
Merci
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

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 ...
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 ...
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
Un truc dans le genre EM_LimitText
http://msdn.microsoft.com/library/defau ... ittext.asp
Dri