AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Seltsames Problem mit der cards.dll
Thema durchsuchen
Ansicht
Themen-Optionen

Seltsames Problem mit der cards.dll

Ein Thema von PapaNappa · begonnen am 2. Apr 2005 · letzter Beitrag vom 2. Apr 2005
Antwort Antwort
PapaNappa

Registriert seit: 2. Apr 2005
4 Beiträge
 
#1

Seltsames Problem mit der cards.dll

  Alt 2. Apr 2005, 09:49
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
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#2

Re: Seltsames Problem mit der cards.dll

  Alt 2. Apr 2005, 09:58
Hatten wir schon mal

schau mal in meine Implementierung, vielleicht löst das dein Problem.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
PapaNappa

Registriert seit: 2. Apr 2005
4 Beiträge
 
#3

Re: Seltsames Problem mit der cards.dll

  Alt 2. Apr 2005, 11:39
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
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:
function cdtDraw(const hDC: cardinal; const X, Y, iCard, iDraw: integer; const col : cardinal): integer; stdcall; external CardsDLL;
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#4

Re: Seltsames Problem mit der cards.dll

  Alt 2. Apr 2005, 13:12
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).
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: Seltsames Problem mit der cards.dll

  Alt 2. Apr 2005, 13:49
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
Delphi-Referenz durchsuchenRefresh der Form bzw. des Images aufrufen.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#6

Re: Seltsames Problem mit der cards.dll

  Alt 2. Apr 2005, 14:21
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
  Mit Zitat antworten Zitat
PapaNappa

Registriert seit: 2. Apr 2005
4 Beiträge
 
#7

Re: Seltsames Problem mit der cards.dll

  Alt 2. Apr 2005, 14:31
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
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?
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#8

Re: Seltsames Problem mit der cards.dll

  Alt 2. Apr 2005, 15:13
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.
  Mit Zitat antworten Zitat
PapaNappa

Registriert seit: 2. Apr 2005
4 Beiträge
 
#9

Re: Seltsames Problem mit der cards.dll

  Alt 2. Apr 2005, 18:05
aber ein Canvas ist zum draufzeichnen, oder?
Und wenn ich nun auf das Canvas eines TImage male
Naja, ist ja auch egal.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#10

Re: Seltsames Problem mit der cards.dll

  Alt 2. Apr 2005, 18:21
Ist doch so wie im echten Leben: Das Ergebnis auf der Leinwand hängt vom Owner/Maler ab .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz