Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Layer Management auf OOP Basis (https://www.delphipraxis.net/116397-layer-management-auf-oop-basis.html)

formosa 28. Jun 2008 10:07


Layer Management auf OOP Basis
 
Hallo zusammen,

für meinen Image Resizer suche ich im Moment eine OOP basierende Lösung zum Verwalten von Layern. Bisher hatte ich nur ganz einfache Klassen selber geschrieben, bin aber dadurch auf die Vorteile der OOP gestossen.

Es sollen zwei Layertypen in unbekannter Anzahl verwaltet werden:

- Typ 1. Layer enthält nur ein Bitmap mit X und Y Offset
- Typ 2. Layer enthält Text, und daher sollen auch zusäztliche Informationen wie Font, Style, Size ect. verwaltet werden.

Ich möchte das unbedingt in OOP machen. Habt Ihr evtl. einen Lösungsansatz?

Vielen Dank an Euch,

Chris

CK_CK 28. Jun 2008 11:30

Re: Layer Management auf OOP Basis
 
Was weißt du denn genau beim Thema OOP nicht?

Ich würde die 1. Klasse ungefähr so aufbauen:
Delphi-Quellcode:
TBildLayer = class()
private
  fBitmap: TBitmap; //Hier ist das Bitmap
  fOffsX: Integer;
  fOffsY: Integer;

  procedure setOffsX(AValue: Integer); //Änderungen im Bitmap speichern...
  procedure setOffsY(AValue: Integer);
public
  property OffsX: Integer read fOffsX write setOffsX;
  property OffsY: Integer read fOffsY write setOffsY;
end;
2. Klasse:
Delphi-Quellcode:
TBildLayer = class()
private
  fBitmap: TBitmap; //Hier ist das Bitmap
  fText: String; //Der Text
  fFont: TFont;  //Der Font dazu ;)

  procedure setText(AValue: String); //Änderungen im Bitmap speichern...
  procedure setFont(AValue: TFont);
public
  property Text: String read fText write setText;
  property Font: TFont read fFont write setFont;
end;
Zusätzlich müsstest du natürlich noch die passenden Prozeduren zum Zeichnen, etc. einbauen. Wenn es eine Komponente werden soll, müsstest du von TGraphicControl ableiten...

Chris

Dax 28. Jun 2008 12:39

Re: Layer Management auf OOP Basis
 
Das geht aber schöner und OOPiger :)
Delphi-Quellcode:
TAbstractLayer = class
  private
    fX, fY, fWidth, fHeight: Integer;
  public
    constructor Create(x, y, width, height: Integer);

    property X: Integer read fX write fX;
    property Y: Integer read fY write fY;
    property Width: Integer read fWidth write fWidth;
    property Height: Integer read fHeight write fHeight;

    procedure DrawTo(bitmap: TBitmap); virtual; abstract;
  end;

  TBitmapLayer = class(TAbstractLayer)
  private
    fBitmap: TBitmap;
  public
    constructor Create(bitmap: TBitmap);

    property Bitmap: TBitmap read fBitmap write fBitmap;

    procedure DrawTo(bitmap: TBitmap); override;
  end;

  TTextLayer = class(TAbstractLayer)
  private
    fText: string;
  public
    constructor Create(text: string);

    property Text: string read fText write fText;

    procedure DrawTo(bitmap: TBitmap); override;
  end;

formosa 28. Jun 2008 22:38

Re: Layer Management auf OOP Basis
 
Danke euch beiden. Ja so ungefähr hab ich mir das auch vorgestellt, wollte aber die ganzen Layers etwa wie folgt ansprechen

Delphi-Quellcode:
if MyLayers.Layer [idx].Type = BitmapLayer then
begin
  .... // mach ich was damit.
end
else
begin
  .... // mach ich halt was anderes damit.
end;
Grundsäztlich würde ich sagen das ich die variablen wie Offset, Text ect. in zwei verschiedenen Arrays speichern kann. Wie könnte ich denn jetzt eine Klasse gestalten damit ich von aussen beispielsweise in einem BitmapLayer mit keine Eigenschaft Text habe also zb.

Delphi-Quellcode:
if MyLayers.Layer [idx].Type = BitmapLayer then
begin
  MyLayers.Layer [idx].Text := 'Neuer Text'; // Es sollte aber keine Text Eigenschaft haben
end
else
begin
    MyLayers.Layer [idx].Text := 'Neuer Text'; // Hier jedoch schon
end;
Das ist mein eigentliches Hauptproblem.

danke

Chris

Namenloser 28. Jun 2008 22:43

Re: Layer Management auf OOP Basis
 
Dafür gibt's sogenannte Typecasts:
Delphi-Quellcode:
if MyLayers.Layer[idx] is TBitmapLayer then
  TBitmapLayer(MyLayers.Layer[idx]).TuWasMitDemBitmap;
else if MyLayers.Layer[idx] is TTextLayer then
  TTextLayer(MyLayers.Layer[idx]).Text := 'Neuer Text';


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