Result - bitmapa

0

Już sobie poradziłem z tym wydłużając nieco kod i dodając treść funkcji do głównej procedury programu, ale z ciekawości się zapytam.
Bo mam taki przykładowo kod:

function narysuj:TBitmap;
var b:TBitmap;
begin
 b:=TBitmap.Create;
 .... {cośtam z bitmapą}
 Result:=b;
 b.Free; {i tu jest błąd}
end;

nie można zwolnić tej bitmapy nawet po przekazaniu jej do resulta. Dlaczego ? Kiedy ją zwolnię to występuje Access violation. Jeśli kilka razy wykonam procedurę to program coraz wolniej chodzi bo zaczyna się zapychać RAM. Jak zwolnić bitmapę i czy to jest możliwe w takim przypadku ?</wiki>

0

u mnie to działa. podaj kod całej funkcji to popatrzymy.

0

ta funkcja jest dość długa ale robiłem test na nowej formie i mi to nie chciało działać nawet w najprostszej formie.
Np. dam tam LoadFromFile a potem bede chciał to wywołać żeby Assignowało ten rysunek to TImage'a, i wyskakuje już ten błąd.
A ten błąd to nie jest dokładnie w tej linii Free tylko w tej linii w której chce to przywołać ten rysunek z tej funkcji albo jakoś skorzystać z tego.

0

To go nie zwalniaj.

Po co ma funkcja zwracać wskaźnik do obiektu który zniszczyłeś?

0

to jak zrobić żeby się zwolnił po wykorzystaniu ?

0

zasada prosta: nie twórz bitmapy! użyj utworzonej bitmapy jako parametr procedury! możesz stosować jako prarametry obiekty i operować na nich! będzie łatwiej i przyjemniej a końcowy użytkownik będzie jeszcze mógł robić co zechce z bitmapką. proste?

jak chcesz funkcje to będzie proste, bo:

function narysuj(bmDest: TBitmap):boolean;
begin
  if assigned(bmDest) then
    begin
      {tu robisz z bitmapką co chcesz}
      Result:=True;
    end
  else
    Result:=False;
end;
0

no napisałem że sobie już poradziłem z tym problemem tylko chciałem wiedzieć jak go można rozwiązać. A widzę że nie można ... znaczy można ale nie tak jakbym chciał

0

Daj:

Result.Assign(b);
//...
b.Free;

albo
...
przeprowadź wszystkie operacje na Result:

function TForm1.OdbijWPionie(Bitmapa: TBitmap): TBitmap;
//nieistotne co to za funkacja, wziąłem pierwszą z brzegu
begin
  Result := TBitmap.Create;
  Result.PixelFormat:=pf24bit;
  Result.Width:=10;  //nadajesz jej początkowy rozmiar, 
  Result.Height:=10; //żeby nie wywaliło Cię w kosmos

  //i jakie tam chcesz operacje
end;

Mnie to działa ;)

0

mozna tez zrobic tak:
(dodac VAR)

function narysuj(var bmDest: TBitmap):boolean;
begin
 if assigned(bmDest) then
  begin
   {tu robisz z bitmapką co chcesz, to co na niej zrobisz to taki bedzie wynik}
   Result:=True;
  end
 else
  Result:=False;
end;
0

Dzieki VAR będziesz mógł zmienic wskaźnik, a chyba nie o to chodzi. :-8

1 użytkowników online, w tym zalogowanych: 0, gości: 1