![]() |
Delphi-Version: 10.1 Berlin
Inkompatible Typen
Hallo, bin neu hier und möchte Eure Hilfe.
Ich spiele ein bisschen mit OOP und baue ein Objekt für ein Kartenspiel. Das Objekt (TCard) kann ich initialisieren (create) und ein Blatt-Array (vom Type TCard) von mehreren Karten generieren, mischen und rudimentär darstellen. Um das Blatt auf mehrere Stapel/Spieler aufzuteilen nutze ich mehrere Blatt-Arrays, denen ich per Copy(Blatt-Array, Index, Anzahl) einen Kartenstapel zuweise, dabei bekomme ich einen Fehler "Inkompatible Typen" obwohl die vom gleichen Type sind. Kann mir das jemand erklären? Hier folgen Auszüge meines Quellcodes: type CardWert = (ass,zwei,drei,vier,fuenf,sechs,sieben,acht,neun,z ehn,bube,dame,koenig,jokerw); CardFarbe = (kreuz,pik,herz,karo,jokerf); CardMotiv = TBitmap; TCard = class(TObject) private { private declarations } Farbe : CardFarbe; Wert : CardWert; Count : Integer; Motiv :CardMotiv; MotivBack : CardMotiv; path:string; Zahl:integer; protected { protected declarations } public { public declarations } constructor Create(CWert:CardWert; CFarbe : CardFarbe; CCount : Integer; CMotiv, BMotiv :CardMotiv; pa:string; za:integer); published { published declarations } end; ... ... ... var Form1: TForm1; Blatt: array of TCard; // alle Karten a , b : array of TCard; tb : array of TCard; implementation ... es folgen der constructor create .... und weitere prozeduren ... ... dann kommt die Prozedur mit dem Fehler: procedure TForm1.Abheben; var a,t,zz,i : integer; begin zz:=0; repeat randomize; a:=random(length(blatt)); inc(zz); until ((a > 30) and (a < 90)); // Abheben min. 30 max. 90 Karten von 109 setlength(tb,a); tb:= copy(blatt,0,a-1); {inkompatible typen????} { TODO : Aufklärung "Inkompatible Typen" ???? } end; |
AW: Inkompatible Typen
Willkommen in der DP!
Sorry für alten link, sollte dennoch seine Gültigkeit haben. Lese mal was ![]() Daraus sollte sich ergeben was das eigentliche Problem ist. (Copy arbeitet mit Strings oder eingeschränkt auch Arrays) Erwartet wird aber ein Typ TCard. |
AW: Inkompatible Typen
Ich glaube nicht, dass das Problem das Copy ist.
Delphi-Quellcode:
ist nicht unbedingt
array of TCard
Delphi-Quellcode:
, jedenfalls nicht für den Compiler. Definiere einen weiteren Typ, z.B.
array of TCard
Delphi-Quellcode:
und nutze diesen in der Variablendeklaration. Dann sollte es funktionieren. Auch wenn ich weiß, dass es so ist, kann ich nicht erklären warum (aber himitsu oder jemand anders kann das sicher).
TCardArray = array of TCard
Grüße Dalai |
AW: Inkompatible Typen
Jupp,
Delphi-Quellcode:
als Typ definiert immer wieder einen eigentändigen Typ.
array of ...
Über den generic
Delphi-Quellcode:
ist das nicht so, da werden alle "gleichen" Typen global geshared, so als wenn man selber einen Typen definieren und überall verwenden würde.
TArray<...>
|
AW: Inkompatible Typen
Hallöle...8-)
Delphi-Quellcode:
Du hast in deinem Quellcode "syntaktische" Fehler.
type
CardWert = (ass,zwei,drei,vier,fuenf,sechs,sieben,acht,neun,z ehn,bube,dame,koenig,jokerw); CardFarbe = (kreuz,pik,herz,karo,jokerf); CardMotiv = TBitmap; TCard = class(TObject) private { private declarations } Farbe : CardFarbe; Wert : CardWert; Count : Integer; Motiv :CardMotiv; MotivBack : CardMotiv; path:string; Zahl:integer;
Delphi-Quellcode:
muß heißen:
type
CardWert
Delphi-Quellcode:
Schau dir mal den Delphi StyleGuide an.
type
TCardWert ![]() Das ist eine Art Respekt an die das lesen sollen/müssen... :zwinker: PS: Bitte kein denglisch verwenden. :zwinker:
Delphi-Quellcode:
PS1:
TCardWert besser TCardValue
...
Delphi-Quellcode:
Heute braucht man nicht mit Buchstaben geizen... In 2 Monaten weißt du im Quelltext nicht mehr was "a" bedeutet. Sprechende Namen sind besser. :thumb:
var a,t,zz,i : integer;
... PS2: Bitte formatiere dir deinen Quelltext mit dem "Helm Symbol" im Editor. Das ist einfach übersichtlicher. :wink: Ansonsten viel Spaß hier...:dp: |
AW: Inkompatible Typen
Dann vielleicht noch ein Typ zur Zufalls-Generierung:
"randomize" brauchst du nur 1x für die ganze Anwendung aufrufen, z.B. im FormCreate oder so. Wenn du eine Zufallszahl zw. 30 und 90 willst kannst du auch in etwa das Folgende schreiben und dir die Schleife sparen: a:=31+random(59); |
AW: Inkompatible Typen
Willkommen im Club, Wiwa53,
Du kannst Deinen QuellCode hier mit Hilfe des Delphi-Symbols (= Helm mit rotem Kamm gleich über der ersten Zeile im Editor) richtig formatieren, damit er besser lesbar ist. Gruß, Andreas |
AW: Inkompatible Typen
Moin...8-)
Diese Logic verstehe ich nicht...
Delphi-Quellcode:
Wie ist eigentlich dein Kenntnisstand bei Delphi?
a:=random(length(blatt)); // ermittlung der Karte aus dem Blatt (Integer zwischen 0 und 109)
inc(zz); // Anzahl der Karten until ((a > 30) and (a < 90)); // Abheben min. 30 max. 90 Karten von 109 // ??? müßte das nicht statt a zz heißen setlength(tb,a);// ??? müßte das nicht statt a zz heißen Ich würde 2 Listen benutzen (TObjectList<TCard>). Die erste Liste mit dem gesamten Blatt füllen. Von der ersten Liste die gezogenen Karten in die andere Liste verschieben... :wink: |
AW: Inkompatible Typen
Hallo alle miteinander.
Erst einmal vielen vielen Dank für die netten Hinweise und Tipps. :-D Ich spiele seit Turbo Pascal Zeiten (1980' Jahre) mehr oder weniger hobbymäßig mit dieser Sprache herum und weiß Gott bin ich vom Titel "Programmierer" weit entfernt. Habe in meiner beruflichen Laufbahn (bin inzwischen "Privatier" 8-) ) als IT-Admin so einige Tools im Delphi geschrieben, meist System-relevante Sachen wie, Registry im Netzwerk ändern, Netzwerk-Clients auflisten, User-Interface für AD Benutzerverwaltung unter Beachtung Firmenspezifischer Vorgaben und Einstellungen (das allerdings in C#). Eigentlich bin ich eher ein GUI Programmierer. Deshalb wage ich mich nun (recht verspätet) mal an die höhere Logik des OOP heran. haentschman: Ich habe vor einen Kartenstapel abzuheben und die unterschiedlichen Stapel vermischt zusammenzuführen. Ist nur ein Test für späteres Aufteilen in verschiedene Spielerstapel. Dabei mache ich einen repeat bis die Stapelgröße >30 <90 entspricht. Diese Menge weise ich dem neuen TCard-Array zu. Dann entsteht der Fehler. Das mit dem CardWert -> TCardWert bzw. TCardValue ist aber nur Style und führt sicher nicht zu dem Fehler (ich weiß schön, lesbar nach einiger Zeit ist mein Code noch nicht) Jumpy: Cool, das mit dem a:=31+random(59), sowas hab ich noch nicht gesehen. Dalai und himitsu: Danke, den Tipp werde ich ausprobieren. KodeZwerg: Das mit dem Copy für dynamische Arrays habe ich in der offiziellen Delphi Hilfe gefunden. Dort steht sowas wie: Beim Zuweisen von einem dyn. Array zum anderen wird nur der Zeiger übergeben und referenziert den selben Wert, d.h. ändere ich dann den Wert im 2. Array wird die Änderung im 1. Array auch sichtbar. Deshalb empfiehlt die Hilfe Copy. Danke nochmals, war alles sehr informativ. |
AW: Inkompatible Typen
Dalai und himitsu: Danke so gehts:
Type TCardArray = Array of TCard; Happy :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 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