Newsgroup: it.comp.lang.delphi
Titolo: Problema TextOut su un canvas tprinter

Buona giornata a tutti,
 
Ho una semplice Texout che inserita in un ciclo scrive dei caratteri in 
certe coordinate del canvas:
 
     for lu:=0 to stampaout.count-1 do
           begin
               estampa:=stampaout.Items[lu];
		myprinter.Canvas.TextOut((estampa^.pos*100),(y*100),chr(estampa^.c));
 
	end;
 
dove:
stampaout è un oggetto Tlist
Lu è un Longint
estampa : lista;
 
e dove lista é un oggetto dichiarato in questo modo:
 
     lista=^elista;
     elista=record
          s:char;
          c:byte;
          pos:word;
     end;
 
Vengo al punto.... La TEXTOUT va in access violation e non riesco a 
capire il perchè!!!
MA non lo fa sempre solo ogni tanto e senza riuscire a capire un nesso 
logico ( suppongo qualche problema di memoria ma non so come 
approfondire la cosa....)
 
Se qualcuno sa darmi un consiglio, sto brancolando nel buio.
 
Grazie mille a tutti.
 
K

k28 ha scritto, Il 06/19/2012 11:11 AM:
 
Dimenticavo il compilatore da me usato è XE2.
 

 capire il perchè!!!
 
Verifica che il puntatore che stai "dereferenziando" non sia *nil* quando chiami quella funzione.
 
-- 
MARCO BREVEGLIERI
#Home: 
http://www.marco.breveglieri.name
 
#Blog: 
http://www.compilaquindiva.net
 


Fatto! ho aggiunto if estampa<>nil then myprinter.canvas.texout.......
ma il risultato non cambia .
Come dicevo il problema non č metodico, a volte capita a volte NO!
č come se ad un certo punto tale funzione saturasse qualche buffer o 
qualche struttura in memoria.
Se io provo a commentare SOLO quella riga il programma non va in errore 
e gira perfettamente.
(chiaramente non fa le textout) e lascia vuota la canvas ma funziona 
benissimo.
Ergo il problema č in quella textout.
Ma non so proprio come fare a capire l'origine del problema.
 
K28
 

 (estampa^.pos*100),(y*100),chr(estampa^.c)
 
metti dati fissi:
 
100,y*100,'x'
 
funziona o dà ancora AV ?
 
-- 
Alessandra
 
Se la bibbia prova l'esistenza di Dio, allora i fumetti provano
l'esistenza di Nembo Kid


Ere un tentativo che avevo già fatto, il problema rimane solo che si 
manifesta un po dopo come se qualche buffer impiegasse più tempo a 
riempirsi.


per "un po dopo" intendo dire che si manifesta dopo qualche iterazione 
in più del ciclo.

 in piï¿½ del ciclo.
 
E allora è qualcosa che riguarda una parte diversa del codice rispetto a quella che stai osservando.


 iterazione in più del ciclo.
 
fai una iterazione da 1 a 500.000, con *tutti* dati fissi, e vedi un pò.
Se ancora desse AV, potrebbe essere un problema di driver di stampa.
 
-- 
Alessandra
 
Puoi chiamare Dio in mille modi: Dio, Allah, Buddha, Geova, Yahvè,
Ernesto? tanto non ti risponde - Corrado Guzzanti.

Prova a dichiarare l'oggetto in maniera standard
 
Type
   elista = Class
   public
     s:char;
     c:byte;
     pos:word;
   end;
 
poi passalo all'oggetto lista con la funzione AddObject e riprendilo, 
nel tuo ciclo, con Objects[Indice]
 
Bye


Grazie Microges,
 
so che la mia dichiarazione è un po "vecchio stile" ma cambiarla 
vorrebbe dire cambiare molte parti del codice che al momento non vorrei 
toccare.
La userei come ultima spiaggia.
 
k



Grazie Marco per la tua Disponibilità, volevo esporti un mio 
ragionamento, sei libero di commentare ed offendere a piacere :D
 
L'errore viene generato su quella riga (perché come ho già scritto 
commentandola il codice gira senza errori anche con iterazioni lunghe).
Sono 3 gli attori che sono in gioco con la memoria in quella riga e non 
si può scappare:
 
