![]() |
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! |
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.
|
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:
Ok ich schrieb dann mal n paar Begriffe die ich nich verstehe und wozu ich nix gefunden habe ;-)
//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); -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 |
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.
|
Re: cards.dll benutzen?
Und was hab ich von dem Spass dann? Sorry ich blick da grad ma voll nicht durch! :wall:
|
Re: cards.dll benutzen?
Wie wäre es mit Google:
![]() |
Re: cards.dll benutzen?
Da find ich aber auch nix ausser dem hier:
![]() Und der benutzt wieder irgendsoein Tool, das möcht ich ungern... |
Re: cards.dll benutzen?
Na dann Forensuche:
![]() |
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 |
Re: cards.dll benutzen?
Da ist eine Unit mit einem Passendem Demo dazu:
![]() |
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! |
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:
Also das is ja die Funktion zum Zeichnen, nur verstehe (trotz der erklaerung unten drunteR) nicht ganz welcher wert nun wofür ist.
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 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? |
Re: cards.dll benutzen?
Zitat:
Delphi-Quellcode:
Du musst bei DC den HDC eines Canvas angeben.
uses
Forms, Classes,..., cards32;
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 ); |
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!
|
Re: cards.dll benutzen?
Zitat:
|
Re: cards.dll benutzen?
Ok, klappt jetzt soweit, aber nur halb :D
Delphi-Quellcode:
Da oben in der Zeile gibts immer n Fehler:
cdtinit(CardWidth, CardHeight);
cdtdraw(Form1.Canvas.Handle, 0, 0, 0, 0, 1); //hier is immer ein 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! |
Re: cards.dll benutzen?
Use Step or Run to continue." und du siehst wo du bist.
Wir sehen es nicht. :stupid: |
Re: cards.dll benutzen?
Häh? Ich verstehe grad net ganz was du meinst? Der Fehler liegt in der Zeile oben...!?
|
Re: cards.dll benutzen?
Tut mir leid, meine Delphihilfe kennt keine Klasse yyy. Und Schnarchgeräusche hat auch noch keine Exception von sich gegeben.
|
Re: cards.dll benutzen?
Häng mal dein Projekt an, dann kan man nachgucken.
|
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! |
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:
warum kann ich jetzt nicht auf die schnelle sagen.
cdtinit(CardWidth, CardHeight) //<--<<<;
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:
fertisch.
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. |
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 ;-)
|
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:
und unten dann noch:
function cdtTerm : Integer; stdcall;
Delphi-Quellcode:
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.
function cdtTerm; stdcall; external csCards32;
Außerdem solltest du im OnDestroy-Event deines Formulars die Funktion cdtTerm aufrufen :wink: . mfg pitti platsch |
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...)
|
Re: cards.dll benutzen?
Zitat:
Zitat:
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: |
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:
Wo steht denn, was diese ganzen funktionen machen??? Oder hab ich da shcon wieder was falsch verstanden? ^^
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 |
Re: cards.dll benutzen?
Einfach fragen oder in die Hilfe gucken. :mrgreen:
|
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:
Hoffe ihr versteht was ich machen will. Habs auch schon versucht aber es gibt dabei immr Fehler!
type TCard = record
Bild, Farbe: Integer; end; |
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:
(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; |
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:
Dann hab ich n Spielerrecord erstellt dem ich dann Zwei Handkarten zugewiesen hab und so...
type TKarte=record
Bild: Integer; Farbe: Integer end; 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? |
Re: cards.dll benutzen?
Zitat:
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: |
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? |
Re: cards.dll benutzen?
Zitat:
Zitat:
Wenn es aber denn sein soll, welche Karte hat dann welchen Wert ? |
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! |
Re: cards.dll benutzen?
Zitat:
|
Re: cards.dll benutzen?
Nich gut? ^^
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 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