![]() |
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:
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.
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)); ... 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 |
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.
|
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. |
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:
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!
initialization
bmp := TBitmap.Create; bmp.LoadFromFile('C:\Karten.bmp'); bmp.Transparent := True; finalization bmp.Free; end. |
Re: eine Ressource für mehrere Instanzen von Komponenten
![]() Zitat:
|
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; |
Re: eine Ressource für mehrere Instanzen von Komponenten
Warum, das ist doch genau das, was wir vermeiden wollen, oder? :gruebel:
|
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 |
Re: eine Ressource für mehrere Instanzen von Komponenten
Ok, habs verstanden,
Dann würde ich die BitMaps in ![]()
Delphi-Quellcode:
laden.
Image.Picture.Bitmap.LoadFromResourceName(HINSTANCE,'KARTE1.BMP');
Liegt im RAM sobald die Exe geladen wurde, oder irre ich da ? |
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 00:53 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