Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi cards.dll benutzen? (https://www.delphipraxis.net/89101-cards-dll-benutzen.html)

.chicken 26. Mär 2007 12:11


cards.dll benutzen?
 
Also ich programmiere grade ein Kartenspiel (schon vor längerem mal angefangen aber dann wieder auf Eis gelegt). Damals hab ich die Karten noch selbst gemacht, aber das will ich jetzt nicht mehr und mir wurde gesagt man kann die Karten aus der Cards.dll nutzen.

Habe das Forum durchsucht und auch einiges gefunden, was mir aber nicht wirklich geholfen hat, weil ich den Großteil des Codes nicht richtig verstehe! Habe auch eine fertige 'Cards32.dll' gefunden aber würde das lieber selber versuchen.

Wäre wohl wer so nett mir zu erklären wie das geht oder mir n Link zu geben wos genauer erklärt steht? Auch bei Google hab ich nicht so recht was gefunden!

Danke schonmal!

SirThornberry 26. Mär 2007 12:13

Re: cards.dll benutzen?
 
welchen Teil des Codes verstehst du denn nicht? Es wäre wenig sinnvoll wenn wir dir jetzt hier schreiben wie man die Karten liest wenn du diesen quelltext dann auch nicht verstehst. Von daher ist es das sinnvollste du sagst mit welchem teil du deine Schwierigkeiten hast.

.chicken 26. Mär 2007 12:42

Re: cards.dll benutzen?
 
Also das hier ist der Code den ich gefunden habe (von Kaemmi is der uebigens, danke an dem Punkt ;-)):
Delphi-Quellcode:
//im implementation-Abschnitt deklarieren
//das hier ist nur ein beispiel, das wahrscheinlich an die funktionen deiner DLL angepasst werden muss
type TTestFunction = function(x,y:Integer):integer;

var DLLHandle:THandle;
    Func:TFarProc;
    TestFunction:TTestFunktion;
    ergebnis:string;
//laden der DLL
DLLHandle := LoadLibrary(Pchar(DLLName)); //DLLName mit dem eigentlichen Namen der DLL ersetzen, logisch
//Adresse einer Funktion ermitteln
Func := GetProcAddress(DLLHandle,'cdtdraw');
//Wenn die Funktion gefunden wurde
if Func <> nil then begin
   @TestFunction := Func;
//Ausführen des Codes
ergebnis := IntToStr(TestFunction(4,5)); //übergeben der Parameter an die Funktion
Func:=nil;
//Freigeben der DLL
FreeLibrary(DLLHandle);
Ok ich schrieb dann mal n paar Begriffe die ich nich verstehe und wozu ich nix gefunden habe ;-)
-THandle (wozu genau is des gut?)
-TFarProc(garnicht in der Hilfe?) -> somit verstehe ich auch noch nicht ganz was es mit GetProcAddress auf sich hat, aber vielleicht erübrigt sich das ja wenn ich weiss was TFarProc ist)

Außerdem weiß ich nich ganz was genau das jetzt macht...wie zeige ich denn dann die Grafiken an??

Danke schonmal soweit

Zacherl 26. Mär 2007 12:50

Re: cards.dll benutzen?
 
Die ganze Routine importiert dir nur dynamisch die Funktion 'cdtdraw' aus der DLL. Nicht mehr und nicht weniger .. naja sie ruft noch die Funktion zum Testen auf.

.chicken 26. Mär 2007 12:57

Re: cards.dll benutzen?
 
Und was hab ich von dem Spass dann? Sorry ich blick da grad ma voll nicht durch! :wall:

Luckie 26. Mär 2007 13:00

Re: cards.dll benutzen?
 
Wie wäre es mit Google: Bei Google suchendelphi cards.dll?

.chicken 26. Mär 2007 13:07

Re: cards.dll benutzen?
 
Da find ich aber auch nix ausser dem hier:
http://www.delphiforfun.org/Programs/Library/cards2.htm
Und der benutzt wieder irgendsoein Tool, das möcht ich ungern...

Luckie 26. Mär 2007 13:10

Re: cards.dll benutzen?
 
Na dann Forensuche: http://www.delphipraxis.net/internal...?p=60723#60723 Was ist mit der Unit?

.chicken 26. Mär 2007 13:17

Re: cards.dll benutzen?
 
Ok, danke die hatte ich zwar schonmal gefunden, allerdings mit weniger Kommentaren!?
Ich les mir das mal in Ruhe durch und guck ob ichs verstehe!
Dankeschön

