Avatar billede speedy Nybegynder
16. april 2002 - 13:14 Der er 9 kommentarer og
1 løsning

Træstruktur i properties i komponent

Hej,

Jeg er ved at lave en komponent i Delphi. Jeg skal have en property i Object Inspectoren med flere niveauer ligesom f.eks. en forms Font. Altså sådan at der kommer et plus ud for Font.

Jeg vil lave det sådan at man har en property der hedder BorderColor som så skal poppe ud og vise
ColorLeft, ColorRight, ColorTop og ColorBottom som 4 underproperties.

Først prøvede jeg at lave en record med disse 4 variabler i, og bruge den som property, men det virkede ikke...

Er der nogen der kan hjælpe ?

/SpEeDy
Avatar billede Slettet bruger
16. april 2002 - 20:02 #1
Prøv at lave det som en komponent.

type
  TColorClass = class(TObject)
  private
    { Private declarations }
    Left:Integer;
    Right:Integer;
    Top:Integer;
    Bottom:Integer;
  protected
    { Protected declarations }
  public
    { Public declarations }
    property ColorLeft read Left write Left;
    property ColorRight read Right write Right;
    property ColorTop read Top write Top;
    property ColorBottom read Bottom write Bottom;
    constructor Create;
  published
    { Published declarations }
  end;

implementation

constructor TColorClass.Create;
Begin
    Left:=0;
    Right:=0;
    Top:=0;
    Bottom:=0;
End;



Mvh. Simon
Avatar billede badass Nybegynder
17. april 2002 - 09:53 #2
Du skal lave din egen property-editor

TMyPropertyEditor = class(TClassProperty)
Public
  Procedure Edit;Override;
  Function GetAttributes:TPropertyAttributes;Override;
end;

Procedure TMyPropertyEditor.Edit;
begin
// Kode som skal udføres når værdier ændres
end;

Function TMyPropertyEditor.GetAttributes:TPropertyAttributes;
begin
  Result:=Inherited GetAttributes+[paSubProperties];
end;

Procedure Register;
begin
  RegisterPropertyEditor(TypeInfo(TMyObject),
                        TMyComponent,'MyProperty',TMyPropertyEditor);
end;

TMyObject = obkjektet som refereres til
TMyComponent = komponenten som har den givne property
MyProperty = property'ens navn
TMyPropertyEditor = propertyeditor'en

Se iøvrigt emnet "TPropertyEditor" i onlinehjælpen, der findes nogle funktioner til at få fat i subproperties med.

// BadAss
Avatar billede speedy Nybegynder
17. april 2002 - 14:32 #3
Nej, jeg tror i misforstår mig...

Jeg vil ikke lave min egen property editor, jeg vil bare have nogle under-properties i stil med dem under Font...altså IKKE den dialog der kommer frem...men de underpunkter der er f.eks. color, size osv..

/SpEeDy
Avatar billede Slettet bruger
17. april 2002 - 22:17 #4
prøv at se på mit forslag
og
prøv at hive hjælpen frem for TFont der kan du se at den består af en komponent.

Mvh. Simon
Avatar billede speedy Nybegynder
20. april 2002 - 11:33 #5
jeps, jeg har kigget på dit eksempel, og jeg kan ikke få det til at virke...Det tætteste jeg har været på noget der virkede var at der var et plus ud for property'en men det kunne ikke åbnes..-

Kan du ikke lave en simpel komponent hvor det eneste man kan er at vælge farver på den måde jeg har forklaret...for jeg kan ikke få det til at virke...

/SpEeDy
Avatar billede speedy Nybegynder
22. april 2002 - 10:53 #6
Nå, så lukker jeg igen...Hvis du laver eksemplet skal jeg nok oprettet et spm. igen med point til dig.

/SpEeDy
Avatar billede speedy Nybegynder
22. april 2002 - 10:53 #7
Ups
Avatar billede Slettet bruger
22. april 2002 - 22:48 #8
undskyld mit sene svar men jeg har haft travlt med nogle prøver

dette duer hos mig
du skal bare sikre dig at den bliver lavet (Create) inden den bliver hentet.

unit Sub;

interface

uses
  Classes, ExtCtrls, SysUtils, Graphics;

type
  TChar=(a,b,c,d,e);
  TCharSet=Set of TChar; 
  TSab = class(TPersistent)
  private
    { Private declarations }
    fOnChange: TNotifyEvent;
    I1,I2:Integer;
    procedure SetI1(I:Integer);
    procedure SetI2(I:Integer);
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create;
    destructor Destroy;
    procedure Assign(Source: TPersistent); override;
  published
    { Published declarations }
    Property X:Integer read I1 write SetI1 default 1;
    Property Y:Integer read I2 write SetI2 default 2;
    property OnChange: TNotifyEvent read fOnChange write fOnChange;
  end;
  TSub = class(TImage)
  private
    { Private declarations }
    FSab:TSab;
    FChar:TCharSet;
    function GetSab:TSab;
  protected
    { Protected declarations }
  public
    { Public declarations }
    destructor Destroy;
    constructor Create(AOwner: TComponent);
  published
    { Published declarations }
    property B:TSab read GetSab write FSab;
    property A:TCharSet read FChar write FChar;    //Set hvis du ønsker sand falsk kun
  end;

procedure Register;

implementation

{TSab}

constructor TSab.Create;
Begin
    I1:=1;
    I2:=2;
    If Assigned(FOnChange) Then
    FOnChange(Self);
    Inherited Create;
End;

destructor TSab.Destroy;
Begin
    Inherited Destroy;
end;

procedure TSab.Assign(Source: TPersistent);
Begin
    If Assigned(Source) and (Source is TSab) Then
    Self:=TSab(Source);
    If Assigned(FOnChange) Then
    FOnChange(Self);
End;

procedure TSab.SetI1(I:Integer);
Begin
    I1:=I;
    If Assigned(FOnChange) Then
    FOnChange(Self);
End;

procedure TSab.SetI2(I:Integer);
Begin
    I2:=I;
    If Assigned(FOnChange) Then
    FOnChange(Self);
End;

{TSub}

function TSub.GetSab:TSab;
Begin
    If not Assigned(FSab) Then
    FSab:=TSab.Create;
    Result:=FSab;
End;

constructor TSub.Create(AOwner: TComponent);
Begin
    FSab:=TSab.Create;
    Inherited Create(AOwner);
End;

destructor TSub.Destroy;
Begin
    FSab.Free;
    Inherited Destroy;
End;

procedure Register;
begin
  RegisterComponents('Egne', [TSub]);
end;

end.

Mvh. Simon
Avatar billede speedy Nybegynder
22. april 2002 - 23:24 #9
Det virker i hvert fald...jeg vender tilbage i morgen...så opretter jeg lige et spm. til dig..Tak for hjælpen!

/SpEeDy
Avatar billede speedy Nybegynder
23. april 2002 - 10:42 #10
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester