Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [DELPHI] Problemi con SavetoStream

    che cosa è sbagliato nel seguente codice?
    codice:
    var
       DC : HDC; DestBitmap,DestBitmap2: TBitmap; Res:TBytes; SSS:TMEMORYSTREAM;
    begin
      DC := GetDC (GetDesktopWindow) ;
       DestBitmap:=TBitmap.Create;
         DestBitmap2:=TBitmap.Create;
         SSS := TMEMORYSTREAM.Create;
      try
       DestBitmap.Width := GetDeviceCaps (DC, HORZRES) ;
       DestBitmap.Height := GetDeviceCaps (DC, VERTRES) ;
       BitBlt(DestBitmap.Canvas.Handle,0,0,DestBitmap.Width,DestBitmap.Height,DC,0,0,RCCOPY) ;
      finally
       ReleaseDC (GetDesktopWindow, DC) ;
      end;
    
    DestBitmap2:=ResizeBMP(Destbitmap,strtoint(form5.edit1.text));
    
       Destbitmap2.SaveToStream(SSS);
       Destbitmap.LoadFromStream(sss);
       Form5.IMG.Picture.Bitmap:=destbitmap2; //questo funziona
    
       Form5.IMG.Picture.bitmap:=destbitmap;   //questo non funziona
    
    end;
    come mai salvando sullo stream perdo l'immagine??

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Re: [DELPHI] Problemi con SavetoStream

    Originariamente inviato da gygabyte017
    come mai salvando sullo stream perdo l'immagine??
    Ci sono alcune funzioni di cui non è riportato il codice, oltre ad una strutturazione del codice che favorisce parecchi "memory leak", ad ogni modo per il momento tralascio questi problemi per concentrarmi sulla "dimenticanza" che probabilmente è la causa di tutto.

    Devi immaginare qualsiasi stream con cui hai a che fare come un "nastro" che puoi leggere e scrivere.

    In base a questa precisazione, l'errore è facilmente individuabile: quando esegui una SaveToStream, il tuo "cursore virtuale" scorre il nastro virtuale scrivendo al suo interno i dati (in questo caso quelli di un bitmap); al termine dell'operazione, il cursore è posizionato in coda allo stream, pronto per scrivere eventualmente altri dati da accodare.

    Per caricare i dati appena salvati dallo stream, devi quindi prima "riavvolgere" il nastro, posizionando lo stream all'inizio; a livello pratico, usa la proprietà Position mettendola a 0 (zero) oppure esegui una chiamata al metodo Seek per spostare il cursore nella posizione da cui iniziare a leggere.

    Fatto questo, puoi procedere con la LoadFromStream per leggere i dati memorizzati nello stream, in questo caso riferiti ad un bitmap e interpretati dalla classe TBitmap.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    hai proprio ragione... e io che stavo impazzendo

    Grazie

  4. #4

    Re: Re: [DELPHI] Problemi con SavetoStream

    Originariamente inviato da alka
    [cut] una strutturazione del codice che favorisce parecchi "memory leak",
    ciao alka,
    ti riferiscia al numero di oggetti creati, al fatto che non distrugge gli oggetti creati o al fatto che usa varie istanze per la manipolazione?

    PS: è per mia curiosità personale...

  5. #5

    Re: Re: Re: [DELPHI] Problemi con SavetoStream

    Originariamente inviato da bDaniele
    ciao alka,
    ti riferiscia al numero di oggetti creati, al fatto che non distrugge gli oggetti creati o al fatto che usa varie istanze per la manipolazione?

    PS: è per mia curiosità personale...
    penso che si riferisca al fatto che ho dimenticato di fare
    codice:
    DestBitmap.Free;
    DestBitmap2.Free;
    SSS.Free;

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Re: Re: Re: [DELPHI] Problemi con SavetoStream

    Originariamente inviato da bDaniele
    ti riferiscia al numero di oggetti creati, al fatto che non distrugge gli oggetti creati o al fatto che usa varie istanze per la manipolazione?
    Forse è possibile ottimizzare il numero di oggetti utilizzati, ad ogni modo io mi riferivo specificatamente alla mancanza di chiamate al metodo Free degli oggetti creati, con l'uso del costrutto try...finally per garantirne la distruzione anche in caso di eccezione.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.