turboPASCAL 26. Mär 2007 14:05

Re: cards.dll benutzen?
 
Da ist eine Unit mit einem Passendem Demo dazu:

http://www.delphipraxis.net/internal...=664983#664983

.chicken 26. Mär 2007 14:26

Re: cards.dll benutzen?
 
das sieht ja mal schnike aus ^^

danke

edit: abner warum is die cards32.pas denn da schon wieder so groß? also viel mehr text als bei der andern!

.chicken 26. Mär 2007 15:46

Re: cards.dll benutzen?
 
Ok, hab mich nun erstmal mit der kürzeren Variante beschäftigt! Ich vestehe auch einigermaßen was wo vorgeht.
Ich weiss nurnoch nicht ganz wie ich jetzt die Karten zeichne

Delphi-Quellcode:
  function cdtDraw(const hDC : Cardinal; const x, y, iSuits, iCard : Integer; const dwColor : Cardinal) : Integer;
  {
Zeichnet die Karte in der Default-Größe an die angegebene Stelle auf eine Form, PictureBox oder auf die Fläche eines sonstigen Objekts, das einen hDC besitzt.
Mögliche Grafiken:
- eine der 52 Karten-Vorderseiten oder
- eine der 13 verschiedenen Rückseiten oder
- eine der beiden Ablageflächen (mit 'X' oder mit 'O')
Kartenbilder können auch invertiert dargestellt werden, um z.B eine Auswahl anzuzeigen.
   ByVal hDC As Long (Handle des Ziel-DeviceContext)
   ByVal xOrg As Long (X-Position der Karte in Pixeln)
   ByVal yOrg As Long (Y-Position der Karte in Pixeln)
   ByVal nCard As Long (ID der darzustellenden Grafik)
   ByVal nDraw As Long (Flags für Vorder/Rückseite bzw. Invertierung)
   ByVal nColor As OLE_COLOR (Farbe für Rückseite bzw. Invertierung)
  -> Long (Flag für 'Success')
}
Also das is ja die Funktion zum Zeichnen, nur verstehe (trotz der erklaerung unten drunteR) nicht ganz welcher wert nun wofür ist.
Also womit gebe ich zB an worauf die Karte gezeichnet wird?



Und dann noch was...darf ich die Datei einfach so für mein Pokerspiel benutzen? Muss ich sie dann einfach in meinen Ordner kopieren und unter uses meines Programms cards32 angeben???

Danke für die Hilfe soweit!

Edit: Also wenn ich das versuche mit meinem Programm zu verbinden, dann kommt immer "Die Anwendung konnte nicht gestartet werden, weil cards32.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben."

Das Beispiel funzt aber, also wo liegt mein Fehler?

turboPASCAL 26. Mär 2007 16:46

Re: cards.dll benutzen?
 
Zitat:

Und dann noch was...darf ich die Datei einfach so für mein Pokerspiel benutzen? Muss ich sie dann einfach in meinen Ordner kopieren und unter uses meines Programms cards32 angeben???
:gruebel: äh ja sicher.

Delphi-Quellcode:
uses
  Forms, Classes,..., cards32;
Du musst bei DC den HDC eines Canvas angeben.

Delphi-Quellcode:
cdtDraw(
  EinBitmap.Canvas.Handle,
  PositionX,
  PositionY,
  iSuits, // Karo, shell etc
  iCard, // König Dame Bube Ass...
  FarbeDieAnDenRundenEcken se : Integer;
  clGreen, // Farbe für Karten
  );

.chicken 26. Mär 2007 16:49

Re: cards.dll benutzen?
 
Ok, super danke, damit wär aber immernoch nicht mein Problem mit der Fehlermeldung geklärt, denn die Cards32 hab ich bereits unter Uses angegeben!

Khabarakh 26. Mär 2007 17:49

Re: cards.dll benutzen?
 
Zitat:

Zitat von .chicken
Ok, super danke, damit wär aber immernoch nicht mein Problem mit der Fehlermeldung geklärt, denn die Cards32 hab ich bereits unter Uses angegeben!

Und, stand davon etwas in der Fehlermeldung? Nein, dort stand etwas von der DLL, also solltest du vielleicht auch die in das Verzeichnis der Exe packen ;) . Die Unit ist lediglich ein Wrapper um die Library.

.chicken 26. Mär 2007 18:30

Re: cards.dll benutzen?
 
Ok, klappt jetzt soweit, aber nur halb :D

Delphi-Quellcode:
  cdtinit(CardWidth, CardHeight);
  cdtdraw(Form1.Canvas.Handle, 0, 0, 0, 0, 1); //hier is immer ein fehler
Da oben in der Zeile gibts immer n Fehler:

"Project xxxx raised exception class yyyyy with message 'zzzzzz'.

Process stopped. Use Step or Run to continue."

Weiss wer wo der Fehler liegt? Denke mal in der letzten Eingabe bei cdtDraw, wusste nich was ich da hinschrieben soll also hab ichs einfach mal so versucht!

turboPASCAL 26. Mär 2007 18:37

Re: cards.dll benutzen?
 
Use Step or Run to continue." und du siehst wo du bist.
Wir sehen es nicht. :stupid:

.chicken 26. Mär 2007 18:46

Re: cards.dll benutzen?
 
Häh? Ich verstehe grad net ganz was du meinst? Der Fehler liegt in der Zeile oben...!?

Khabarakh 26. Mär 2007 19:08

Re: cards.dll benutzen?
 
Tut mir leid, meine Delphihilfe kennt keine Klasse yyy. Und Schnarchgeräusche hat auch noch keine Exception von sich gegeben.

turboPASCAL 26. Mär 2007 19:09

Re: cards.dll benutzen?
 
Häng mal dein Projekt an, dann kan man nachgucken.

.chicken 26. Mär 2007 19:18

Re: cards.dll benutzen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok, hier biddeschön :)

Also ihr seht ja noch nich viel drin, will erst das mit der .dll hinrkiegen, der Rest (den hatte ich auch schonmal zur Hälfte) kommt dann später!

turboPASCAL 26. Mär 2007 20:10

Re: cards.dll benutzen?
 
jau...
hättest du mal "meine" genommen dann währe alles gut.
Ist wirklich nicht schwer.


Die cards.dll (cards32.dll bei Win 95 etc) brauchst du nicht in das Verz. kopieren,
die ist bei Windows mit dabei. (Meine guckt automatisch nach ;) )

Die DLL heisst "cards.dll" bei Windows XP.


So, der Fehler liegt bei
Delphi-Quellcode:
  cdtinit(CardWidth, CardHeight) //<--<<<;
warum kann ich jetzt nicht auf die schnelle sagen.


Bei mir sähe das so aus:

Delphi-Quellcode:
{
  // "Kartenfarbe":

                // Kreuz,     Karo,       Herz,       Pik
                // oder auch:
                // Eichel,   Schell,      Herz,       Grün
  TCardSuits = (suitClubs, suitDiamonds, suitHearts, suitSpades);

  // Karten:
  TCardFaces = (faceAce,  // Ass
                faceTwo,  // 2
                faceThree, // 3
                faceFour, // ...
                faceFive,
                faceSix,
                faceSeven,
                faceEight,
                faceNine,
                faceTen,  //10
                faceJack, // Bube
                faceQueen, // Dame
                faceKing  // König
}
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Cards32;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
    Karten: TCards;
  public
    { Public declarations }
  end;



var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Karten := TCards.Create; // Unit/Dll initialisieren
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Karten.Free; // Unit/Dll wieder freigeben und aus dem Hauptspeicher löschen !
end;

procedure TForm1.FormPaint(Sender: TObject);
var i: Integer;
begin
  // male mal:
  for i:= 0 to 5 do
    Karten.DrawCard(
      Canvas.Handle,
      Point(20 + i,20 + (i*10)),  // an Stelle
      suitClubs,                  // Kreuz
      faceAce,                    // Ass
      FALSE                       // Ne, kein Highlight (werden invertiert wenn True)
      );

end;

end.
fertisch.

.chicken 26. Mär 2007 20:18

Re: cards.dll benutzen?
 
Ok, super danke, das klappt jetzt zwar soweit, schade finde ich nur, dass ich nich ganz verstehe was du in deiner cards32.pas machst! Trotzdem danke ;-)

pitti platsch 26. Mär 2007 20:19

Re: cards.dll benutzen?
 
