AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi eine Ressource für mehrere Instanzen von Komponenten
Thema durchsuchen
Ansicht
Themen-Optionen

eine Ressource für mehrere Instanzen von Komponenten

Ein Thema von usnzi02n4m · begonnen am 3. Dez 2005 · letzter Beitrag vom 6. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
usnzi02n4m
(Gast)

n/a Beiträge
 
#1

eine Ressource für mehrere Instanzen von Komponenten

  Alt 3. Dez 2005, 14:28
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
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#2

Re: eine Ressource für mehrere Instanzen von Komponenten

  Alt 3. Dez 2005, 14:31
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.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
usnzi02n4m
(Gast)

n/a Beiträge
 
#3

Re: eine Ressource für mehrere Instanzen von Komponenten

  Alt 3. Dez 2005, 14:40
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.
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#4

Re: eine Ressource für mehrere Instanzen von Komponenten

  Alt 3. Dez 2005, 14:46
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!
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: eine Ressource für mehrere Instanzen von Komponenten

  Alt 3. Dez 2005, 14:46
Delphi-Referenz durchsuchenInitialization und Finalization
Zitat von usnzi02n4m:
(bei Objekten gibts doch sowas wie globale Klassenvariablen?)
(Leider) erst ab Delphi 2006.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Nightshade

Registriert seit: 7. Jan 2003
Ort: Menden
192 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: eine Ressource für mehrere Instanzen von Komponenten

  Alt 3. Dez 2005, 14:53
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;
Christian
Killing for peace is like fucking for virginity

Nightshade
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#7

Re: eine Ressource für mehrere Instanzen von Komponenten

  Alt 3. Dez 2005, 14:54
Warum, das ist doch genau das, was wir vermeiden wollen, oder?
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
usnzi02n4m
(Gast)

n/a Beiträge
 
#8

Re: eine Ressource für mehrere Instanzen von Komponenten

  Alt 3. Dez 2005, 14:57
genau,

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

markus
  Mit Zitat antworten Zitat
Nightshade

Registriert seit: 7. Jan 2003
Ort: Menden
192 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: eine Ressource für mehrere Instanzen von Komponenten

  Alt 3. Dez 2005, 15:00
Ok, habs verstanden,

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

  Image.Picture.Bitmap.LoadFromResourceName(HINSTANCE,'KARTE1.BMP'); laden.

Liegt im RAM sobald die Exe geladen wurde, oder irre ich da ?
Christian
Killing for peace is like fucking for virginity

Nightshade
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#10

Re: eine Ressource für mehrere Instanzen von Komponenten

  Alt 3. Dez 2005, 15:19
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:05 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