-Il puntatore estampa.
-La variabile y.
-L'oggetto myprinter.
 
Nell'ordine:
 
-Il puntatore estampa<>Nil e contiene dei dati (se fossero inconsistenti 
mi aspetterei una scritta in un posto errato, non un AV) ne deduco non è 
la causa dell'errore.
 
-La variabile y è una costante che non cambia MAI all'interno 
dell'iterazione del ciclo, ergo non è il problema altrimenti darebbe 
errore alla prima iterazione.
 
-Potrebbe essere l'oggetto myprinter che per qualche motivo a me 
incomprensibile non sia più esistente....
e quindi il canvas non sia più disponibile.
In effetti all'interno del ciclo ci sono anche un paio di if che non 
avevo messo per non sviare l'attenzione dal problema, e che servono solo 
a cambiare pagina e/o documento in base a determinati valori di estampa.
Se vuoi ti posto il codice in maniera completa, ma non ritengo che 
l'errore sia in quella parte di codice perché se commento la riga con la 
texout il resto del codice produce un output con il numero di pagine 
corrette, ma senza testo(come ovvio avendo commentato la textout).
Hai un consiglio per testare che myprinter sia ancora esistente al 
momento dell'errore?
 
K

 -L'oggetto myprinter.
[...] 
 
ciao.
 
Hai ragione, probabilmente nessun oggetto delphi e' nil in quella
chiamata, la tua spiegazione e' convincente, ma
dimentichi una querta possibilita': che l'errore NON dipenda da
oggetti delphi nil ma da errori interni al driver di stampa.
 
Ieri Alessandra ti ha suggerito una prova da fare per verificarlo,
fai questa prova e dicci cosa ottieni.
 
ciao
Giacomo

Allora potresti usare una via di mezzo (non molto ortodossa per la 
verità ma, a me, funzionante)
 
Il tuo oggetto è cosi':
 
 
     lista=^elista;
     elista=record
          s:char;
          c:byte;
          pos:word;
     end;
 
creane uno di appoggio che inglobi il tuo:
 
Olista = Class
Public
   Dato : lista;
End;
 
e ti crei le funzioni di passaggio di tipo
 
Function listaToOlista(Ingresso : lista) : Olista;
Var
   Oggetto : OLista;
Begin
   Oggetto := OLista.Create;
   Oggetto.Dato := ingresso;
   Result := Oggetto;
End;
 
Function OListaToLista(Ingressso : OLista) : Lista;
Begin
   Result := Ingresso.Dato;
End;
 
e quindi, quando devi inserirlo usa AddObject(ListaToOlista(elemento)), 
mentre per usarlo OListaToLista(Objects[Indice])^.<il dato che ti pare>


Dimenticavo.....
 
dichiarando un oggetto alla maniera del Borland Pascal
 
POggetto = ^Oggetto;
Oggetto = Record
             .....
           End;
 
e memorizzando POggetto, capita che il valore vero del puntatore cambi. 
Questo per lo swap della memoria che esegue il SO


Ecco questa motivazione mi piace..... perchè introduce l'imprevedibilità 
che era la cosa che mi mandava più in casino.
L'errore non era mai ripetibile, ogni volta si ripeteva in momenti 
differenti.
e se "incapsulo" in questo modo dici che gli indirizzi dei puntatori non 
cambiano se il SO swappa?
 
K
 
 

 cambiano se il SO swappa?
 
Sinceramente non so (sul mio il progetto di prova è troppo piccolo).


BINGOOOOO......
 
Alessandra aveva ragione, era il driver....
Ho installato un altro PDF writer(pdf24) e adesso non ho più nessun 
problema.....
Prima usavo BULLZIP.
MA volete farvi 4 risate?
Adesso dopo aver installato PDF24 anche BULLZIP non si inchioda più!!!!
La mia supposizione è che abbia cambiato qualche DLL con qualche bug.....
 
Adesso chiedo a tutti voi....
Se io volessi intercettare l'errore (adesso che so che è il driver) ed 
evitare che il thread in cui è inserita questa stampa vada in crash 
drastico... come posso fare?
 
Si accettano consigli, offese, e parolacce offensive e lesive della mia 
persona ;)
 
Grazie ancora :D