Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 1 Frage zur Komponenten-Erstellung (https://www.delphipraxis.net/58210-1-frage-zur-komponenten-erstellung.html)

usnzi02n4m 3. Dez 2005 01:35


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.

Luckie 3. Dez 2005 01:39

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.

Hansa 3. Dez 2005 02:26

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.

Luckie 3. Dez 2005 02:36

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 Delphi-Referenz durchsuchenSets zu tun hat.

Hansa 3. Dez 2005 03:01

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 ?

Jelly 3. Dez 2005 07:48

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 hier

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:
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.
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.

tigerman33 3. Dez 2005 10:39

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.

SirThornberry 3. Dez 2005 11:47

Re: 1 Frage zur Komponenten-Erstellung
 
wenn er es wie TColor machen will braucht er nur die entsprechenden Constanten definieren.

usnzi02n4m 3. Dez 2005 12:17

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:
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
  ...
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.

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...

SirThornberry 3. Dez 2005 12:19

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 15:21 Uhr.
Seite 1 von 2  1 2      

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