Die Fehlermeldung kommt daher, dass die Cards32.pas Datei falsch ist. Die Funktionen müssen alle als stdcall deklariert werden (Hinter den Rückgabewert stdcall; schreiben und vor external... nochmal).
Hier ein Beispiel für die Funktion cdtTerm:
Delphi-Quellcode:
function cdtTerm : Integer; stdcall;
und unten dann noch:
Delphi-Quellcode:
function cdtTerm; stdcall; external csCards32;
Dann läuft das Programm, aber es zeigt nichts an. Das liegt daran, dass du cdtdraw(Form1.Canvas.Handle, 0, 0, 0, 0, 0); nur im Konstruktor aufrufst. Dies muss aber immer beim neuzeichnen des Formulars (also im OnPaint-Event) geschehen.

Außerdem solltest du im OnDestroy-Event deines Formulars die Funktion cdtTerm aufrufen :wink: .

mfg
pitti platsch

.chicken 26. Mär 2007 20:24

Re: cards.dll benutzen?
 
Super, dakne fuer die Antworten ich versuch das dann morgen mal hinzukriegen! Finde den Mist komplizierter als den Rest des Pokerspiels :D (Kartenabfrage etc...)

turboPASCAL 26. Mär 2007 23:12

Re: cards.dll benutzen?
 
Zitat:

Zitat von Pitti
Die Fehlermeldung kommt daher, dass die Cards32.pas Datei falsch ist. Die Funktionen müssen alle als stdcall deklariert werden

japp, so ist es. Musste ich doch erst mein Delphi anschmeissen...


Zitat:

Zitat von .chicken
Ok, super danke, das klappt jetzt zwar soweit, schade finde ich nur, dass ich nich ganz verstehe was du in deiner cards32.pas machst! Trotzdem danke ;-)

1.) alles in eine Kalsse gepackt
2.) es ist egal welche Windowsversion (ausgenommen Vista ;) da ich es noch nicht kenne)
3.) Fehlermeldungen bei Fehlern die man lesen kann
4.) übersichtlicher
5.) einfaches Zeichnen eines eigenen Kartenhintergrundes
6.) fällt mir jetzt nicht ein ;)

Die andere Unit stellt wirklich nur die Grundfunktionen "ohne alles".
Wird die Dll nicht gefunden oder die falsche geladen gibts Probleme.

:mrgreen:

.chicken 27. Mär 2007 12:49

Re: cards.dll benutzen?
 
Ok, super danke, vielleicht versteh ich den Code ja wenn ich mich nomma genau dransetze! Vielen Dank für eure Hilfe!!!!! :dp:

Da Hab ich nochma ne Frage (sorry :D )

Delphi-Quellcode:
  TCardInit = function (var dx, dy : Integer) : Integer; stdcall;
  TCardTerm = function : Integer; stdcall;
  TCardDraw = function (const hDC : Cardinal; const x, y, iCard, iFlags : Integer;
    const dwColor : Cardinal) : Integer; stdcall;
  TCardDrawExt = function (const hDC : Cardinal; const x, y, dx, dy, iSuit,
    iFlags : Integer; const dwColor : Cardinal) : Integer; stdcall;
  TCardAnimate = function (const hDC : Cardinal; const lBack, x, y,
    lState : Integer) : Integer; stdcall;
    // Wird anscheinend unter XP nicht mehr unterstützt
Wo steht denn, was diese ganzen funktionen machen??? Oder hab ich da shcon wieder was falsch verstanden? ^^

turboPASCAL 27. Mär 2007 12:50

Re: cards.dll benutzen?
 
Einfach fragen oder in die Hilfe gucken. :mrgreen:

.chicken 28. Mär 2007 13:43

Re: cards.dll benutzen?
 
Also erstens weise ich nochmal auf meine editierten Beitrag weiter oiben hin, da hab ich nomma ne Frage gestellt und dann schon wieder eine :D

Ist es Möglich dass ich der Klasse Cards noch die properties "Bild" und "Farbe" hinzufüge?
Somit könnte ich mir meine neue Typendefinition sparen:
Delphi-Quellcode:
type TCard = record
  Bild, Farbe: Integer;
end;
Hoffe ihr versteht was ich machen will. Habs auch schon versucht aber es gibt dabei immr Fehler!

turboPASCAL 28. Mär 2007 14:11

Re: cards.dll benutzen?
 
Code:
CardInit = function liefert die grösse der Karten, Breite x Höhe
CardTerm = function initialisiert die dll
CardDraw = function zeichnet eine definierte karte
CardDrawExt = function zeichnet eine definierte karte mit bestimmten zus. Parametern

CardAnimate = function Wird anscheinend unter XP nicht mehr unterstützt :gruebel:
Zitat:

