![]() |
1 Frage zur Komponenten-Erstellung
Hallo,
ich hoffe, ich poste in die richtige Rubrik, ansonsten sorry :x Ich möchte eine eigene Komponente (TSpielkarte) programmieren, die eine Karte aus einem Kartenspiel "simuliert". Abgeleitet habe ich sie von TGraphicControl. Eine Eigenschaft nennt sich "Wert" und beinhaltet Integerwerte zw. 0 und 32. 0 entspr. dem Deckblatt und die Werte 1..32 den versch. Karten. Nun hab ich eine Frage: 1) Wie bekomme ich es hin, dass ich als "Werte" nicht nur '0'..'32' (als Integer) eintragen kann, sondern z.B. auch "KrAs" (steht für KreuzAss), "PiDa" (Pik Dame) u.s.w.? Das Prinzip entspricht dem von TColor-Werten: clBlack = $00000000 = 0. Hab's schon über Konstanten versucht, z.B.: "const KrAs = TSpielkarte(1);", allerdings ohne Erfolg: Beim Eintragen von "KrAs" als Wert (Eigensch. der Komp.), sagt Delphi, dass dies kein Integerwert sei. Ich bedanke mich schonmal recht herzlich im Voraus. Markus editiert: sorry, wusste nicht, dass man nur eine Frage pro Thread stellen darf. |
Re: 2 Fragen zur Komponenten-Erstellung
Bitte halte dich an den Kodex und stelle nur eine Frage pro Thread. Editier bitte dein ersten Psoting dahingehend.
|
Re: 1 Frage zur Komponenten-Erstellung
Herzlich willkommen in der DP, auch im Namen von Luckie. grummel :lol: Komponenten zu erstellen ist nicht so einfach. Da muß man zumindest ein gewisses Hintergrundwissen haben. Der Hauptfehler ist hierbei, daß man OOP nicht richtig einzusetzen weiß. 8) Dabei geht es um Vererbung und man fängt hierbei nicht mit Adam und Eva an. Ein geeignetes Vorfahr-Control für Spielkarten dürfte eigentlich TImage sein. Da nun die Nr. der Spielkarte unterzubringen ist wohl kein Problem.
Ohne eine Zeile Quelltext kann hier aber niemand etwas genaues dazu sagen. |
Re: 1 Frage zur Komponenten-Erstellung
Also erstmal solltest du dich mit der Obejekt Orientierten programmierung und in diesem Zuge mit Klassen vertraut machen.
Und irgendwie sagt mir mein Programmiererbauchgefühl, dass sich dein Problem mit ![]() |
Re: 1 Frage zur Komponenten-Erstellung
Sets ? Hmmm :gruebel: Glaube das macht keinen Sinn. Selbst beim Poker müßte man ein Array benutzen wegen der 5 Karten, die nicht gleich sein dürfen. Die 32 Karten müßten eigentlich in das Array und sofern eine gezogen ist, dann muß das dem Array bekannt sein. Also Flag "BereitsGezogen" könnte man setzen.
@Fragesteller : ist Dir bekannt, daß eine Komponente im üblichen Sprachgebrauch etwas ist, das die Komponentenpalette in der IDE erweitert ? In dem Fall hier gehts also wohl darum, eine Karte auf eine Form zu ziehen und da den Wert einzustellen im Objektinspektor. Ist es Dir bereits gelungen überhaupt eine Komponente da unterzubringen, die keine erweiterten Einstellungen im OI hat, außer denen der Vorfahrklasse ? Eine, die also bloß registriert wird und sonst nichts macht, aber eben zu sehen ist ? |
Re: 1 Frage zur Komponenten-Erstellung
Wenn Du schon den Vergleich mit TColor heranziehst... Sowas geht nur mit PropertyEditor. Abhängig von deiner Delphi Version sind die aber nicht überall gleich einzusetzen. Dazu mehr gibts
![]() Um anzufangen solltest Du deine Karte nicht als Integer auswählen, sondern als String, oder besse noch als eigenen Typ, der nur die gewünschten Werte erlaubt. Hier mal ein Grundgerüst, wie das mit den PropertyEditors geht
Delphi-Quellcode:
Wichtig ist, dass du Die Unit, in der du deine Komponente (und Propertyeditors) registrierst (Procedure Register) trennst von deiner Komponente. Aber das steht alles sauber erklärt im obigen Link.
unit MailTemplateClasses6_reg;
interface procedure Register ; implementation uses classes, MailTemplateClasses6, DesignEditors, DesignIntf, adoint, sysutils, olectrls, dialogs ; type TMailFileOpen = class (TPropertyEditor) public procedure Edit; override; function GetAttributes: TPropertyAttributes; override; function GetValue:string; override; end ; procedure Register ; begin RegisterPropertyEditor (TypeInfo(string),TMailTemplateFile,'Filename',TMailFileOpen) ; end ; { TMailFileOpen } procedure TMailFileOpen.Edit; var OD : TOpenDialog ; begin //inherited; OD := TOpenDialog.create (nil) ; if OD.Execute then begin TMailTemplateFile(GetComponent(0)).Filename := OD.Filename ; end ; end; function TMailFileOpen.GetAttributes: TPropertyAttributes; begin GetAttributes := [paDialog]; end; function TMailFileOpen.GetValue: string; begin GetValue := TMailTemplateFile(GetComponent(0)).Filename ; end; end.unit Unit1; interface implementation end. |
Re: 1 Frage zur Komponenten-Erstellung
Den Kartenwert als String??
Das würde ich nun wieder gar nicht empfehlen. Da müsste man dann anschließend die Kartenidentität durch lauter Stringvergleiche prüfen, das dauert nicht nur länger sondern ist auch ziemlich unelegant. Ich schließe mich Luckie an, hier ist ein Enumerationstyp sinnvoll. Eigentlich sogar zwei, einer für die Farbe (Herz, Karo, Pik, Kreuz) und einer für den Wert. Der Kartenwert setzt sich dann als record aus den beiden zusammen. So kann man Abfragen z.B. für Stiche o.ä. (weiß ja nicht was du vor hast...) sehr einfach implementieren. |
Re: 1 Frage zur Komponenten-Erstellung
wenn er es wie TColor machen will braucht er nur die entsprechenden Constanten definieren.
|
Re: 1 Frage zur Komponenten-Erstellung
Hallo,
super, dass so viele antworten kommen :-D Eine Komponente zu erzeugen ist nicht das Problem. Das Grundgerüst steht und compilieren lässt sie sich auch schon, d.h. sie ist auch schon in der Komponentenleiste in der IDE verfügbar. Ich kann sie auch auf ein Formular ziehen und benutzen. Zum Einstellen des Kartenwertes hatte ich der Komponente eine Eigenschaft Wert (property Wert: TKartenwert read...) spendiert. Dabei ist TKartenwert folgendes gewesen: TKartenwert = (KrAs, KrKo, KrDa, ... , Ka8, Ka7) also ein selbstdefinierter Aufzählungstyp. Im Objektinspector hatte man nun eine Eigenschaft, bei der man per DropDown-Liste den Wert auswählen durfte (z.B. KrAs). Nun würde ich aber auch gerne die Karten über numerische Werte ansprechen können. Ansich kein Problem, da Delphi Aufzählungstypen selber ordnet und durchnummeriert. ABER im Objektinspector kann man nur über die DropDown-Liste (mit den KrAs,...) den Wert einstellen und nicht z.B. eine 1 eintragen für das Kreuz Ass. Also hab ich mir angeschaut wie TColor implementiert wurde und hab meine Komponente folgendermassen geändert:
Delphi-Quellcode:
Aber ich kann nun im Objectinspector nur Zahlen von 0 bis 32 eintragen und keine Konstante wie z.B. kwKrAs. Macht man dies bekommt man die Fehlermeldung "kwKrAs ist kein Integerwert" (sinngemäß). Dies möchte ich aber irgendwie hinbekommen, da diese Konstanten intuitiv besser mit den Karten in Verbindung gebracht werden als ein Zahl.
type
TKartenwert = 0..32; TSpielkarte = class(TGraphicControl) private { Private-Deklarationen } bmp: TBitmap; value: TKartenwert; constructor Create(AOwner : TComponent); override; procedure Paint; override; procedure setValue(param: TKartenwert); destructor Destroy; override; protected { Protected-Deklarationen } public { Public-Deklarationen } published { Published-Deklarationen } property Wert: TKartenwert read value write setValue; end; const kwKrAs = TSpielkarte(1); // (K)arten(W)ert (Kr)euz(As)s kwKrKo = TSpielkarte(2); // (K)arten(W)ert (Kr)euz(Ko)enig ... Grüsse Markus PS: Die Komponente is noch längst nicht fertig, es werden noch Eigenschaften folgen. PPS: Falls keine Lösung für das Problem existiert, finde ich die Idee von tigerman33 recht ansprechend, danke für die ideen... |
Re: 1 Frage zur Komponenten-Erstellung
wenn du es ganz einfach haben willst kann du einfach noch ein zweites property machen und wenn dieses zugewiesen wird setzt du das gandere Property mit.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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