Newsgroup: it.comp.lang.delphi
Titolo: Memoria ed Array

Ciao a tutti,
qualche giorno fà ho postato un problema con gli array di Char...
Sono riuscito a scavalcare quella montagna grazie al vostro aiuto ed ai
vostri suggerimenti,
ma....(c'è sempre un MA)....
io richiamo una form alla quale passo circa 18 array (of string, of char, of
Integer)....
Per passare questi array richiamo un "metodo" SetArrays della form :
myForm.SetArray(['a', 'b', ...], [1, 2, 3...], ['pippo', 'pluto',....]) etc
etc....
in questo metodo carico tutti gli array nel modo classio :
SetLength(myListField, Length(Array1))
For i := 0 To High(Array1) do
  myListField[i] := Array1[i]
Fin quando i dati erano pochi... tutto bene, però aumentando gli elementi
degli array
ad un certo punto mi da un problema di memoria..... ACCESS MEMORY...etc
etc....
1. Secondo voi (forse domanda inutile) il problema sono i troppi dati?
    Però non mi avrebbe dovuto dire "OUT OF MEMORY" ?
2. Come potrei agirare il problema? Considerate il fatto che all'interno
della mia form richiamo
    delle funzioni che richiedono questi array per settare Griglie, Field di
ClientDataSet etc etc....
    Quindi da qualche parte io gli devo pur passare questi dati....
Ciao
RIno
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

     Quindi da qualche parte io gli devo pur passare questi dati....
E' impossibile saturare la memoria di un pc odierno trattando qualche
decina di array... il problema o sta nella sbagliata progettazione, o
nell'errato modello di profiling che stai utilizzando. Ergo, dovresti
considerare se e' proprio necessario risettare ogni volta i fields e le
griglie oppure non ti conviende avere due o piu' CDS, due o piu' form con
le diverse griglie, ecc...
In un post analogo avevo suggerito l'uso della TList, perche' ha l'enorme
vantaggio di essere interamente autogestita. 
La mia impressione e' che stai sbagliando qualcosa tu nell'impostare e
gestire questi array... basta un solo ciclo balordo che ti satura lo stack
senza che te ne accorgi.
Ciao
-- 
Morde. 
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

 le diverse griglie, ecc...
Vedi, quella che istanzio č una Form di LOG, ovvero, quasi tutte le mie
tabelle hanno
dei trigger che ad ogni modifica o cancellazione di un record vanno a
scirvere nella tabella omonima di LOG.
La form che richiamo alla selezione di un record (es. Testata Fattura) č
costituita da una griglia per visualizzare i records modificati, in un
secondo TabSheet della form ci sono altre 2 griglie (con tecnica Master &
Detail) per la visualizzazione dei record di dettaglio sulla Grid1
(es.dettaglio righe fattura) e i relativi records modificati sulla Grid2,
poi nella terza vengono visualizzati tutti i records di dettaglio
cancellati...
Quindi, dopo il create della form preparo gli Array che poi verranno passati
alle funzioni
per la creazione a RUN-TIME dei fields dei ClientDataSet, per la creazione
delle colonne delle griglie etc etc....
Dopo tutto ciň, tu credi che sia meglio ereditare ogni volta la form per
tutte le gestioni presenti
nel mio programma, oppure continuare per la mia strada cercando di
risparmiare qualcosa?
Al max. potrei postare un pň di codice, ma direi che č un "bel pň".....


 Al max. potrei postare un pň di codice, ma direi che č un "bel pň".....
Dopo tutto cio', credo che sia meglio che analizzi questo debugger: 
http://sourceforge.net/projects/nexusproject/
oppure quello che viene offerto dalla GEXperts che sicuramente avrai
installato nel sistema.
Credo che sia meglio per te usare qualcosa di simile visto che lo scopo e'
*LOGGARE*.


 *LOGGARE*.
Mai usati.... se non ti porta via troppo tempo mi fai capire a che serve?


 Mai usati.... se non ti porta via troppo tempo mi fai capire a che serve?
Ok, comincia con questa pagina:
http://delphree.clexpert.com/pages/projects/nexus/overseer_debugger.htm
Poi, scaricatelo: dovresti avere gia' un demo compilato win32 del debugger
tra le cartelle scaricate.
Queste sono le istruzioni per aggiungerlo ad una tua applicazione, cosi'
puoi giocarci un po' e vedere se ti trovi bene (io ormai lo uso da 3 anni).
1) Dopo aver aggiunto alla path del progetto il percorso dei sorgenti
(tipicamente ...\overseer\Source), aggiungi alla unit principale del tuo
progetto la uses udbg.
2) sempre nella unit principale dichiara come public l'oggetto debugger
public
   DbgMainFrm : TNxDebugger;
3) A questo punto devi inizializzare l'ascoltatore: attento questa
operazione
devi farla all'inizio del programma.
Nell' OnCreate della form principale, aggiungi:
   DbgMainFrm := TNxDebugger.Create ('frmMainHello','Hello world'); //
creato
   NxStartDebug; // inizializzato
4) Da adesso in avanti potrai loggare tutto quello che vuoi. hai a
disposizione funzioni per loggare tutti i tipi di dato, in piu' gli oggetti
e
le loro proprieta'. 
Qualche esempio:
DbgMainFrm.LogMsg('Update Ultimo Prezzo');
DbgMainFrm.LogFmtMsg('Il campo ordinamento è %s, %s',[sFOrd,s]);
DbgMainFrm.LogFmtError('Errore DB: [%s]',[E.message]);
5) Alla fine del programma, ricordati di far cessare l'ascolto e liberare
le
risorse.
Nell' OnDestroy del form principale, aggiungi:
   NxEndDebug;
   DbgMainFrm.Free;
Questo e' solo un sempio basilare di utilizzo, ci sono funzioni avanzate
che
ti permettono di categorizzare (error, warning, note,
enterprocedure,leave...)
i messaggi, puoi loggarti interi oggetti con tutto le proprieta' con una
sola
riga:
DbgMainFrm.LogObject('Oggetto Column->Field',Column.Field)
DbgMainFrm.LogObject('ADOConnection2',ADOConnection2);
Ovviamente hai un visualizzatore di log, e il log puo' essere fatto su
file,
in real time, ecc...
