AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

1 Frage zur Komponenten-Erstellung

Ein Thema von usnzi02n4m · begonnen am 3. Dez 2005 · letzter Beitrag vom 6. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
usnzi02n4m
(Gast)

n/a Beiträge
 
#1

1 Frage zur Komponenten-Erstellung

  Alt 3. Dez 2005, 01:35
Hallo,

ich hoffe, ich poste in die richtige Rubrik, ansonsten sorry

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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: 2 Fragen zur Komponenten-Erstellung

  Alt 3. Dez 2005, 01:39
Bitte halte dich an den Kodex und stelle nur eine Frage pro Thread. Editier bitte dein ersten Psoting dahingehend.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#3

Re: 1 Frage zur Komponenten-Erstellung

  Alt 3. Dez 2005, 02:26
Herzlich willkommen in der DP, auch im Namen von Luckie. grummel 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: 1 Frage zur Komponenten-Erstellung

  Alt 3. Dez 2005, 02:36
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

Re: 1 Frage zur Komponenten-Erstellung

  Alt 3. Dez 2005, 03:01
Sets ? Hmmm 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 ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#6

Re: 1 Frage zur Komponenten-Erstellung

  Alt 3. Dez 2005, 07:48
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.
  Mit Zitat antworten Zitat
tigerman33

Registriert seit: 30. Jul 2005
Ort: München
423 Beiträge
 
Delphi 2005 Professional
 
#7

Re: 1 Frage zur Komponenten-Erstellung

  Alt 3. Dez 2005, 10:39
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.
Christian
Der Computer hilft mir, Probleme zu lösen, die ich ohne Computer nicht hätte.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: 1 Frage zur Komponenten-Erstellung

  Alt 3. Dez 2005, 11:47
wenn er es wie TColor machen will braucht er nur die entsprechenden Constanten definieren.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
usnzi02n4m
(Gast)

n/a Beiträge
 
#9

Re: 1 Frage zur Komponenten-Erstellung

  Alt 3. Dez 2005, 12:17
Hallo,

super, dass so viele antworten kommen

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...
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

Re: 1 Frage zur Komponenten-Erstellung

  Alt 3. Dez 2005, 12:19
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 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