Tworzenie własnego komponentu po TEdit a property TColor

0

Witam!

Próbuję stworzyć komponent dziedziczący po TEdit, w którym dodaje dodatkowe właściwości typu TColor. Jednak niezależnie od domyślnej wartosci zawsze w ObjectInspectorze dostaję clBlack;

  TTestEdit = class(TEdit)
  private
   _tc:TColor;
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
   property tmp:TColor read _tc write _tc  default clGreen;
    { Published declarations }
  end;

Z tego co rozumiem, właściwosć tmp powinna sie ustawić domyślnie na clGreen, tak sie jednak nie dzieje. Jak ustawić domyslną wartosć typu TColor? Piszę w Delphi6

Pozdrawiam

0

dodatkowo ustaw clGreen w konstruktorze. dziwne to, ale prawidłowo działa dopiero jak jest i default i inicjalizacja w konstruktorze na tę samą wartość.

0
Azarien napisał(a):

dziwne to, ale prawidłowo działa dopiero jak jest i default i inicjalizacja w konstruktorze na tę samą wartość.
Nie ma w tym nić dziwnego.
Konstruktor ustawia wartość tuż po stworzeniu obiektu, natomiast default oznacza że tą wartość nie zapisujemy do zasobów. Więc załóżmy że w konstruktorze dajesz clRed zaś w default clGreen wrzucasz obiekt na formatkę ustawiasz na clGreen i zapisujesz formatkę. Właściwość się nie zapisze ponieważ jest domyślna, natomiast kiedy formatka będzie się odczytywać to w konstruktorze ustawi się na clRed zaś z zasobów się nie wczyta bo nie została zapisana. Więc zostanie clRed.

4

Od siebie dodam, że powinno się tworzyć po TCustom*. Czyli nie tworzysz na bazie TEdit, tylko na bazie TCustomEdit.

0

no więc tak jak mówiliście, dopisałem konstruktor i w nim ustawienie koloru... i nadal bez zmian, jest clBlack


  TTestEdit = class(TEdit)
  private
   _tc:TColor;
    { Private declarations }
  protected
    { Protected declarations }
  public
    constructor Create(AOwner:TComponent); overload;
    { Public declarations }
  published
   property tmp:TColor read _tc write _tc  default clGreen;
    { Published declarations }
  end;

procedure Register;

implementation

constructor TTestEdit.Create(AOwner:TComponent);
begin
 self.tmp:=clGreen;
end;

próbowałem też wartiantów:

constructor TTestEdit.Create(AOwner:TComponent);
begin
 self._tc:=clGreen;
end;
constructor TTestEdit.Create(AOwner:TComponent);
begin
 inherited Create(AOwner);
 self._tc:=clGreen;
end;

i bez zmian, dalej jest domyślnie clBlack... czy ktoś ma jakiś pomysł?

1

@misiakufal - ten kod:

  TTestEdit = class(TEdit)
  private
   _tc:TColor;
    { Private declarations }
  protected
    { Protected declarations }
  public
    constructor Create(AOwner:TComponent); overload; // wtf?
    { Public declarations }
  published
   property tmp:TColor read _tc write _tc  default clGreen;
    { Published declarations }
  end;
 
procedure Register;
 
implementation
 
constructor TTestEdit.Create(AOwner:TComponent);
begin
 self.tmp:=clGreen;
end;

jest błędny - nie wywołujesz konstruktora bazowego (przez Inherited);


Sprawdziłem u siebie bo coś mi się wierzyć nie chciało - sam tworzyłem kontrolki, które posiadały dodatkowe właściwości typu TColor i wszystko zawsze ustawiałem w konstruktorze (bez magicznego słówka Default) i zawsze działało bez najmniejszego problemu; Sprawdziłem jeszcze raz - taki sam efekt; Wystarczy kolor zainicjować w konstruktorze i zarówno podczas projektowania formularzy oraz działania programu kolor jest taki, jaki tego chce;

Poza tym konstruktor powinien być przesłonięty (magiczne słówko Override) a nie przeładowany (słówkiem Overload) - pewnie dlatego kolor nie jest ustawiany w konstruktorze, bo przy tworzeniu kontrolki wykorzystywany jest bazowy (w którym inicjacji koloru nie ma) zamiast Twojego;


Zainstaluj u siebie kontrolkę o takim kodzie:

unit FooEdit;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, Graphics;

type
  TFooEdit = class(TEdit)
  private
    FTmpColor: TColor;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy(); override;
  published
    property TmpColor: TColor read FTmpColor write FTmpColor;
  end;

procedure Register;

implementation

constructor TFooEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FTmpColor := clGreen;
end;

destructor TFooEdit.Destroy();
begin
  inherited Destroy();
end;

procedure Register;
begin
  RegisterComponents('FooControls', [TFooEdit]);
end;

end.

i sprawdź czy działa; Co prawda sprawdzany pod Delphi 7, ale powinien być kompatybilny.

0

Furious Programming

No i masz racje, override a nie overload - w tym był problem. Natomiast dziwne, ze działało to w momencie dynamicznego tworzenia komponentu. Co do inherited w konstruktorze - potem dodałem, jednak bez efektu. No jednak problem udało się rozwiązać, dziękuję :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1