![]() |
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:
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, ...
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; 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:
(Durch die 0 bei Card kann ich sozusagen direkt iCard übergeben, denn ab 53 fangen die Motive der Rückseiten an)
PreviewCard.Draw(0, 0, 0, 53+lb_Backface.ItemIndex, Back);
Achso, erstellt habe ich PreviewCard so:
Delphi-Quellcode:
(BackfacePreview ist ein TImage)
PreviewCard:=TCards.Create(BackfacePreview.Canvas.Handle);
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 |
Re: Seltsames Problem mit der cards.dll
|
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;
|
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). |
Re: Seltsames Problem mit der cards.dll
Zitat:
![]() |
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 |
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? |
Re: Seltsames Problem mit der cards.dll
Zitat:
|
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. |
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