Newsgroup: it.comp.lang.delphi
Titolo: Per i guru di Delphi

Ciao a tutti,
                    ho scoperto una cosa molto curiosa...
All'interno di un oggetto di tipo Tscrollbox non posso creare più di tot
oggetti diciamo che dalle prime stime arrivo intorno ai 16000.
Nessuno mi sa spiegare il perchè? La mia ipotesi è che delphi conceda a
ciascun oggetto uno spazio ben preciso di memoria e non si possa
andare oltre.
Esiste per caso un modo per farlo? Che ne so con una direttiva al
compilatore?? ($...)
Ciao ciao
Giò

non so chi sono i guru, ma sono che molti frequentatori del ng, me compreso,
sono stufi di:
1) post con usbject non significativi
2) post senza alcuna indicazione della versione di delphi
Bye
A


Come fai a dire che non ne accetta piů di 16000? ti esce un errore?
Ciao
Giorgio

Magari è una limitazione di puntatori... forse dico una bischerata ma 2^14ma
= 16384... magari...

> 1) post con usbject non significativi
                    ^^^^^^
Sarebbero stampanti a getto d'inchiostro con interfaccia usb che funzionano
in malo modo e che quindi non meritano di essere prese in considerazione ?
:DDDD :PPP
Ciao!!

> Come fai a dire che non ne accetta più di 16000? ti esce un errore?
Si, mi viene sollevata un eccezione dal sistema operativo... di mancanza di
memoria per
eseguire l'operazione (quando creo l'ennesimo oggetto).
Si può provare con questo semplice esempio:
var
i: integer;
img: timage;
box: tscrollbox;
p: tpanel;
begin
    box:=tscollbox.create(nil);
    box.visible:=true;
    box.parent:=form1;
    for i:=1 to 40000 do
        begin
            p:=tpanel.create(nil);
            p.visible:=true;
            img:=timage.create;
            img.visible:=true;
            timage.parent:=p;
            try
                p.parent:=box;
            except
                showmessage(inttostr(i));
            end;
        end;
end;
ovviamente si deve disattivare la voce "Stop on delphi exceptions" nelle
opzioni del compilatore..
Ciao
Giò


probabilmente sono le stampanti usa-e-jetta degli ipermercati, quelle
vendute a 39 euro e rigorosamente con interfaccia usb ;)
Il nostro buon Alberto ha inventato un neologismo :DDD
Ciao, Sandro

 eseguire l'operazione (quando creo l'ennesimo oggetto).
Usi Windows 95/98/ME ? Se si, hai finito le risorse. Soluzione: passa ai
sistemi NT.
Ciao, Sandro


I massimi assoluti della TList e quindi dei controlli presenti dentro un
altro sono:
{ Maximum TList size }
  MaxListSize = Maxint div 16;
che sono circa 134 milioni.
Dal codice che hai postato tu per ogni ciclo for crei un TPanel e un TImage,
ciň significa che se hai 128mega di memoria per la tua applicazione, dividi
il tutto per 16.000 fa circa 8kb di memoria per quei 2 oggetti (quindi
suppongo che quei due oggetti occupino quel tanto oppure vuol dire che hai
meno memoria disponibile nel tuo sistema) e quindi probabilmente il tuo
limite č quello. Altrimenti come ho scritto sopra il limite č di 134milioni.
Ciao
Giorgio

 sistemi NT.
Uso XP Pro...
P3 700 192 mb di ram delphi 7 Enterprise Ed.

 limite č quello. Altrimenti come ho scritto sopra il limite č di
134milioni.
Non penso proprio sia un problema di macchina dato che lo stesso codice va
in crisi nello stesso momento anche sul mio athlon XP 2100+ con mezzo giga
di ram
Giņ

 ha scritto nel messaggio
news:bh87lb$mkr$1...@le1.cs.unibo.it...


> Il nostro buon Alberto ha inventato un neologismo :DDD
Nel senso della neolingua citata in 1984 di Orwell?
Quel termine lo brevetto e me lo registro come dominio...
;P
A


Azz! Ho proprio bisogno di andare in vacanza.....;P
A


Ho fatto dei test e mi risulta che ogni ciclo for consuma 2050 byte di
memoria.
In effetti su 16.000 cicli sono circa 32 mega di ram. Un po pochini per un
out of memory.
Comunque se l'eccezione sollevata è Out of memory io indagherei proprio
sulla memoria.
Piuttosto, a che cosa ti servono tutti quei componenti in una form????????
Ciao
Giorgio


Open Delphi Manual (
http://groups.yahoo.com/group/delphi_open_manual/
)


1) e' una pazzia creare 16000 componenti. Quale utente potrebbe vederli
tutti in un solo giorno?
2) non credo sia una limitazione di Delphi ma di sistema operativo. Ogni
oggetto KERNEL, USER o GDI e' un handle, e gli handle sono in numero
limitato
3) se anche non ci fossero gli handle, la memoria occupata sarebbe notevole.
A mio parere, stai sbagliando approccio. Se spieghi cosa devi fare, forse ti
si puo' dare qualche consiglio
Ciao,
Stefano

 combinazione, ma consumando meno risorse.
SE mi dici cosě mi ci butto davvero a farlo...
mi assicuri che l'occupazione č minore???
Giň


Sono anteprime di immagini.... ovviamente generate con un algoritmo veloce
che le fa stare in pochissima ram...
Può capitare che un utente cazzone mi inserisca una valanga di immagini e
dovrei creare un sacco di anteprime con sotto il bel pannellino e quindi il
caso è da considerare ....
Ciao
Giò


Io creo l'anteprima di immagini ciascuna anteprima è composta da un pannello
di sfondo, un oggetto timage e due textbox con il risultato che i componenti
che si creano sono 3300 circa.... prima del crash
L'esempio postato aveva solo la finalità di far vedere il bug
velocemente....
Ciao Giò

Beh, penso che la soluzione possa stare nel mezzo come mamma MS insegna :))
Hai presente quando imposti a thumbnails la visualizzazione di esplora
risorse?
Le immagini vengono caricate per PAGINE al momento in cui tu fai uno SCROLL.
Potresti fare un sistema del genere non ti pare? Tanto l'utente non potrebbe
visualizzare più di una pagina in una volta.
Un po' come la fetch on demand (e qui forse il termine è improprio? boh?)
con l'architettura client-server e le grid ;)
Ciao

 mi assicuri che l'occupazione è minore???
Dipende da quello che devi fare. Se scrivi quello che precisamente vuoi
ottenere, possiamo valutare tutti quale sia la soluzione migliore per
te. E' probabile che esistano altre soluzioni oltre al controllo visuale
per risolvere il tuo problema, ma non ci hai detto cosa intendi fare di
tutti quei TPanel e TImage...


 pannellino e quindi il caso è da considerare ....
Per il tuo scopo, potresti utilizzare addirittura una griglia definendo
righe e colonne per accomodare le immagini da visualizzare e gestendo
qualche evento di "custom drawing" per tracciare manualmente il
contenuto delle singole celle, disegnando l'immagine con il metodo
Canvas.Draw e scrivendo il testo al posto giusto con il metodo
Canvas.TextOut.
In alternativa, potresti creare un discendente di TGraphicControl e
dotarlo di qualche proprietà specifica per le tue esigenze; ad esempio,
ImageHeight e ImageWidth per tarare altezza e larghezza delle thumbnail,
Font per definire stile e dimensioni del carattere per i titoli, ecc. In
questo modo, non consumeresti Handle inutili di Windows e avresti un
singolo controllo per visualizzare tutto. Potresti gestire funzionalità
di scrolling per definire riga e colonna iniziale da visualizzare,
partendo dall'angolo in alto a sinistra. "Scavalcando" il metodo Paint
tramite la direttiva 'override', dovresti occuparti di disegnare
manualmente tutte le anteprime, organizzandole in righe e colonne.
Tanto per proporre un'altra soluzione ancora: hai provato ad utilizzare
il controllo ListView?
Viste le tue esigenze, non credo che sarà di grande aiuto, tuttavia ho
recentemente creato un browser di immagini simile al tuo (ma il numero
di immagini è genericamente limitato) collegando un ListView ad un
controllo TImageList.
La proprietà LargeIcons del ListView è collegata all'ImageList; quando
devo visualizzare un'immagine, la aggiungo all'ImageList e,
successivamente, aggiungo un nuovo ListItem che faccia riferimento a
quell'immagine (tramite la proprietà ImageIndex), copiandone il titolo
nella Caption del ListItem appena creato.
Ma, come ti ho detto, non so quanto possa essere efficiente nel caso in
cui si abbiano così tante immagini.


Penso che toglierò i textbox o meglio faccio due bande nere sull'immagine
tramite canvas e sempre con canvas.textout ci metto i mei testi. a questo
punto dato che il programma nasce per gestire circa 1000 immagini alla volta
(per categoria) posso benissimo mettere il limite a 16000.
Purtroppo sarebbe meglio la soluzione di visualizzare a pagine ma non ho più
tempo...
Semmai sarà oggetto della Release 2.
Grazie a tutti
Giò

Si va in ferie eh ?!?!? :PPP