AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zeigerproblem

Ein Thema von nEmai · begonnen am 4. Apr 2008 · letzter Beitrag vom 5. Apr 2008
Antwort Antwort
Seite 2 von 2     12   
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#11

Re: Zeigerproblem

  Alt 5. Apr 2008, 04:31
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 ...
  Mit Zitat antworten Zitat
Larsi

Registriert seit: 10. Feb 2007
2.262 Beiträge
 
Delphi 2007 Professional
 
#12

Re: Zeigerproblem

  Alt 5. Apr 2008, 04:40
[OT] Warum seid Ihr alle noch online? [OT]
Ein Tag ohne Delphi ist ein verlorener Tag!

Homepage zu meinem neuen Programm: StreamZ
  Mit Zitat antworten Zitat
nEmai

Registriert seit: 9. Feb 2008
29 Beiträge
 
Delphi 2007 Professional
 
#13

Re: Zeigerproblem

  Alt 5. Apr 2008, 14:14
So, nachdem ich mich durch die vielen Informationen durchgearbeitet hab..

@Muetze1:
FreeAndNil() kennt mein Delphi 2005 nicht.

@gmc616:
Eigentlich dachte ich schon, dass mir klar ist, was eine Instanz ist.
Dein Konstruktorvorschlag umgeht das Thema des Threads. oO
(Ich brauch die Variable in der Klasse.)

@Beide:
Das einzige Problem, das ich hatte, war offenbar der Umgang mit Objektvariablen.
Mein alter Gedankengang etwas genauer:
Delphi-Quellcode:
var
  ptrBitmap: ^TBitmap;
begin
  Image.Picture.Bitmap = 0x12345 //Bsp.Adresse
  ptrBitmap = null

  ptrBitmap:= Image.Picture.Bitmap; //null <-überschreibt- 0x12345

  Image.Picture.Bitmap = 0x12345
  ptrBitmap = 0x12345
end;
Aber dank den guten Erklärungen hab ich es jetzt denk ich richtig verstanden. ^^

MfG.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#14

Re: Zeigerproblem

  Alt 5. Apr 2008, 14:29
Zitat von nEmai:
@Muetze1:
FreeAndNil() kennt mein Delphi 2005 nicht.
Also Delphi 4, Delphi 5, Delphi 6, Delphi 7 sowie BDS2006 kennen diese Funktion in der SysUtils. Mit diesen Delphi Versionen habe ich schon gearbeitet und weiß das die Funktion definitiv vorhanden ist. Schon allein da BDS2006 nach Delphi 2005 herauskam, ist es für mich schwer zu glauben, dass es diese Funktion in der Version nicht mehr geben sollte.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: Zeigerproblem

  Alt 5. Apr 2008, 14:46
@nEmai: Nochmal TBitmap ist schonn ein Zeiger (Referenz)!!!!!!!!
Markus Kinzler
  Mit Zitat antworten Zitat
nEmai

Registriert seit: 9. Feb 2008
29 Beiträge
 
Delphi 2007 Professional
 
#16

Re: Zeigerproblem

  Alt 5. Apr 2008, 15:10
@Muetze1
Delphi-Quellcode:
var
  Bitmap: TBitmap;
begin
  Bitmap:= TBitmap.Create;
  
  Bitmap.FreeImage;
  Bitmap.Free;
  Bitmap.FreeInstance;
end;
Das ist alles was mir an dem Bsp. mit free angezeigt wird, bei FreeAndNil Compilierfehler.

Zitat von mkinzler:
@nEmai: Nochmal TBitmap ist schonn ein Zeiger (Referenz)!!!!!!!!
Zitat von nEmai:
Aber dank den guten Erklärungen hab ich es jetzt denk ich richtig verstanden. ^^
Is ja recht... oO
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: Zeigerproblem

  Alt 5. Apr 2008, 15:36
FreeAnNil() ist eine Prozedur und keine Methode:

FreeAndNil( Bitmap);
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz