Da ich ein mehrere Kartenspiele schreiben will, habe ich "der Einfachheit halber" (schlechter Joke, ich weiß) eine DLL angelegt, in der die Karten als ImageLists drin sind, und zwei Funktionen zum Auslesen der Karten.
cards.dpr
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| library cards;
uses Sharemem, SysUtils, Classes, Graphics, karten in 'karten.pas';
function Rueckseite(nr:BYTE):Graphics.TBitmap; stdcall; begin IF (nr>0) AND (nr<DataModule1.Rueckseiten.Count) THEN Rueckseite:=karten.DataModule1.Rueckseite(nr); end; function Karte(wert,farbe:BYTE):Graphics.TBitmap; stdcall; begin IF (wert>1) AND (wert<15) AND (farbe>=0) AND (farbe<4) THEN Karte:=karten.DataModule1.Karte(wert,farbe); end;
exports Rueckseite, Karte; begin end. |
karten.dfm
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| object DataModule1: TDataModule1 OldCreateOrder = False Left = 430 Top = 335 Height = 150 Width = 215 object Vorderseiten: TImageList Height = 96 ShareImages = True Width = 71 Left = 25 Top = 30 Bitmap = end end |
karten.pas
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
| unit karten;
interface
uses SysUtils, Classes, ImgList, Controls, QExtCtrls,Graphics,QGraphics;
type
TDataModule1 = class(TDataModule) Vorderseiten: TImageList; Rueckseiten: TImageList; private
public function Karte(wert,farbe:BYTE):Graphics.TBitmap; function Rueckseite(nr:BYTE):Graphics.TBitmap; end; const jack=11; bube=11; queen=12; koenigin=12; king=13; koenig=13; kreuz=0; club=0; karo=1; diamonds=1; pik=2; spade=2; herz=3; heart=3; var DataModule1: TDataModule1;
implementation function TDataModule1.Karte(wert,farbe:BYTE):Graphics.TBitmap; var p:Graphics.TBitmap; begin DataModule1.Vorderseiten.GetBitmap(wert+(farbe*13)-1,p); Karte:=p; end; function TDataModule1.Rueckseite(nr:BYTE):Graphics.TBitmap; var p:Graphics.TBitmap; begin DataModule1.Rueckseiten.GetBitmap(nr-1,p); Rueckseite:=p; end; |
Nun habe ich eine Testanwendung geschrieben, mit der ich mir die Hintergrundbilder ansehen will.
testanwendung.dpr ist ein Standard-Delphiprojekt (Anwendung)
unit1.pas
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ExtCtrls, StdCtrls;
type TForm1 = class(TForm) Image1: TImage; UpDown1: TUpDown; Edit1: TEdit; procedure UpDown1Click(Sender: TObject; Button: TUDBtnType); private public end;
var Form1: TForm1;
implementation function Karte(wert,farbe:BYTE):Graphics.TBitmap; stdcall; external 'cards.dll'; function Rueckseite(nr:BYTE):Graphics.TBitmap; stdcall; external 'cards.dll';
{$R *.dfm}
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType); begin Image1.Canvas.Draw(1,1,Rueckseite(UpDown1.Position)); end; end. |
unit1.dfm
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| object Form1: TForm1 Left = 192 Top = 110 Width = 183 Height = 242 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Image1: TImage Left = 0 Top = 0 Width = 142 Height = 192 Stretch = True end object UpDown1: TUpDown Left = 122 Top = 192 Width = 12 Height = 21 Associate = Edit1 Min = 2 Max = 12 Position = 2 TabOrder = 0 Wrap = False OnClick = UpDown1Click end object Edit1: TEdit Left = 0 Top = 192 Width = 121 Height = 21 TabOrder = 1 Text = '2' end end |
Mein Problem ist folgendes: Bei Erhöhen des SpinEdits erscheint stets "Zugriffsverletzung bei Adresse 004EE1BA in Modul 'cards.dll'. Lesen von Adresse 0000005C."