Newsgroup: it.comp.lang.visual-basic
Titolo: Memoria esaurita

Salve, vi scrivo perchè ho un piccolo problemino con la memoria. Il mio
obbiettivo è quello di caricare un file rtf in una RichTexBox e salvarlo
come immagine. Allego il codice per poter generare l'immagine (codice
trovato su intenet che lo inviava alla stampante, da me modificato per
inviarlo in una picture box):
Option Explicit
Private Type Rect
   Left As Long
   Top As Long
   Right As Long
   Bottom As Long
End Type
Private Type CharRange
  cpMin As Long     ' First character of range (0 for start of doc)
  cpMax As Long     ' Last character of range (-1 for end of doc)
End Type
Private Type FormatRange
  hdc As Long       ' Actual DC to draw on
  hdcTarget As Long ' Target DC for determining text formatting
  rc As Rect        ' Region of the DC to draw to (in twips)
  rcPage As Rect    ' Region of the entire DC (page size) (in twips)
  chrg As CharRange ' Range of text to draw (see above declaration)
End Type
Private Const WM_USER As Long = &H400
Private Const EM_FORMATRANGE As Long = WM_USER + 57
Private Declare Function SendMessage Lib "USER32" Alias "SendMessageA" _
   (ByVal hWnd As Long, ByVal msg As Long, ByVal wp As Long, _
   lp As Any) As Long
Public Declare Function SaveDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function RestoreDC Lib "gdi32" (ByVal hdc As Long, ByVal
nSavedDC As Long) As Long
Public Sub CreaImmagineRTF()
   Dim LeftMargin As Long, TopMargin As Long
   Dim RightMargin As Long, BottomMargin As Long
   Dim fr As FormatRange
   Dim rcDrawTo As Rect
   Dim rcPage As Rect
   Dim NextCharPosition As Long
   Dim r As Long
   Dim RTF As RichTextBox
   Dim Pic As PictureBox
   Dim lngSavedDc As Long
   ' Salvo lo stato iniziale del dispositivo di contesto
   lngSavedDc = SaveDC( frmNeed.picFrontespizio.hdc)
   frmNeed.rtbFrontespizio.LoadFile FileTesto
   Set RTF = frmNeed.rtbFrontespizio
   Set Pic = frmNeed.picFrontespizio
   ' Pulisce la picture
   Pic.Picture = LoadPicture()
   LeftMargin = 0
   TopMargin = 0
   RightMargin = Pic.ScaleWidth
   BottomMargin = Pic.ScaleHeight
   ' Set printable area rect
   rcPage.Left = 0
   rcPage.Top = 0
   rcPage.Right = Pic.ScaleWidth
   rcPage.Bottom = Pic.ScaleHeight
   ' Set rect in which to print (relative to printable area)
   rcDrawTo.Left = LeftMargin
   rcDrawTo.Top = TopMargin
   rcDrawTo.Right = RightMargin
   rcDrawTo.Bottom = BottomMargin
   ' Set up the print instructions
   fr.hdc = Pic.hdc   ' Use the same DC for measuring and rendering
   fr.hdcTarget = Pic.hdc  ' Point at printer hDC
   fr.rc = rcDrawTo            ' Indicate the area on page to draw to
   fr.rcPage = rcPage          ' Indicate entire size of page
   fr.chrg.cpMin = 0           ' Indicate start of text through
   fr.chrg.cpMax = -1          ' end of the text
   NextCharPosition = SendMessage(RTF.hWnd, EM_FORMATRANGE, True, fr)
   ' Allow the RTF to free up memory
   r = SendMessage(RTF.hWnd, EM_FORMATRANGE, False, ByVal CLng(0))
   Pic.Refresh
   ' Salva l'immagine
   SavePicture Pic.Image, App.Path & "\imgrtf.bmp"
   ' Pulische la picture
   Pic.Picture = LoadPicture()
   ' Ripristino lo stato iniziale della picture usata per creare l'immagine
   RestoreDC frmNeed.picFrontespizio.hdc, lngSavedDc
End Sub
Dopo un po' di tempo Visual Basic mi genera l'errore memoria esaurita in
quanto non può creare un immagine in AutoRedraw. Qulacuno sa dirmi perchè la
memoria non viene liberata se io salvo il DC allo stato iniziale e lo
ripristino quando ho finito il tutto?
Grazie per la collaborazione.
Dario Di Marino

    RestoreDC frmNeed.picFrontespizio.hdc, lngSavedDc
Non so con esattezza perchè ti da problemi di memoria, pero', perchè fai
sempre  Pic.Picture = LoadPicture() ?
Quello che posso supporre è che  LoadPicture()  crea un nuovo HDC e che
quindi  RestoreDC vada ad agire su un HDC diverso da quello originario.
Prova a non usare mai LoadPicture(), e se devi cancellare la piture, usa
Pic.Clear (se ricordo bene).
Ciao
Ettore Maronese
http://www.maronese.com/mes
Il Sito Comune di questo NG
http://www.murialdo.it/it_lang_vb

Proverò come da te indicato. Poi ti farò sapere come va. Grazie per ora.
Dario Di Marino