Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TImage.Picture Referenz (!) auf TPicture? (https://www.delphipraxis.net/68141-timage-picture-referenz-auf-tpicture.html)

Corelgott 25. Apr 2006 11:17


TImage.Picture Referenz (!) auf TPicture?
 
Hi @ all,

ich bin gerade mal wieder zu doof und komm nicht drauf.

Wie verlgeiche ich, ob ein TPicture-Object Leer ist?

image1.picture = nil... ist NIE true
assigned(image1.picture) ist IMMER true
pointer(image1.picture) = nil ist auch NIE true

Laut hilfe ist ein Picture (von TImage) ist eine "Referenz" (Dachte das gibt es gar ned soo richtig in delphi... Entweder Pointer oder Obj?!) auf ein TPicture-Objekt.
Hmm eine Referenz... Wie prüft man Referenzen in delphi ordenlich?
Irgendwie ist das für mich so eine art grauzone zwischen Pointer und Objekt.
Eigentlich ist doch eine Referenz eine "Variable" der ein "speicherbereich" zugewiesen wird, in der ein Gültiges Obj liegt. (Was von irgend wem anderes mal mit Create instatziert wurde)
Also wenn man das mal vereinfacht ausfrückt eine art von delphi automatisch gehandlter Pointer?

Ich bin mal vollends verwirrt...
Kann mir das nochmal wer in einfachen worten, delphi spezifisch erklären?

Vielen Dank im Voraus!

cya
Corelgott

Hawkeye219 25. Apr 2006 11:23

Re: TImage.Picture Referenz (!) auf TPicture?
 
Hallo,

schaue mal in der Online-Hilfe unter Delphi-Referenz durchsuchenTPicture.Graphic.Empty nach.

Gruß Hawkeye

SirThornberry 25. Apr 2006 11:26

Re: TImage.Picture Referenz (!) auf TPicture?
 
hallo,

SizeOf(TObject) = SizeOf(Pointer) => Object = Pointer => Object Referenz = Pointer auf Instanzedaten eines Objectes.
Eine Objectinstanz zeigt also auf den Speicherbereich wo die Daten für das Object liegen (genau wie bei pointern).

Corelgott 25. Apr 2006 12:00

Re: TImage.Picture Referenz (!) auf TPicture?
 
hmm ok...

also auf picture.graphics(.empty) zu prüfen ist schon mal sehe hilfreich...! Thx
Aber wie nutzt man nun das wissen in einer eignen Komponente?

Wenn ich bei meiner Kompo ne eingenschaft picture:TPicture habe?

ich muss also zwingen eine Instanz des TPicture dafür erzeugen...
Aber wie muss der setter dafür aussehen?
Wein einfach nur

Delphi-Quellcode:
procedure setPic(var pic : TPicture);
begin
  self.fPicture := pic;
end;

macht es nicht so wie ich mir das vorstelle...

self.fPicture.assigne(pic); ???

oder muss ich es per rect und per hand "kopieren"?

thx
Corelgott

Hawkeye219 25. Apr 2006 12:28

Re: TImage.Picture Referenz (!) auf TPicture?
 
Was spricht gegen TPicture? Es unterstützt als TGraphic-Countainer mehrere Grafiktypen (bmp, jpg,...) und dürfte omit das Mittel der Wahl sein.
Die Zuweisung solltest du über

Delphi-Quellcode:
FPicture.Graphic.Assign (pic);
durchführen. Am besten schaust du mal im Quelltext zu TImage (Unit ExtCtrls) nach, wie die Borländer das gemacht haben. :wink:

Gruß Hawkeye

static_cast 25. Apr 2006 12:58

Re: TImage.Picture Referenz (!) auf TPicture?
 
Hallo,

eine prüfung mit
Delphi-Quellcode:
Picture.Graphic.Empty
ist nicht sinvoll, denn Graphic ist unter umständen nil wenn nicht schon was drin gesteckt hat. TGraphic auch ist nur eine abstakte klasse für "die eigentlich Bilder", welche ja TBitmap, TJPEGImage, TPNGObject etc. sind.

z.B. würde das hier nicht funktionieren:

Delphi-Quellcode:
var
  Pic:TPicture;
begin
  Pic:=TPicture.Create;
  if Pic.Graphic.Empty then Pic.Graphic.LoadFromFile('default.bmp');
  Pic.Free;
end;
aber so:

Delphi-Quellcode:
var
  Pic:TPicture;
begin
  Pic:=TPicture.Create;
  Pic.Graphic:=TBitmap.Create;
  if Pic.Graphic.Empty then Pic.Graphic.LoadFromFile('default.bmp');
  Pic.Free;
end;
das eigentlich laden der Bilder sollte auch eigentlich von TPicture übernommen werden mit LoadFromFile denn es übernimmt die verwaltung von Graphic.

Und Graphic.Assign ist auch nicht sinvoll wenn du mehrere Typen von Bildern verwendest, z.B. würde ein Assign in die hose gehen wenn dein Graphic von typ TBitmap ist und du aber nun ein TPNGObject hast...

Picture.Assign(AnderesPicture) wäre das richtige.

Hawkeye219 25. Apr 2006 13:12

Re: TImage.Picture Referenz (!) auf TPicture?
 
Zitat:

Zitat von static_cast
eine prüfung mit
Delphi-Quellcode:
Picture.Graphic.Empty
ist nicht sinvoll, denn Graphic ist unter umständen nil wenn nicht schon was drin gesteckt hat.
[..]
Und Graphic.Assign ist auch nicht sinvoll wenn du mehrere Typen von Bildern verwendest, z.B. würde ein Assign in die hose gehen wenn dein Graphic von typ TBitmap ist und du aber nun ein TPNGObject hast...

Ok, das mit dem möglichen Zugriff auf NIL hatte ich übersehen. :oops:

Der zweite Teil war mir so gar nicht bewußt! Danke für die Klarstellung, wieder etwas gelernt. :)

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz