Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Seltsames Problem mit der cards.dll (https://www.delphipraxis.net/43339-seltsames-problem-mit-der-cards-dll.html)

PapaNappa 2. Apr 2005 08:49


Seltsames Problem mit der cards.dll
 
Hallo!

Ich bin gerade dabei ein Kartenspiel in Delphi zu implementieren, mit der cards.dll.
Dazu habe ich mir erstmal eine kleine Klasse geschrieben, die die Funktionen um die DLL Kapselt.

Hier der implementation-Abschnitt:
Delphi-Quellcode:
const
  CardsDLL = 'cards.dll';

function cdtInit(var dx, dy : integer): integer; stdcall; external CardsDLL;
function cdtDraw(hdc, X, Y, iCard, iDraw, col : integer): integer; stdcall; external CardsDLL;
function cdtDrawExt(hdc, X, Y, dx, dy,iCard,iDraw, col : integer): integer; stdcall; external CardsDLL;
function cdtTerm : integer; stdcall; external CardsDLL;

{ TCards }

constructor TCards.Create(hDC: integer);
begin
  inherited Create();
  FhDC:=hDC;
  cdtInit(FCardWidth, FCardHeight);
end;

destructor TCards.Destroy;
begin
  cdtTerm;
  inherited;
end;

function TCards.Draw(x, y: integer; Card, Suite: byte;
  DrawType: integer): integer;
begin
  Result:=cdtDraw(FhDC, x, y, Card*4+Suite, DrawType, $FFFFFF);
end;
Card gibt an ob es ein Ass, Zwei, Drei, ..., Dame, König sein soll, Suite ist Pik, Karo, Herz, Kreuz. Von der cards.dll wird das aber nur als ein Wert anngegeben, also 0 ist Kreuz Ass, 1 ist Karo Ass, 2 ist Herz Ass, 3 ist Pik Ass, 4 ist Kreuz Zwei, ...
Das funktioniert ja auch alles 1a.

Jetzt wolte ich in meinem Kartenspiel natürlich auch die Möglichkeit geben das Motiv der Rückseite auszusuchen - das gehört einfach dazu ;)
Allerdings bin ich da auf ein Problem gestoßen, was mir vorher beim rumspielen mit der cards.dll noch nicht aufgefallen ist:
Ich habe erstmal eine Form zum Einstellen der Optionen, darin auch eine ListBox wo man das Motiv wählen kann.
Sowohl im OnCreate der Form als auch beim OnClick der Listbox habe ich folgenden Code:
Delphi-Quellcode:
PreviewCard.Draw(0, 0, 0, 53+lb_Backface.ItemIndex, Back);
(Durch die 0 bei Card kann ich sozusagen direkt iCard übergeben, denn ab 53 fangen die Motive der Rückseiten an)
Achso, erstellt habe ich PreviewCard so:
Delphi-Quellcode:
PreviewCard:=TCards.Create(BackfacePreview.Canvas.Handle);
(BackfacePreview ist ein TImage)
Allerdings wird mir so immer 0 zurückgegeben.
Ersete ich aber lb_Backface.ItemIndex mit einem konstanten Wert, dann wird tatsächlich 1 zurückgegeben und auch auf das Image gemalt - zumindest im OnCreate. Beim gleichen Code im OnClick der LB wird aber auch Null zurückgegeben, egal was ich einsetze.
Dabei kommt der Wert richtig an, Card und Suite werden richtig übergeben und berechnet (zumindest laut Debugger ...)
Und noch etwas komisches: Wenn ich die Form zum zweiten mal Create, dann wird zwar beim OnCreate 1 zurückgegeben, allerdings sehe ich das nicht - das TImage bleibt weiß.

Also kurz zusammengefasst:
Bei Variablem Parameter wird immer 0 zurückgegen und natürlich nichts gemalt. Bei konstantem Parameter wird 1 zurückgeben und nur beim ersten OnCreate auch tatsächlich gemalt. Beim OnClick der LB wird immer 0 zurück gegeben und nie gemalt.
Im OnCreate der Form erstelle ich PreviewCard natürlich ordnungsgemäß und zerstöre es im OnDestroy der Form.
Achso, und ItemIndex enthält natürlich auch immer einen ordentlichen Wert.
Also ich bin echt ratlos :gruebel:

Ich hoffe ihr könnt mir helfen
PapaNappa

