AGB  ·  Datenschutz  ·  Impressum  







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

Property (Stackoverload)

Ein Thema von Taladan · begonnen am 4. Sep 2003 · letzter Beitrag vom 5. Sep 2003
Antwort Antwort
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#1

Property (Stackoverload)

  Alt 4. Sep 2003, 15:28
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.
Marco
  Mit Zitat antworten Zitat
roderich
(Gast)

n/a Beiträge
 
#2

Re: Property (Stackoverload)

  Alt 4. Sep 2003, 15:42
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
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#3

Re: Property (Stackoverload)

  Alt 4. Sep 2003, 15:43
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
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

Re: Property (Stackoverload)

  Alt 4. Sep 2003, 15:53
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
  Mit Zitat antworten Zitat
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Property (Stackoverload)

  Alt 4. Sep 2003, 15:54
FreeAndNil kennt mein delphi nicht. Wie kann ich das umgehen?
Marco
  Mit Zitat antworten Zitat
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#6

Re: Property (Stackoverload)

  Alt 4. Sep 2003, 16:11
Hat dieser Code die selbe Bedeutung wie dein FreeAndNil

    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?
Marco
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#7

Re: Property (Stackoverload)

  Alt 4. Sep 2003, 16:14
FreeAndNil steht in SysUtils

Und warum rechnest du nicht aus einem großen Bild deine 9 Papierteile heraus?
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von Taladan
Taladan

Registriert seit: 5. Aug 2003
Ort: Osnabrück
505 Beiträge
 
Delphi 2005 Professional
 
#8

Re: Property (Stackoverload)

  Alt 4. Sep 2003, 21:10
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.
Marco
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Property (Stackoverload)

  Alt 5. Sep 2003, 20:09
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:41 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