Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Property (Stackoverload) (https://www.delphipraxis.net/8427-property-stackoverload.html)

Taladan 4. Sep 2003 14:28


Property (Stackoverload)
 
Bei unten angegeben Code (bis jetzt soll nur die zuordnung der Images funktionieren) erhalte ich keine Fehlermeldung, wenn ich sie compeliere. Doch sobald ich die Komponente in der Form plaziere, steht im Objektinspektor, sobald ich die Untereigenschaften öffne Stacküberlauf und delphi endet mit einer fehlermeldung.

Wer kann helfen?

Delphi-Quellcode:
unit TaladansPanel;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TBitmaps = class(TPersistent)
  private
    function GetObenLinks : TBitmap;
    procedure SetObenLinks(Value : TBitmap);
    function GetObenMitte : TBitmap;
    procedure SetObenMitte(Value : TBitmap);
    function GetObenRechts : TBitmap;
    procedure SetObenRechts (Value : TBitmap);
    function GetMitteLinks : TBitmap;
    procedure SetMitteLinks (Value : TBitmap);
    function GetMitteMitte : TBitmap;
    procedure SetMitteMitte (Value : TBitmap);
    function GetMitteRechts : TBitmap;
    procedure SetMitteRechts (Value : TBitmap);
    function GetUntenLinks : TBitmap;
    procedure SetUntenLinks(Value : TBitmap);
    function GetUntenMitte : TBitmap;
    procedure SetUntenMitte(Value : TBitmap);
    function GetUntenRechts : TBitmap;
    procedure SetUntenRechts (Value : TBitmap);
  public
    procedure Assign(Source: TPersistent); override;
  published
    property ObenLinks : TBitmap Read GetObenLinks Write SetObenLinks;
    property ObenMitte : TBitmap Read GetObenMitte Write SetObenMitte;
    property ObenRechts : TBitmap Read GetObenRechts Write SetObenRechts;
    property MitteLinks : TBitmap Read GetMitteLinks Write SetMitteLinks;
    property MitteMitte : TBitmap Read GetMitteMitte Write SetMitteMitte;
    property MitteRechts : TBitmap Read GetMitteRechts Write SetMitteRechts;
    property UntenLinks : TBitmap Read GetUntenLinks Write SetUntenLinks;
    property UntenMitte : TBitmap Read GetUntenMitte Write SetUntenMitte;
    property UntenRechts : TBitmap Read GetUntenRechts Write SetUntenRechts;
  end;


  TTaladansPanel = class(TGraphicControl)
  private
    { Private-Deklarationen }
    FBitmaps : TBitmaps;
    ObenLinks : TBitmap;
    ObenRechts : TBitmap;
    ObenMitte : TBitmap;
    MitteLinks : TBitmap;
    MitteMitte : TBitmap;
    MitteRechts : TBitmap;
    UntenLinks : TBitmap;
    UntenMitte : TBitmap;
    UntenRechts : TBitmap;
    procedure zeichen;
    procedure SetBitmaps( const Value: TBitmaps);
  protected
    { Protected-Deklarationen }
  public
    constructor Create(AOwner:Tcomponent); override;
    destructor Destroy; override;
    { Public-Deklarationen }
  published               //im Objektinspektor
    { Published-Deklarationen }
    property Bitmaps : TBitmaps read FBitmaps write SetBitmaps;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('TaladansTools', [TTaladansPanel]);
end;

{Taladans Panel}

constructor TTaladansPanel.Create(AOwner:Tcomponent);
begin
  inherited;
  FBitmaps := TBitmaps.create;
  ObenLinks := TBitmap.create;;
  ObenRechts := TBitmap.create;;
  ObenMitte := TBitmap.create;;
  MitteLinks := TBitmap.create;;
  MitteMitte := TBitmap.create;;
  MitteRechts := TBitmap.create;;
  UntenLinks := TBitmap.create;;
  UntenMitte := TBitmap.create;;
  UntenRechts := TBitmap.create;;
end;

destructor TTaladansPanel.destroy;
begin
  FBitmaps.free;
    ObenLinks.free;
    ObenRechts.free;
    ObenMitte.free;
    MitteLinks.free;
    MitteMitte.free;
    MitteRechts.free;
    UntenLinks.free;
    UntenMitte.free;
    UntenRechts.free;
  inherited;
end;



procedure TTaladansPanel.SetBitmaps( const Value: TBitmaps);
begin
  FBitmaps.assign(value);
end;

procedure TTaladansPanel.Zeichen;
begin
//  FObenLinksPicture.draw;
end;

{BitmapsValue}

procedure TBitmaps.Assign(Source: TPersistent);
begin
end;

{ Set }
procedure TBitmaps.SetObenLinks(Value : TBitmap);
begin
  ObenLinks.assign(value);
end;
procedure TBitmaps.SetObenMitte(Value : TBitmap);
begin
 ObenMitte.assign(value);
end;
procedure TBitmaps.SetObenRechts(Value : TBitmap);
begin
  ObenRechts.assign(value);
end;
procedure TBitmaps.SetMitteLinks(Value : TBitmap);
begin
  MitteLinks.assign(value);
end;
procedure TBitmaps.SetMitteMitte(Value : TBitmap);
begin
  MitteMitte.assign(value)
end;
procedure TBitmaps.SetMitteRechts(Value : TBitmap);
begin
  MitteMitte.assign(value);
end;
procedure TBitmaps.SetUntenLinks(Value : TBitmap);
begin
  UntenLinks.assign(value);
end;
procedure TBitmaps.SetUntenMitte(Value : TBitmap);
begin
  UntenMitte.assign(value);
end;
procedure TBitmaps.SetUntenRechts(Value : TBitmap);
begin
  UntenRechts.assign(value);
end;
{get }

function TBitmaps.GetObenLinks : TBitmap;
begin
   Result := ObenLinks;
end;
function TBitmaps.Getobenmitte : TBitmap;
begin
   Result := obenmitte;
end;
function TBitmaps.Getobenrechts : TBitmap;
begin
   Result := obenrechts;
end;

function TBitmaps.Getmittelinks : TBitmap;
begin
   Result := mittelinks;
end;
function TBitmaps.Getmittemitte : TBitmap;
begin
   Result := mittemitte;
end;
function TBitmaps.Getmitterechts : TBitmap;
begin
   Result := mitterechts;
end;

function TBitmaps.Getuntenlinks : TBitmap;
begin
   Result := untenlinks;
end;
function TBitmaps.Getuntenmitte : TBitmap;
begin
   Result := untenmitte;
end;
function TBitmaps.Getuntenrechts : TBitmap;
begin
   Result := untenrechts;
end;

end.

roderich 4. Sep 2003 14:42

Re: Property (Stackoverload)
 
wenn Du in

Delphi-Quellcode:
procedure TBitmaps.SetObenLinks(Value : TBitmap);
begin
  ObenLinks.assign(value);
end;
dein ObenLinks änderst (assign), dann wird sofort wieder SetObenLinks aufgerufen und das so lange, bis dein Stack übergelaufen ist.


Roderich

negaH 4. Sep 2003 14:43

Re: Property (Stackoverload)
 
Das muß zu einem Stacküberlauf führen.

Schau mal, TBitmaps enthält die Properties mit deinen 9 Bitmaps. Dazu benutzt du write/read Methoden. Besonderst die read Methoden wie GetObenLinks greifen auf die eigene Eigenschaft ObenLinks zu und geben das als Resultat zurück. Da ObenLinks eine Property ist die GetObenLinks aufruft und die wiederum auf die Eigenschaft ObenLinks zugreift die die read Methode GetObenLinks aufruft die die Eigenschaft ObenLinks zurückgibt die die read Methode GetObenLinks aufruft die wiederum auf die Eigenschaft ObenLinks zugreift die die read Methode GetObenLinks aufruft die die Eigenschaft ObenLinks zurückgibt die die read Methode GetObenLinks aufruft die die Eigenschaft ObenLinks zurückgibt die die read Methode GetObenLinks aufruft die wiederum auf die Eigenschaft ObenLinks zugreift die die read Methode GetObenLinks aufruft die die Eigenschaft ObenLinks zurückgibt die die read Methode GetObenLinks aufruft die die Eigenschaft ObenLinks zurückgibt die die read Methode GetObenLinks aufruft die wiederum auf die Eigenschaft ObenLinks zugreift die die read Methode GetObenLinks aufruft die die Eigenschaft ObenLinks zurückgibt die die read Methode GetObenLinks aufruft....

sorry Postingüberlauf :)

