Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi eine Ressource für mehrere Instanzen von Komponenten (https://www.delphipraxis.net/58225-eine-ressource-fuer-mehrere-instanzen-von-komponenten.html)

usnzi02n4m 3. Dez 2005 13:28


eine Ressource für mehrere Instanzen von Komponenten
 
Hallo,

dies ist eine zweite Frage zu einer Komponente, mit der ich mich gerade beschäftige. Ich hoffe, zwei Fragen zu einer Komponente in zwei Threads zu stellen ist legitim. :?:

Wie schon in dem zuerst erstellten Thread erwähnt, möchte ich eine Komponente entwickeln, die eine Spielkarte aus einem Kartenspiel simuliert. Diese hat eine Eigenschaft Wert, über die der Kartenwert eingestellt wird und dementsprechend wird dann das Bild der Karte auf die Canvas-Oberfläche meiner Komponente (abgel. von TGraphicControl) gezeichnet.

Auf meiner Festplatte habe ich eine Datei "Karten.bmp" (beinhaltet 32 Karten, die in 4 Zeilen und 8 Spalten nebeneinander gekachelt sind) die in der Create-Methode meiner Komponente in ein TBitmap-Objekt (var bmp: TBitmap) geladen wird. In der Paint-Methode der Komponente wird nun, abhängig vom eingestellten Kartenwert, ein ganz bestimmter Teil des bmp-Objekts auf die Komponenten-Oberfläche gezeichnet.

Ich hoffe mit Quellcode-Ausschnitten wird erkenntlich, wich ich's meine:
Delphi-Quellcode:
type
  TKartenwert = 0..32;
  TSpielkarte = class(TGraphicControl)
  private
    { Private-Deklarationen }
    bmp: TBitmap;
    value: TKartenwert;
    constructor Create(AOwner : TComponent); override;
    procedure Paint; override;
 
  ...

constructor TSpielkarte.Create(AOwner : TComponent);
begin
  inherited;
  bmp := TBitmap.Create;
  bmp.LoadFromFile('C:\Karten.bmp');
  bmp.Transparent := True;
  ...

procedure TSpielkarte.Paint;
var i: Byte;
    x,y: Word;
begin
  y := ((value-1) div 8) * Height;
  x := ((value-1) mod 8) * Width;
  Canvas.CopyRect(Rect(0, 0, Width, Height), bmp.Canvas,
                  Rect(x, y, x + Width, y + Height));
  ...
Allerdings sehe ich ein Problem darin, dass bei jeder Instanz meiner Komponente immer die "Karten.bmp" geladen wird, was sich sicherlich nicht vorteilhaft auf den Speicherbedarf und Zeitbedarf der benutzenden Programme auswirkt.
Gibt es irgendeine Möglichkeit, dass die Instanzen überprüfen können, ob das Kartenbild schon eingelesen wurde und wenn ja, auch darauf zugreifen können. (bei Objekten gibts doch sowas wie globale Klassenvariablen?). Oder händelt das Delphi von alleine?

Viele Grüsse
Markus

tigerman33 3. Dez 2005 13:31

Re: eine Ressource für mehrere Instanzen von Komponenten
 
Mach doch einfach eine globale Instanz von TBitmap im Implementation-Teil der Unit, und aus der holen sich dann die Karten jeweils den Teil, der für sie relevant ist.

usnzi02n4m 3. Dez 2005 13:40

Re: eine Ressource für mehrere Instanzen von Komponenten
 
Oh, so einfach ist das, hätte ich nicht gedacht. Vielen Dank.
Aber wo muss ich denn dann die Bitmap-Datei einlesen. Ist folgender Ansatz richtig oder verstehe ich was falsch:
Delphi-Quellcode:
[...]
procedure Register;

implementation

var bmp: TBitmap;

[...]

// Hier kommen die ganzen Methoden von TSpielkarte hin

[...]

begin
  bmp := TBitmap.Create;
  bmp.LoadFromFile('C:\Karten.bmp');
  bmp.Transparent := True;
end.

tigerman33 3. Dez 2005 13:46

Re: eine Ressource für mehrere Instanzen von Komponenten
 
Ja, aber statt begin schreibst du initialization, und im finalization gibst du das ganze wieder frei.

Delphi-Quellcode:
initialization
  bmp := TBitmap.Create;
  bmp.LoadFromFile('C:\Karten.bmp');
  bmp.Transparent := True;

finalization
  bmp.Free;
end.
Aber aufpassen, wenn diese Datei nicht existiert, dann geht deine Komponente natürlich nicht mehr. Und zwar schon zur Designtime nicht. Da solltest du also auf jeden Fall noch Sicherheitsabfragen einbauen!

Khabarakh 3. Dez 2005 13:46

Re: eine Ressource für mehrere Instanzen von Komponenten
 
Delphi-Referenz durchsuchenInitialization und Finalization
Zitat:

Zitat von usnzi02n4m
(bei Objekten gibts doch sowas wie globale Klassenvariablen?)

(Leider) erst ab Delphi 2006.

Nightshade 3. Dez 2005 13:53

Re: eine Ressource für mehrere Instanzen von Komponenten
 
Wozu hat ein Object einen Constructor und einen Destructor ?

Delphi-Quellcode:
  TSpielkarte = class(TGraphicControl)
  private
    FKartenListe: TImageList;
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
  end;

constructor TSpielkarte.Create(AOwner: TComponent);
begin
  inherited;
  FKartenListe := TImageList.Create(self);
  FKarenListe.Height := 128; // Kartenliste füllen
  [...]
end;

destructor TSpielkarte.Destroy;
begin
  FKartenListe.Free;
  inherited;
end;

tigerman33 3. Dez 2005 13:54

Re: eine Ressource für mehrere Instanzen von Komponenten
 
Warum, das ist doch genau das, was wir vermeiden wollen, oder? :gruebel:

usnzi02n4m 3. Dez 2005 13:57

Re: eine Ressource für mehrere Instanzen von Komponenten
 
genau,

bei dem Vorschlag von Nightshade wird doch (wenn ich nicht falsch liege :gruebel: ) die FKartenListe bei jeder Instanz der Komponente gefüllt. Dies möchte ich ja gerade vermeiden.

markus

Nightshade 3. Dez 2005 14:00

Re: eine Ressource für mehrere Instanzen von Komponenten
 
Ok, habs verstanden,

Dann würde ich die BitMaps in Hier im Forum suchenRESSOURCENFILES legen und das Image per :

Delphi-Quellcode:
  Image.Picture.Bitmap.LoadFromResourceName(HINSTANCE,'KARTE1.BMP');
laden.

Liegt im RAM sobald die Exe geladen wurde, oder irre ich da ?

Robert Marquardt 3. Dez 2005 14:19

Re: eine Ressource für mehrere Instanzen von Komponenten
 
Man erstellt einen globalen Referenzzaehler. Im Konstruktor wird er erhoeht un im Destruktor erniedrigt.
Der Konstruktor prueft ob er auf 1 erhoeht hat und laedt dann die Datei.
Der Destruktor prueft ob er auf 0 erniedrigt hat und entlaedt dann die Datei.

Insgesamt ist die Idee die Karten aus einer Datei zu beziehen, aber nicht die beste.
Ein Programm sollte solche Daten aus seinen eigenen Resourcen beziehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 Uhr.
Seite 1 von 2  1 2      

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