Toon posts:

[Kylix/Delphi] TBitmap als reference doorgeven

Pagina: 1
Acties:

Verwijderd

Topicstarter
In unit V4L2 maak ik een foto m.b.v. Video For Linux 2 en vervolgens wil ik die foto in de Bitmap stoppen die meegegeven wordt als paramter by reference.

In een andere unit heb ik een gewone TBitmap aangemaakt. Deze parameter geef ik vervolgens mee aan GetPhotoHead(....);

Maar dit gaat helaas fout.Ik krijg de volgende foutmelding:

Access violation at address 0805456B, accessing address 00000000


Maar ik snap het niet. Ik heb die TBitmap eerst wel gecreeerd.

Nu is er wel een andere methode waarmee ik het wel werkend heb gekregen. Alleen dan maak ik steeds een nieuwe TBitmap aan bij het opvragen van een foto. Dat is niet de meeste mooie en snelste manier.

Weet iemand waar dit aan kan liggen?

Delphi:
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
35
36
function TV4l2.GetPhotoHead(var PhotoBitmap: TBitmap): Cardinal;
var Status: Integer;
    i: Integer;
    Row: Integer;
    PSL: PByteArray;
begin
  Status := __read(fd, Bitmap.ScanLine[0]^, 640 * 480 * 4);
  if Status < 0 then
  begin
    Result := errno;
    Exit;
  end;

  i := Integer(PointerCropBuffer);
  for Row := 0 to 479 do
  begin
    PSL := Bitmap.ScanLine[Row];
    Move(PSL^[179 * 4], Ptr(i)^, 360 * 4);
    i := I + 360 * 4;
  end;

  try
    Move(PointerCropBuffer^, (PhotoBitmap.ScanLine[0])^, 360 * 480 * 4);
  except
    on E: Exception do
      ShowMessage('Error: ' + E.Message);
  end;
end;


  // het aanroepen gaat als volgt:
  var PhotoBitMap: TBitmap;
  
  PhotoBitmap := TBitmap.Create;

  V4L2.GetPhotoHead(PhotoBitmap);

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

De getphotohead verwacht een bitmap van 640x480 groot, en een net aangemaakte TBitMap is standaard 100 bij 100 ;)

[ Voor 177% gewijzigd door Creepy op 17-06-2003 15:37 ]

"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


Verwijderd

Delphi:
1
2
3
4
5
6
  // het aanroepen gaat als volgt:
  var PhotoBitMap: TBitmap;
  
  PhotoBitmap := TBitmap.Create;

  V4L2.GetPhotoHead(PhotoBitmap);


Wat levert die V4L2.GetPhotoHead precies af? Als dat een bitmap is, dan klopt deze assignment niet. Je zou dan:

Delphi:
1
PhotoBitMap.Assign(V4l2.GetPhotoHead)


moeten doen.

Verwijderd

Topicstarter
Creepy bedankt.

Het klopt wat jij zegt. Na het aangeven van de juiste grootte werkt het als een trein. (Beetje dom dat ik er zelf niet ben opgekomen :) )

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 17 June 2003 @ 15:40:
Wat levert die V4L2.GetPhotoHead precies af? Als dat een bitmap is, dan klopt deze assignment niet. Je zou dan:

Delphi:
1
PhotoBitMap.Assign(V4l2.GetPhotoHead)


moeten doen.
De gehele GetPhotoHead functie heeft tokkie gegeven, dus kijk zelf maar wat die functie aangeeft ;)

[ Voor 18% gewijzigd door Creepy op 17-06-2003 16:12 ]

"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


Verwijderd

Creepy schreef op 17 June 2003 @ 16:12:
[...]

De gehele GetPhotoHead functie heeft tokkie gegeven, dus kijk zelf maar wat die functie aangeeft ;)
/me haalt de feaces uit z'n ogen

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Uhm, waarom geef je die TBitmap eigenlijk by reference? Je instansieert het object buiten de functie en de functie verandert de waarde van de parameter verder ook niet (zou ie ook niet mogen als je em erbuiten instansieert).

日本!🎌


Verwijderd

Topicstarter
_Thanatos_ schreef op 17 June 2003 @ 23:17:
Uhm, waarom geef je die TBitmap eigenlijk by reference? Je instansieert het object buiten de functie en de functie verandert de waarde van de parameter verder ook niet (zou ie ook niet mogen als je em erbuiten instansieert).
De bitmap die ik meegeef verandert wel degelijk. Er wordt een nieuw frame van een camera ingezet.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Zucht.

Als je een object by value meegeeft, kun je nog wel methoden in dat object aanroepen en properties veranderen. Dat "var" wil alleen maar zeggen dat de variabele die de caller meegeeft, mag veranderen. In een geval van een object is dat dus het geheugenadres waar het zich bevindt. Meer niet.

Sterker nog, je kan em als constante meegeven en nog steeds alles met de bitmap doen wat je wilt. Zelfs vrijgeven. De variabele verandert zelf immers niet.

日本!🎌


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

_Thanatos_ schreef op 19 June 2003 @ 00:02:
Sterker nog, je kan em als constante meegeven en nog steeds alles met de bitmap doen wat je wilt. Zelfs vrijgeven. De variabele verandert zelf immers niet.
*zucht* ;)

Het is "good practive" om een const aan te geven als de variabele (of object) niet verandert, en een var om aan te geven dat de variabele (of de inhoud van een object) kan veranderen.

Zo kan je ook meteen de body van de functie een geheel nieuwe bitmap laten genereren als je dat zou willen zonder de interface te veranderen.

"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


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

ff verder mierenneuken dan :)

Mocht je nou een functie hebben die een bitmap teruggeeft (TBitmap.Create bijvoorbeeld), dan kun je die niet direct aan de functie meegeven, maar moet je em eerst in een variabele stoppen. Kost weer extra geheugen en rekentijd en regels code ;)

日本!🎌


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:45

Creepy

Tactical Espionage Splatterer

_Thanatos_ schreef op 19 June 2003 @ 16:53:
ff verder mierenneuken dan :)

Mocht je nou een functie hebben die een bitmap teruggeeft (TBitmap.Create bijvoorbeeld), dan kun je die niet direct aan de functie meegeven, maar moet je em eerst in een variabele stoppen. Kost weer extra geheugen en rekentijd en regels code ;)
Als we toch aan het mierenneuken zijn :)

Als je een bitmap creeert, aan een functie meegeeft, en vervolgens niks met die bitmap doet, ben je ook niet erg handig bezig. Dus die extra regel code en ene variabele extra zal je toch nog ergens anders moeten hebben dan ;)
En als je een functie hebt die als param een TBitmap verwacht en dan een TBitMap.create mee geeft.. wie free'd die bitmap dan? :P

"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


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Dat kan als die functie de bitmap ook weer teruggeeft...
Delphi:
1
2
//kun je em zo aanroepen:
DoeIetsMetBitmap(TBitmap.Create).Free;

maargoed, bijster nuttig is het dus niet :P

日本!🎌

Pagina: 1