Autor Beitrag
Alexander Urban
Hält's aus hier
Beiträge: 3

WinXP
D6 Ent
BeitragVerfasst: Mo 17.11.03 18:02 
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
ausblenden 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
ausblenden 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 = {
    hier stehen ~4700 KB encoded Bitmap-Farbwerte...}

  end
end
karten.pas
ausblenden volle Höhe 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:
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

    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    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
ausblenden volle Höhe 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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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
ausblenden volle Höhe 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:
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."
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 19.11.03 11:39 
Titel: Versuche zu debuggen
Hallo!

Also dazu fällt mir als erstes ein, dass Du zunächst das Projekt für die Laufzeitbilbiothek öffnen und deine Testanwendung als Hostanwendung angeben solltest!

Dann kannst Du nämlich auch Laufzeitbibliotheken debuggen!

Ansonten müsste ich mir mal den Quelltext genauer ansehen und das dauert etwas!

Bis dahin viel Erfolg beim Debuggen,
S.J.