neolithos 2. Apr 2005 08:58

Re: Seltsames Problem mit der cards.dll
 
Hatten wir schon mal

schau mal in meine Implementierung, vielleicht löst das dein Problem.

PapaNappa 2. Apr 2005 10:39

Re: Seltsames Problem mit der cards.dll
 
und was hast du da jetzt anders gemacht, außer die Funktionen dynamisch geladen und nicht statisch eingebunden?
Ich erkenne sonst keine großen Unterschiede ...

[edit]
Ich hab's jetzt mal ausprobiert, also es funktioniert auf jeden Fall besser. Nur muss ich jedes mal das Bild neu zeichnen lassen (bzw. Form verdecken und wieder anzeigen), damit ein geändertes Bild sichtbar wird :gruebel:
Trotzdem würde ich gerne wissen woran bei mir der Fehler liegt - denn so groß unterscheiden die sich nicht.
Ich habe auch schon die Definition von cdtDraw angepasst, so wie du es hast - ohne Erfolg:
Delphi-Quellcode:
function cdtDraw(const hDC: cardinal; const X, Y, iCard, iDraw: integer; const col : cardinal): integer; stdcall; external CardsDLL;

neolithos 2. Apr 2005 12:12

Re: Seltsames Problem mit der cards.dll
 
Mit den Rückseiten ist das so eine Sache, man kann sich nämlich nicht darauf verlassen. So richtig sehe aber bei die auch keinen Fehler. Dummerweise weis ich auch nicht mehr so genau darüber bescheid (siehe Datum)

Es können ja wie immer viele kleine Fehler bzw. fieser Versteckter sein.

Ich Empfehle eine PM mit Code (falls nicht zu umfangreich).

Khabarakh 2. Apr 2005 12:49

Re: Seltsames Problem mit der cards.dll
 
Zitat:

Zitat von PapaNappa
Nur muss ich jedes mal das Bild neu zeichnen lassen (bzw. Form verdecken und wieder anzeigen), damit ein geändertes Bild sichtbar wird :gruebel:

Delphi-Referenz durchsuchenRefresh der Form bzw. des Images aufrufen.

Pr0g 2. Apr 2005 13:21

Re: Seltsames Problem mit der cards.dll
 
Und nicht auf das Canvas des Image zeichnen. Leg ein TBitmap an, zeichne die Karte einmal darauf und pack das Bitmap dann in das TImage. Dann noch einmal das Image Refreshen und die Karte ist/bleibt sichtbar.

MfG Pr0g

PapaNappa 2. Apr 2005 13:31

Re: Seltsames Problem mit der cards.dll
 
Khabarakh: Wie, das weiß ich auch ;) Mich hat es halt nur gewunder das ich es so machen muss.
Pr0g: Wieso? Ok, ein TImage ist nicht zum zeichnen, aber das ist nur eine einzige Karte, da brauch ich doch keine extra-TBitmap-Instanz. Allerdings bei dem großen Spielfeld benutze ich natürlich noch ein TBitmap.

Das Problem hab ich inzwischen lösen können, aber glaubt's mir oder nicht, es lag daran, dass ich nur einmal hDC übergeben habe :shock:
Jetzt übergebe ich es auch für jeden Aufruf in Draw und es funktioniert perfekt (bis auf das neuzeichnen ;) )
Kann mir das jemand erklären?

Pr0g 2. Apr 2005 14:13

Re: Seltsames Problem mit der cards.dll
 
Zitat:

Zitat von PapaNappa
Pr0g: Wieso? Ok, ein TImage ist nicht zum zeichnen, aber das ist nur eine einzige Karte, da brauch ich doch keine extra-TBitmap-Instanz.

Du hast deine Frage doch schon selber beantwortet. Ob du nur einen Strich machst, oder direkt 100 spielt dabei doch keine Rolle.

PapaNappa 2. Apr 2005 17:05

Re: Seltsames Problem mit der cards.dll
 
aber ein Canvas ist zum draufzeichnen, oder?
Und wenn ich nun auf das Canvas eines TImage male :mrgreen:
Naja, ist ja auch egal.

Khabarakh 2. Apr 2005 17:21

Re: Seltsames Problem mit der cards.dll
 
Ist doch so wie im echten Leben: Das Ergebnis auf der Leinwand hängt vom Owner/Maler ab :wink: .


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:32 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