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:
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:
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
Ich hoffe ihr könnt mir helfen
PapaNappa