Eigene Attribute?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Eigene Attribute?

Beitrag von hendy »

Kann man festen Teilen (z.B. Tbutton) zusätzlich Attribute geben?
Wenn ja, wie und wo?
Dankt monta !!

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Eigene Attribute?

Beitrag von MacWomble »

Hallo,
ich denke, dies ist durch Ableitung zu erreichen.
Zuletzt geändert von MacWomble am Di 19. Mai 2009, 13:25, insgesamt 2-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Eigene Attribute?

Beitrag von monta »

Einfach eine Classe davon ableiten und dann lediglich die eigenen Sachen Ergänzen und Create und Inherited vererben, bspw.:

Mal ein Beispiel:

Code: Alles auswählen

type
  TExtXMLDocument = class(TXMLDocument)
  private
  public
    procedure LoadFromStream(Stream: TStream);
  end;
 
procedure TExtXMLDocument.LoadFromStream(Stream: TStream);
var XML: TXMLDocument;
begin
  ReadXMLFile(XML, Stream);
  Self.TextContent := XML.TextContent;
end;


Und schon hab ich ein TXMLDocument, was neben allen Eigenschaften die es eh schon hatte, nun auch (wie Delphi) ein LoadFromStream unterstützt. Kannst du mit TButton bspw. genau so machen.

Wenn das ganze als Komponente vorliegen soll, musst du es natürlich noch zum Installieren in die IDE als Package verpacken.

//Womble war schneller ;)
Johannes

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: Eigene Attribute?

Beitrag von hendy »

sry, aber das sagt mir garnix :(
Ich will nur ein Attribut und nicht ne ganze funktion erstellen, z.B. Tbutton.Rang
Dankt monta !!

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Eigene Attribute?

Beitrag von monta »

Ein Attribut, und das soll scheinbar ne Zahl sein, interpretier ich Rang da richtig?

Dann nutz doch einfach die verfügbare Eigenschaft TButton.Tag, die gibt es bei allen Komponenten und kann frei für integer vewendet werden.

Ansonsten geht das mit eigenschaften genau so mit OOP:

Code: Alles auswählen

type
  THendyButton = class(TButton)
  private
  public
    Rang: integer;
  end;


Lazarus unterstützt die Package-Geschichte auch, wenn du auf Package > Neues Package gehst und dort auf Hinzufügen > Komponente usw...

Aber ich würde wirklich nochmal überlegen, ob sich das wegen einer simplen Property lohnt, ich denk fast, nicht ;).
Johannes

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: Eigene Attribute?

Beitrag von hendy »

also kann ich unter public rang:=3 definieren und dann im Programm Button1.Rang aufrufen?
Das mit .Tag wird nnicht gehen, sollen so ca 3-4 Attribute werden, strings und integer
Dankt monta !!

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Eigene Attribute?

Beitrag von Scotty »

Du leitest eine Klasse ab und definierst zusätzliche Methoden oder Eigenschaften. Diese neue Klasse muss im Programmcode erzeugt werden und ist dann nach Belieben beeinflussbar.

Code: Alles auswählen

type
  THendyButton = class(TButton)
  private
    FRang:integer;
    FOddRang:boolean;
    FIdent:string;
    function GetOddRang:boolean;
  public
    constructor Create...
    property Rang: integer read FRang write FRang;
    property OddRang:boolean read GetOddRang;
    property Ident:string read FIdent write FIdent;
  end;
 
constructor THendyButton.Create...
begin
  inherited;
  FRang:=3;
  FIdent:='Hendys Button';
end;
 
function THendyButton.GetOddRang:boolean;
begin
   Result:=odd(FRang);
end;
//---------------------
procedure TForm1.OnCreate...
var HendyButton:THendyButton;
begin
  HendyButton:=THendyButton.Create(form1);
  HendyButton.Parent:=form1;
  HendyButton.Top:=10;
  HendyButton.Rang:=1;
  HendyButton.OnClick:=@DoHendyClick;
end;

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Eigene Attribute?

Beitrag von monta »

Scotty hat eigentlich alles gesagt...und weil das ganze mit Buttons nicht so schön ist, im Code zu erstellen...im Anhang ein fertiges Paket, was dir das ganze demonstriert. Oben bei FRang... kannst du einfach deine Werte einfügen. Unter Published dann die Zugriffe deklarieren, damit sie auch im Objektinspektor sind und im Create kannst du noch bestimmte Werte als Ausgangswerte definieren.

Der Quelltext sollte selbsterklärend sein, ich hab auf alles unnütze verzichtet.

Einfach in Lazarus Package > Package-Datei öffnen wählen dann die lpk öffnen und anschließend öffnet sich der Package-Dialog wo du den Quelltext von hendybutten.pas noch anpassen kannst und wenn du auf installieren klickst, hast du das ganze oben in der Palette auf der Registerkarte Standard ganz hinten als visuelle Komponente und die neuen eingenschaften sind im OI zu finden.
Dateianhänge
Hendy.zip
(1.53 KiB) 60-mal heruntergeladen
Johannes

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: Eigene Attribute?

Beitrag von hendy »

oh man ich wollte keine Umstände machen ^^ aber trotzdem danke, schau ich mir mal an.
;)
Dankt monta !!

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Eigene Attribute?

Beitrag von monta »

naja, ich hatte gerade Zeit ;)
Johannes

Antworten