Für mich, der grad aus der Kneipe kommt und aus lauter Frust ein .. zwei Bier zu viel getrunken hat, weil er nicht ein einzigstes Dartspiel gewonnen hat (man, und ich war mal so gut darin), stellt sich die Frage:
Willst du was über Zeiger lernen, oder des Problem lösen.
Für die Lösung hätte ich einen Tipp.
Lass das ganze Zeiger-gemurks (^ und @) weg. Dein Parameter
aImage ist sowieso ein Zeiger auf das Original-Image, so wie Muetze1 schreibt.
Mit dem kannst du genauso weiter arbeiten, als wenn du das Image "direkt in der Form" ansprichst. Das ist nämlich letzten Endes eben auch nur ein Zeiger.
Für das, was ich deinem Code entnehmen kann reicht das völlig.
Zitat von
nEmai:
Ok, das heißt, wenn ich es richtig versteh:
Image.Picture.Bitmap ist ein Pointer auf eine Bitmap, also eine Speicheradresse.
Dann müsste
Delphi-Quellcode:
var
ptrBitmap: ^TBitmap;
begin
ptrBitmap:= Image.Picture.Bitmap;
end;
ja funktionieren.
Ähm ...
... Nein. Das wäre ja quasi ein Zeiger auf einen Zeiger.
Delphi-Quellcode:
var
oBitmap: TBitmap;
begin
oBitmap:= Image.Picture.Bitmap;
end;
... würde reichen. Du kopierst nur den Zeiger. Das ist doch das was du vor hast, oder?
Bitte nicht übel nehmen, aber ich glaube, du hast den Begriff "Instanz" nicht richtig vereinnahmt.
TImage ist die Klasse.
mit
aImage := TImage.create (??);
instanzierst du die Klasse.
aImage ist also eine Instanz der Klasse
TImage, was eigentlich nur ein Zeiger ist (siehe Muetze1).
Alle Unterobjekte von
aImage sind auch nur Instanzen (Zeiger) der entsprechenden Klassen.
So sollte es eigentlich funktionieren:
Delphi-Quellcode:
constructor TBarGraph.Create(var aImage: TImage; aForm: TForm);
const
MAXRANDOM= 530;
BARQUANTITY= 150;
var
iCounter: Integer;
begin
inherited Create;
setLength(FBars, BARQUANTITY);
for iCounter:= 0 to High(FBars) do
FBars[iCounter]:= random(MAXRANDOM)+1;
aImage.Picture.Bitmap.Height:= MAXRANDOM+20;
aImage.Picture.Bitmap.Width:= (Length(FBars)*4)+8;
aImage.Height:= PaImage.Picture.Bitmap.Height;
aImage.Width:= aImage.Picture.Bitmap.Width;
aForm.Height:= aImage.Picture.Bitmap.Height+130;
aForm.Width:= aImage.Picture.Bitmap.Width+100;
end;
Wenn du Objekte (also alles das, was von TObject erbt) in eine Procedure/Funktion übergibst, übergibst du eigentlich nur den Zeiger auf das Objekt.
das ist das gleiche wie zB.
Delphi-Quellcode:
procedure HoleBier (Var aGlas : Integer); // Zeiger auf Variable wird kopiert
begin
if aGlas = 0 then
aGlas := 100;
end;
Ich gebe dir mein leeres Bierglas mit, und du kommst mit dem _selbem_ Glas wieder zurück, nur das es jetzt voll ist.
Mit folgender Funktion würdest du mit _meinem_ Glas wieder zurück kommen, es wäre aber weiterhin leer.
Delphi-Quellcode:
procedure HoleBier (aGlas : Integer); // Variable wird kopiert
begin
if aGlas = 0 then
aGlas := 100;
end;
Was mit dem Bier passiert ist weiß ich nicht. Es ist halt weg.
Da aber Glas eigentlich ein TObject ist (sein sollte), welches unter anderem das Property Inhalt hat, kommst du mit folgender Funktion:
Delphi-Quellcode:
type TGlas = Class (TObject);
public
Property Inhalt : Integer;
[...]
procedure HoleBier (aGlas : TGlas); // Zeiger auf Object wird kopiert
begin
if aGlas.Inhalt = 0 then
aGlas.Inhalt := 100;
end;
mit _meinem_ Glas wieder, welches aber wieder voll wäre.
Mit TImage ist es genau das gleiche.
Ich hoffe, ich hab keinen Quatsch erzählt ...