Delphi függvény visszatérési értéke TBitmap

Delphi függvény visszatérési értéke TBitmap
2010-09-09T16:10:57+02:00
2010-09-09T18:59:39+02:00
2022-11-19T03:00:42+01:00
zidan26
Kedves mindenki!

Van egy nagyon érdekes esetem. Amit nem tudok megoldani és remélem valaki meg tudja mondani mi is a probléma.

Van ez a függvényem, paraméterként adok neki egy listát ami pontokat tartalmaz, továbbá a canvas méreteit. Vissza kellene adnia a megkreált TBitmapot.
//---------- getBitmapByList function TForm1.getBitmapByList(list : TList; width1, height1 : Integer): TBitmap; var bt : TBitmap; I: Integer; arrayOfPoint : TPointArray; begin //WriteFile('-----','getBitmapByList.txt'); if not Assigned(bt) then bt := Tbitmap.Create; bt.Width := width1; bt.Height := height1; bt.PixelFormat := pf24bit; bt.Canvas.Pen.Color:= clBlack; bt.Canvas.Brush.Style := bsClear; for I := 0 to list.Count - 1 do begin arrayOfPoint:= TPointArray(CPointOfZ(list[I]).getPoints); bt.Canvas.Polyline(arrayOfPoint); end; Result := bt; end; //-------
De az a helyzet hogy leáll ezzel a hibával:

Access violation at address 004CAA97 in module 'VGI.exe'. Read of address 00000011.

Egymás után többször is meghívom. néha 77.-nél kiakad, néha már a 3.-nál.
Tudja valaki hogy miért? Volt már valakinek hasonló esete?


A válaszokat előre is köszi.

Zidan
Mutasd a teljes hozzászólást!
Igazából nincs is szükség a bt változóra, így is meg lehet oldani:
function TForm1.getBitmapByList(list : TList; width1, height1 : Integer): TBitmap; var I: Integer; arrayOfPoint : TPointArray; begin Result := Tbitmap.Create; Result.Width := width1; Result.Height := height1; Result.PixelFormat := pf24bit; Result.Canvas.Pen.Color:= clBlack; Result.Canvas.Brush.Style := bsClear; for I := 0 to list.Count - 1 do begin arrayOfPoint:= TPointArray(CPointOfZ(list[I]).getPoints); Result.Canvas.Polyline(arrayOfPoint); end; end;
Persze, nem ártana bele hibakezelés.
Mutasd a teljes hozzászólást!

  • if not Assigned(bt) then
    Ez nem jó, mivel nincs a bt-nek kezdeti értéke, így bármire mutathat a memóriában, ami tuti, hogy nem TBitMap lesz. Vagy ne vizsgáld, vagy írd be elé, hogy bt := nil;
    Mutasd a teljes hozzászólást!
  • A bt lokális változó ha kilépsz a függvényből akkor megszűnik,
    ne a függvényben definiáld, vagy használj dinamikus változót
    Mutasd a teljes hozzászólást!
  • Igazából nincs is szükség a bt változóra, így is meg lehet oldani:
    function TForm1.getBitmapByList(list : TList; width1, height1 : Integer): TBitmap; var I: Integer; arrayOfPoint : TPointArray; begin Result := Tbitmap.Create; Result.Width := width1; Result.Height := height1; Result.PixelFormat := pf24bit; Result.Canvas.Pen.Color:= clBlack; Result.Canvas.Brush.Style := bsClear; for I := 0 to list.Count - 1 do begin arrayOfPoint:= TPointArray(CPointOfZ(list[I]).getPoints); Result.Canvas.Polyline(arrayOfPoint); end; end;
    Persze, nem ártana bele hibakezelés.
    Mutasd a teljes hozzászólást!
  • A bt lokális változó ha kilépsz a függvényből akkor megszűnik

    Ez nem C++, nem szűnik meg.
    Az igazság
    Itchycoo
    nál van (odaát :))

    Szerk.: annyiban igazad van, hogy maga a változó megszűnik,
    (amennyiben letakarítódik a stack-ről) de az általa mutatott objektum, amit a visszatérési érték képvisel, az nem.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd