Newsgroup: it.comp.lang.vo-clipper
Titolo: Vi chiedo un ulteriore consiglio.

Facendo affidamento sulla pazienza dei soliti noti mi ripresento con
un'altro problemino da risolvere.
Ho la necessità di importare dei dati da file di tipo testo con tracciato
noto e sempre uguale. Spesso questi file contengono errori per cui prima di
procedere con eventuali elaborazioni per il caricamento dati, devo eseguire
dei controlli. Nel caso il cui il file di testo contenesse degli errori,
vorrei che fosse possibile editarlo direttamente dall'applicazione VO. E
proprio qui sta il problema. Leggo il file di testo con le funzioni a basso
livello Fopen() FreadText() ecc. e ne metto il contenuto in una variabile di
tipo stringa. Poi carico la stringa nel TextValue di un controllo
MultiLineEdit. Ho provato con due file rispettivamente di circa  30 K e di
circa 800 K. Con il file piccolo tutto funziona, con quello grande alla fine
la MultiLineEdit risulta vuota. Suppongo che ciò dipenda da una limitazione
che Vo impone sulla dimensione delle variabili di tipo Stringa o sulla
proprietà TextValue delle MLE.
Ho cercato sulla guida in linea e non ho trovato niente al riguardo (Ma
nenche qualcosa di generico sui tipi di dati!). Purtroppo i manuali cartacei
non li ho a portata di mano.
Dove sbaglio? C'è un modo alternativo di fare le stesse cose che comunque
non passi per la gestione dei Db Server ?
Ciao a tutti e grazie anticipatamente.
Roberto Cordini

La gestione delle stringe e' limitata ad una dimensione massima di 64k.
E' improponibile utilizzare una "variabile" da 800kbyte.
Potresti utilizzare invece le istruzioni native di Win32 per mappare un file
in memoria, estremamente potenti e performanti! Con quelle lavori in una
"Window" di 64k che puoi spostare a piacere nel file ed usare il pointer
come se fosse un puntantore di memoria dimenticandoti di buffers e
allocazioni di ram.

