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

    [DELPHI Berlin] Memory Leaks con firemonkey

    Salve a tutti ragazzi
    Quando premo un bottone devo creare una serie di TRectangle, e sino qui tutto ok
    codice:
        oWin: Array[0..20] of TRectangle;
        aWin: Array[3..20, 1..4] of integer = ((115,55,106,30), (70,75,221,30),
                                               (115,55,291,30), (115,40,106,85),
                                               (115,40,291,85), (115,55,106,125),
                                               (70,75,221,105), (115,55,291,125),
                                               (60,150,26,30),  (60,150,420,30),
                                               (207,60,305,186),(60,20,26,80),
                                               (60,20,420,80),  (205,60,0,186),
                                               (93,66,209,189), (100,20,10,0),
                                               (100,20,400,0), (100,20,206,0));
    ....
    // creo le finestre rFondo è il Trectangle contenitore creato visualmente
      for x := 3 to 20 do
      begin
        oWin[x] := TRectangle.Create(rFondo);
        oWin[x].Parent := rFondo;  
        oWin[x].Width := aWin[x][1];
        oWin[x].Height := aWin[x][2];
        oWin[x].Position.X := aWin[x][3];
        oWin[x].Position.Y := aWin[x][4];
        oWin[x].Name := 'WIN_' + x.ToString;
        oWin[x].Fill.Color  := TAlphaColorRec.Black;
        oWin[x].Fill.Kind := TBrushKind.Bitmap;
        oWin[x].Fill.Bitmap.Bitmap.Create(aWin[x][1], aWin[x][2]); // creo bitmap interna 
        if x > 10 then
          oWin[x].Stroke.Color := TAlphaColorRec.Darkred
        else
          oWin[x].Stroke.Color := TAlphaColorRec.White;
      end;
    Poi in chiusura libero gli oggetti creati
    codice:
      for x := 3 to 20 do
      begin
        if Assigned(oWin[x]) then
        begin
          oWin[x].Free;
          oWin[x] := Nil;
        end;
      end;
    ma nonostante mi esce un memory leaks: 29-36 bytes TBitmapImage x18.
    Cosa sbaglio/dimentico??

    Grazie a tutti per l'attenzione
    N.

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,322
    Quote Originariamente inviata da Nettuno95 Visualizza il messaggio
    mi esce un memory leaks: 29-36 bytes TBitmapImage x18.
    Cosa sbaglio/dimentico??
    Direi che il messaggio parla chiaro: non vengono rilasciate le TBitmapImage che crei e assegni come riempimento dei rettangoli.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  3. #3
    Si ok, il messaggio mi sembra ovvio, ma come faccio a "liberarli"?? le ho provate tutte, ma probabilmente non ho le competenze... vabbè ... vediamo se c'e' qualcuno con qualche idea... al momento restano così, ho un paio di idee, appena ho un po' di tempo faccio qualche prova e vi faccio sapere.
    Grazie della risposta
    N.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,322
    Quote Originariamente inviata da Nettuno95 Visualizza il messaggio
    Si ok, il messaggio mi sembra ovvio, ma come faccio a "liberarli"??
    Direi invocando il metodo Free come per tutti gli altri oggetti.

    Quote Originariamente inviata da Nettuno95 Visualizza il messaggio
    le ho provate tutte, ma probabilmente non ho le competenze...
    Tutte tutte sicuramente no, altrimenti avresti trovato l'alternativa giusta e il problema sarebbe stato risolto.

    Credo sia sufficiente che quando generi il Bitmap da assegnare, tu tenga traccia del suo riferimento, magari memorizzandolo in una lista dei bitmap che sono stati creati, e gestendo poi il loro rilascio chiamando Free nel momento in cui non sono più utilizzati.

    In realtà, nel tuo codice credo sia superfluo chiamare Create per creare il bitmap, dato che - analizzando il codice sorgente di Delphi - quegli oggetti sono già istanziati dai componenti/classi che ne fanno uso, e pertanto non serve crearne di nuovi.

    Hai provato banalmente ad agire sulle proprietà senza creare un nuovo bitmap?

    codice:
        oWin[x].Fill.Color  := TAlphaColorRec.Black;
        oWin[x].Fill.Kind := TBrushKind.Bitmap;
        oWin[x].Fill.Bitmap.Bitmap.SetSize(aWin[x][1], aWin[x][2]);
    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

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

  5. #5
    Quote Originariamente inviata da alka Visualizza il messaggio

    Hai provato banalmente ad agire sulle proprietà senza creare un nuovo bitmap?

    codice:
        oWin[x].Fill.Color  := TAlphaColorRec.Black;
        oWin[x].Fill.Kind := TBrushKind.Bitmap;
        oWin[x].Fill.Bitmap.Bitmap.SetSize(aWin[x][1], aWin[x][2]);
    Ciao!
    Infatti, è come hai detto tu, grazie. Mi ha tratto in inganno il fatto che la bitmap creata è di dimensione 0x0, alla fine c'e' solo da settare la size l'oggetto Tbitmap lo crea il componente.
    Un saluto e grazie ancora
    N.

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.