Gruß Hagen

negaH 4. Sep 2003 14:53

Re: Property (Stackoverload)
 
So nun mal im Ernst, deine Klassen sind sehr unglücklich deklariert.
Delphi-Quellcode:
type
  TBitmaps = class(TPersistent)
  private
    FBitmaps: array[0..8] of TBitmap;

    function GetBitmap(Index: Integer): TBitmap;
    procedure SetBitmap(Index: Integer; Value: TBitmap);
  protected
  public
    destructor Destroy; override;
    procedure Assign(Source: TPersistent); override;
  published
    property TopLeft: TBitmap index 0 read GetBitmap write SetBitmap;
    property TopMiddle: TBitmap index 1 read GetBitmap write SetBitmap;
    property TopRight: TBitmap index 2 read GetBitmap write SetBitmap;

    property MiddleLeft: TBitmap index 3 read GetBitmap write SetBitmap;
    property MiddleMiddle: TBitmap index 4 read GetBitmap write SetBitmap;
    property MiddleRight: TBitmap index 5 read GetBitmap write SetBitmap;

    property BottomLeft: TBitmap index 6 read GetBitmap write SetBitmap;
    property BottomMiddle: TBitmap index 7 read GetBitmap write SetBitmap;
    property BottomRight: TBitmap index 8 read GetBitmap write SetBitmap;
  end;

implementation

function TBitmaps.GetBitmap(Index: Integer): TBitmap;
begin
  if FBitmaps[Index] = nil then FBitmaps[Index] := TBitmap.Create;
  Result := FBitmaps[Index];
end;

procedure TBitmaps.SetBitmap(Index: Integer; Value: TBitmap);
begin
  GetBitmap(Index).Assign(Value);
end;

procedure TBitmaps.Assign(Source: TPersistent);
var
  I: Integer;
  S: TBitmaps; absolute Source;
begin
  if Source is TBitmaps then
  begin
    for I := Low(FBitmaps) to High(FBitmaps) do
      SetBitmap(I, S.GetBitmap(I));
  end else inherited Assign(Source);
end;

destructor TBitmaps.Destroy;
var
  I: Integer;
begin
  for I := Low(FBitmaps) to High(FBitmaps) do
    FreeAndNil(FBitmaps[I]);
  inherited Destroy;
end;
Allerdings, ich vermute das alle 9 Bitmaps die gleiche Größe + Farbauflösung besitzen. Wenn ja, dann ist eine TImageList mit 9 Bitmaps die absolut bessere Wahl.

Gruß Hagen

Taladan 4. Sep 2003 14:54

Re: Property (Stackoverload)
 
FreeAndNil kennt mein delphi nicht. Wie kann ich das umgehen?

Taladan 4. Sep 2003 15:11

Re: Property (Stackoverload)
 
Hat dieser Code die selbe Bedeutung wie dein FreeAndNil

Delphi-Quellcode:
    FBitmaps[I].free;
Dumme Frage nebenbei, wenn ich jetzt eine Bitmap über dieses Objekt so mit einbinde, muß ich dann beim später compilierten .exe die .bmp mitgeben?

neolithos 4. Sep 2003 15:14

Re: Property (Stackoverload)
 
FreeAndNil steht in SysUtils

Und warum rechnest du nicht aus einem großen Bild deine 9 Papierteile heraus?

Taladan 4. Sep 2003 20:10

Re: Property (Stackoverload)
 
es geht für den umgekehrten weg. Ich will eine art panel erschaffen, wo man einen schicken hintergrund mit umrandung hat und dieser sich selbst zeichnet wiederholend und nicht vergrößert und verkleinert, was selbiges wieder pixelig oder unschön in verschiedenen auflösungen machen kann. Der Mittlere Teil wird dann der eigendliche bereich, die seiten, die mitte, oben und unten werden durch wiederholende bilder erweitert, nur die ecken bleiben als statisches einzelbild stehen.

Christian Seehase 5. Sep 2003 19:09

Re: Property (Stackoverload)
 
Moin Taladan,

FreeAndNil ist das gleiche wie

Delphi-Quellcode:
ObjectVariable.Free;
ObjectVariable := nil;
Vorteil:
Du kannst die Objektvariable auf nil prüfen, um festzustellen, ob ihr noch ein Objekt zugerdnet ist (<> nil) oder nicht (=nil).
Bei Free bleibt die Adresse in der Variablen erhalten, aber das Objekt wird zerstört, so dass ein Zugriff in einer Access Violation münden würde.

@neolithos:
FreeAndNil gibt's erst seit D5.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:16 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