Ecco un esempio banale di "File Mapping" in linguaggio C.
/*
--------------------------------------------------------------------------
 FILE..................: FILTER.C
 Data ultima revisione.:
 Sorgente per Microsoft Compiler C 10.0
 Modello...............:
 by Cossaro F.
 NOTA : filtro di file binario
--------------------------------------------------------------------------
*/
#include    <windows.h>
#include    <windowsx.h>
#include    <stdio.h>
BYTE  cset [512];
BYTE  setdelimitatori[] = " ";
BYTE  setpunteggiatura [] = {'!', 34,'#','$','%','&',
39,'(',')','*','+',44,'-','.','/', 0 };
BYTE  setcontrollo [] = { 7, 8, 9, 10, 11, 12, 13, 0 };
BYTE  setaltri [] = { ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']',
'^', '_', '`', '{', '|', '}', '~', 0};
XSResetBuffer ( LPBYTE lpset, int mode );
XSSetBuffer ( LPBYTE lpset, LPSTR xset, int mode );
XSSetBufferRange ( LPBYTE lpset, char chr1, char chr2, int mode );
DWORD FileSize ( PSTR szFileName);
/*
-------------------------------------------------------------------------
 Funzione..:
 Utilizzo..:
 Ritorna...:
 Note......:
-------------------------------------------------------------------------
*/
main ( int argc, char *argv[] )
 {
 HANDLE   hFileMap = INVALID_HANDLE_VALUE;
 HANDLE   hFile  = INVALID_HANDLE_VALUE;
 PBYTE    pfile;
 HANDLE   hFileDest = INVALID_HANDLE_VALUE;
 PBYTE    pbuffer;
 PBYTE    pc;
 DWORD    cbytes;
 DWORD    c;
 DWORD    bsize;
 DWORD    fsize;
 DWORD    len;
 BYTE    chr;
 fsize = FileSize ( argv[1] );
 hFile = CreateFile (argv[1], GENERIC_READ,FILE_SHARE_READ |
FILE_SHARE_WRITE, NULL,\
       OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
 hFileMap = CreateFileMapping (hFile, NULL,
           PAGE_READONLY, (DWORD) 0, (DWORD) fsize,
           (LPCTSTR) "pippofilter" );
 if ( hFileMap == NULL )
  goto breakout;
/*
 hFileDest = CreateFile (argv [1],
      GENERIC_READ | GENERIC_WRITE, 0,
      NULL, CREATE_ALWAYS,
      FILE_ATTRIBUTE_ARCHIVE, NULL );
 if ( hFileDest == INVALID_HANDLE_VALUE )
  goto breakout;
*/
 pfile = ( PBYTE ) MapViewOfFile ( hFileMap, FILE_MAP_READ, 0,0, fsize );
 if ( !pfile )
  goto breakout;
 /* impostazione buffer di controllo */
 XSResetBuffer ( cset, FALSE );
 XSSetBufferRange ( cset, 'a', 'z', TRUE );
 XSSetBufferRange ( cset, 'A', 'Z', TRUE );
 XSSetBufferRange ( cset, '0', '9', TRUE );
// XSSetBuffer    ( cset, setcontrollo, TRUE );
 XSSetBuffer    ( cset, setdelimitatori, TRUE );
 XSSetBuffer    ( cset, setpunteggiatura, TRUE );
 XSSetBuffer    ( cset, setaltri, TRUE );
 fsize--;
 len = 0;
 for ( c = 0; c < fsize; c++ )
  {
  chr = *pfile++;
  len++;
  if ( chr == 0x0A )
   {
   printf ("\n");
   len = 0;
   }
  else
   {
   if ( cset[ chr ] )
    printf ("%c", chr );
   else printf (" ");
   }
  if ( len > 72 )
   {
   printf ("\n");
   len = 0;
   }
  }
breakout:
 if ( pfile ) UnmapViewOfFile ( pfile );
 if ( hFileMap == INVALID_HANDLE_VALUE ) CloseHandle ( hFileMap );
 if ( hFileDest== INVALID_HANDLE_VALUE ) CloseHandle ( hFileDest );
 return NULL;
 }
/*
-------------------------------------------------------------------------
 Funzione..: XSResetBuffer
 Utilizzo..: imposta il buffer secondo il criterio specificato
 Ritorna...:
 Note......:
-------------------------------------------------------------------------
*/
XSResetBuffer ( LPBYTE lpset, int mode )
   {
   memset ( lpset, mode, 512 );
 return 0;
   }
/*
-------------------------------------------------------------------------
 Funzione..: XSSetBuffer
 Utilizzo..: imposta il buffer da una stringa campione con il flag spec.
 Ritorna...:
 Note......:
-------------------------------------------------------------------------
*/
XSSetBuffer ( LPBYTE lpset, LPSTR xset, int mode )
   {
  /*
   * imposta tutti gli elementi contenuti nel set impostato
   */
   while ( *xset )
      lpset [ *xset++ ] = mode;
 return 0;
   }
/*
-------------------------------------------------------------------------
 Funzione..: XSSetBufferRange
 Utilizzo..: imposta un range nel buffer
 Ritorna...:
 Note......:
-------------------------------------------------------------------------
*/
XSSetBufferRange ( LPBYTE lpset, char chr1, char chr2, int mode )
   {
   char     chr;
   if ( chr1 > chr2 )
      {
      chr  = chr1;
      chr1 = chr2;
      chr2 = chr;
      }
   /*
    * imposta tutti gli elementi contenuti nel set impostato
    */
   for ( chr = chr1; chr <= chr2; chr++ )
      lpset [ chr ] = mode;
 return 0;
   }
/*
-------------------------------------------------------------------------
 FileSize
 Utilizzo..: dimensione del file
 Note......:
-------------------------------------------------------------------------
*/
DWORD FileSize ( PSTR szFileName)
 {
 HANDLE  hFile;
 DWORD   size;
 hFile = CreateFile (szFileName, GENERIC_READ,FILE_SHARE_READ |
FILE_SHARE_WRITE, NULL,\
     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
 if ( hFile == INVALID_HANDLE_VALUE )
  return 0;
 size = GetFileSize ( hFile, NULL );
 CloseHandle ( hFile );
 return size;
 }

Pimpa!!!!
Finalmente uno che parla di programmazione.
Complimenti
Paolo
"pimpa" <xxx@xx.x> ha scritto nel messaggio
news:b6UG7.52349$sq5.2...@news.infostrada.it...


Il problema sta nella dimensione stringa che se non erro è di 65535 byte.
Ti suggerisco di importare il tutto su una tabella temp, che analizzi e poi,
corretta, importi
Danilo Giuliani
Roberto Cordini <roberto...@NOXSPAMiol.it> wrote in message
9sgld0$lv5$1...@zamboni.dsnet.it...


 noto e sempre uguale. ......


Non so se questo ti può essere utile: ho avuto un problema simile con il controllo RichEdit (che
potenzia il MultiLineEdit) con il quale non potevo elaborare stringhe più grosse di 32K. Esiste però
(per il solo RichEdit) la proprietà TextLimit che permette di impostare la grandezza massima della
variabile testo da gestire, ad una grandezza maggiore (quanto maggiore? l'help di CAVO non lo
specifica). Io l'ho sperimentata con 64 e 128K.
Marino

(per il solo RichEdit) la proprietà TextLimit 
C'e' anche nella MLE.
Ignazio GSS©
More than 90 HiRes images in my home page  
http://www.geocities.com/~puddu/
Oltre 200 Immagini di endoscopia digestiva
http://www.areamedica.com


Quindi se è vero che il limite per le variabili di tipo stringa è di 64K ma
la proprietà TextValue del MultiLineEdit come Tu hai potuto verificare
accetta anche 128K, come fai a mettere questo testo da 128 K nel controllo?
Mi spiego, dove viene memorizzato questa stringa se le variabili di tipo
stringa non accettano più di 64K?
Ciao e grazie per la risposta.
Roberto Cordini


Alla fine, anche se mi ero intestardito a percorrere un'altra strada (ho
provato anche a leggere il file di testo mettendo le righe lette in un array
e riempiendo poi con questo un controllo ListBox ma la cosa era sempre
troppo lenta) ho risolto il problema come suggerisci tu.
Ciao e grazie.
Roberto Cordini


stringa non accettano più di 64K?
Effettivamente è un bel problema. La mia prova con 128 K  è sicuramente errata. Ho in effetti
impostato la variabile TextValue a 128K senza ricevere errori, ma le variabili carattere utilizzate,
probabilmente non hanno mai superato il limite di 64K. Queste variabili sono create per somma di
stringhe (in pratica faccio una stampa a video formattata RTF da visualizzare in una finestrina un
po' come si faceva con Clipper) del tipo cTesto:=cTesto+"\b "+"Testo in grassetto" etc. etc. e non
ne ho mai verificato la grandezza effettiva (sempre maggiore di 32K però) :-( 
Marino 

Attenzione, il controllo Edit di Windows e' una cosa, il RichEdit e'
un'altra.
Il secondo infatti e' presente solo in Win32, ne e' consigliato l'uso per
via della possibilità di utilizzare testi di dimensioni maggiori di 64k
(oltre alla formattazione del testo).