[delphi] aparte procedures/functies voor bitmap

Pagina: 1
Acties:

  • MisterE
  • Registratie: April 2002
  • Laatst online: 19:21
voor mijn proggie gebruik ik aparte routines die een plaatje moeten aanpassen.
In het begin gebruikte ik 'functies' die dan een 'result' creerde.
Nou wil ik eigenlijk de functie omzetten naar een procedure en de bitmap
overgeven als een 'var' zodat geen memory leak ontstaat.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
procedure MakeCustomPosition(var SourceBMP : TBitmap; SizeX,SizeY : Word; XOffset,YOffset : SmallInt);
var
  XStart, YStart : Word;
  Temp : TBitmap;
begin
  Temp := TBitmap.Create;
  Try
    Temp.Width  := SizeX;
    Temp.Height := SizeY;
    Temp.PixelFormat := SourceBMP.PixelFormat;

    Temp.Canvas.Brush.Color := clBlack;
    Temp.Canvas.FillRect(Rect(0, 0, SizeX, SizeY));

    (* maak veranderingen aan temp m.b.v SourceBMP*)

    Temp.SaveToFile('c:\temp.bmp');
    SourceBMP := Temp;
  Finally;
    Temp.Free;
  End;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  lullo : TBitmap;
begin
  lullo := TBitmap.Create;
  lullo.LoadFromFile('c:\25.bmp');
  MakeCustomPosition(lullo,1024,768,0,0);
  lullo.SaveToFile('c:\edited.bmp');
  lullo.Free;
end;

nou heeft het programma problemen met de regel: SourceBMP := Temp;
waarom?? en hoe kan ik dit het beste oplossen?
Of is het toch het beste om een functie te gebruiken en die TBitmap die
ie maakt vrij te geven met de aanroepende procedure.

Verwijderd

Je laat source naar temp verwijderen en daarna verwijder je temp.. dus dan wijst source naar nix

  • MisterE
  • Registratie: April 2002
  • Laatst online: 19:21
dit is gewwon een voorbeeld, ik heb de veranderingen aan 'temp' weggelaten

Verwijderd

ok 2e poging uitleg van timD gaat schijnbaar langs je heen.

temp is een verwijzing naar je origneel dus als jij een temp.Free doet, gooi je ook je origneel weg , zo duidelijker?

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 21:25

Delphi32

Heading for the gates of Eden

Ter verduidelijking van Yarvieh en TimD:
Als je een TBitmap in je parameters meegeeft, is het in de meeste gevallen volstrekt overbodig (en vaak, zoals hier in jouw code, nogal gevaarlijk) om deze als var parameter mee te sturen.
Een procedure die een TObject als parameter binnen krijgt, mag vrijelijk alle attributen van de parameter benaderen (en dus veranderingen in het object aanbrengen) zonder dat een locale Temp-achtige constructie nodig is. Je SourceBMP parameter is eigenlijk een Pointer naar een bestaande TBitmap, waarop jij binnen die procedure acties kunt uitvoeren (SourceBMP.Clear of wat dan ook). Deze acties hebben dus direct effect in SourceBMP.
Door SourceBMP als Var mee te sturen, nodig je de procedure uit om de pointer naar je originele TBitmap aan te passen, en dat lijkt me bijna nooit de bedoeling.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18:56

Creepy

Tactical Espionage Splatterer

Op zaterdag 06 april 2002 19:52 schreef MisterE het volgende:
voor mijn proggie gebruik ik aparte routines die een plaatje moeten aanpassen.
In het begin gebruikte ik 'functies' die dan een 'result' creerde.
Nou wil ik eigenlijk de functie omzetten naar een procedure en de bitmap
overgeven als een 'var' zodat geen memory leak ontstaat.
Hmm.. moet je mij eens uitleggen waarom je dan een memory leak hebt?
code:
1
2
3
4
5
function doeietsmetbitmap(blaat tbitmap): tbitmap;
begin
     //blaat
     result:=blaat;
end;

Aangezien objecten op deze manier stiekum pointers zijn, wijzen blaat, en het result van de functie naar hetzelfde.

goh:=doeietsmetbitmap(goh) geeft naar mijn idee geen memoryleak.

Heeft een tbitmap geen assign? Want dan is
sourcebitmap.assign(temp) een stuk netter dan sourcebitmap:=temp, en verwijzen sourcebitmap en temp NIET naar hetzelfde dus geeft een temp.free ook geen problemen.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1