Ist es Möglich dass ich der Klasse Cards noch die properties "Bild" und "Farbe" hinzufüge?
Für dein Spel ? In der Unit alle 52 Karten zu definieren macht nicht unbedingt Sinn.
(vill. falsch verstanden was du möchtest :gruebel: )

Du kanns in deinem Spiel aber einen Recordtypen basteln zB. für jeden spieler

Delphi-Quellcode:
type
  TPlayerCard = Record
                  Farbe: TCardSuits; // Kreuz, Karo, Herz und so
                  Bild: TCardFaces; // Bube, Dame, ..., 2, 3, ...
                end;
  TPlayerHandCards = array [0..5] of TPlayerCard; // jeder bekommt nur 6 Karten oder so ;-)

var
  PlayerOneCards = TPlayerHandCards;


procedure SoUndSo...
begin
  PlayerOneCards[0].Farbe := suitHearts;
  PlayerOneCards[0].Bild := faceAce;

  //..
end;

procedure Werhatwas...
begin
  if (PlayerOneCards[0].Farbe = suitHearts) and PlayerOneCards[0].Bild = faceAce) then
    ShowMessage('Player 1 hat n Hertz Ass');

  //..
end;

.chicken 28. Mär 2007 14:24

Re: cards.dll benutzen?
 
Ne also ich meinte das anders...

Ich hatte ja, bevor ich die cards.dll benutzt habe immer einen record.
Delphi-Quellcode:
type TKarte=record
  Bild: Integer;
  Farbe: Integer
end;
Dann hab ich n Spielerrecord erstellt dem ich dann Zwei Handkarten zugewiesen hab und so...

Also ich möchte einfach nur, dass deine Klasse TCards noch die Eigenschaft bekommt, über eine Integer einen Bild und Farben-Wert zu bekommen!
Damit ich nicht noch einen extra Record erstellen muss!

Verstehste jetzt was ich meine?

turboPASCAL 28. Mär 2007 14:39

Re: cards.dll benutzen?
 
Zitat:

Damit ich nicht noch einen extra Record erstellen muss!
Soll ich das etwa für dich machen ? :mrgreen:

Die Unit ist nur zum zeichnen der Karten da mehr nicht.

Ich verstehe auch nicht so recht was nu mit den Integer möchtest. :gruebel:

.chicken 28. Mär 2007 14:52

Re: cards.dll benutzen?
 
Naja gut...

Ich dachte halt ich könnte sie sowohl zum Zeichen der Karten, als auch für die restlichen Funktionen, die meine Karten brauchen nutzen können.

Die Integer Variablen sind um die Karten zu identifizieren. Also ich hab da lieber 3" oder so stehn als "suitHearts", ich kann damit irgendwie besser arbeiten und man kann die Werte besser in Schleifen zuweisen oder hinterher die Hände berechnen, verstehste?

turboPASCAL 28. Mär 2007 16:08

Re: cards.dll benutzen?
 
Zitat:

Ich dachte halt ich könnte sie sowohl zum Zeichen der Karten, als auch für die restlichen Funktionen, die meine Karten brauchen nutzen können.
Da rate ich dir dringend von ab, das wird dann richtig schohn unübersichtlich.

Zitat:

Die Integer Variablen sind um die Karten zu identifizieren. Also ich hab da lieber 3" oder so stehn als "suitHearts", ich kann damit irgendwie besser arbeiten und man kann die Werte besser in Schleifen zuweisen oder hinterher die Hände berechnen, verstehste?
Aha, ich wüsste dann aber im Quellcode Line 849 nicht was die Karte 11/3 sein soll.

Wenn es aber denn sein soll, welche Karte hat dann welchen Wert ?

.chicken 28. Mär 2007 17:14

Re: cards.dll benutzen?
 
Ja also 0 = Ass und z.B. 0 = Pik, dh. Ass + Pik (0 + 0) = Pik-Ass (0);

So find ichs am leichtesten, ich muss vielleicht abundann nochmal die Werte nachgucken aber find das einfacher damit zu arbeiten ;-)

Danke trotzdem für die Hilfe!

turboPASCAL 28. Mär 2007 17:18

Re: cards.dll benutzen?
 
Zitat:

Zitat von .chicken
Ja also 0 = Ass und z.B. 0 = Pik, dh. Ass + Pik (0 + 0) = Pik-Ass (0);

:shock: :gruebel:

.chicken 28. Mär 2007 18:40

Re: cards.dll benutzen?
 
Nich gut? ^^


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