![]() |
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. |
Re: Property (Stackoverload)
wenn Du in
Delphi-Quellcode:
dein ObenLinks änderst (assign), dann wird sofort wieder SetObenLinks aufgerufen und das so lange, bis dein Stack übergelaufen ist.
procedure TBitmaps.SetObenLinks(Value : TBitmap);
begin ObenLinks.assign(value); end; Roderich |
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 |
Re: Property (Stackoverload)
So nun mal im Ernst, deine Klassen sind sehr unglücklich deklariert.
Delphi-Quellcode:
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.
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; Gruß Hagen |
Re: Property (Stackoverload)
FreeAndNil kennt mein delphi nicht. Wie kann ich das umgehen?
|
Re: Property (Stackoverload)
Hat dieser Code die selbe Bedeutung wie dein FreeAndNil
Delphi-Quellcode:
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?
FBitmaps[I].free;
|
Re: Property (Stackoverload)
FreeAndNil steht in SysUtils
Und warum rechnest du nicht aus einem großen Bild deine 9 Papierteile heraus? |
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.
|
Re: Property (Stackoverload)
Moin Taladan,
FreeAndNil ist das gleiche wie
Delphi-Quellcode:
Vorteil:
ObjectVariable.Free;
ObjectVariable := nil; 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 04:51 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