Limite EditorGadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Limite EditorGadget

Message 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
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message 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
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message 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 ...
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Re: Limite EditorGadget

Message 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/
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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...
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Quel est alors la différence entre une chaine et un stream ?
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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 ...
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message 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
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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 :wink:
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message 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 ...
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
LavaLava
Messages : 173
Inscription : dim. 28/mars/2004 17:42
Localisation : Provence

Message par LavaLava »

C'est exactement ce qu'il fallait faire ....
Merci !
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

gnozal a écrit : Un autre conseil : il n'y a pas que le forum français :wink:
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!

:)
Répondre