Tworzenie własnego komponentu po TEdit a property TColor

Odpowiedz Nowy wątek
2013-06-13 23:15
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

edytowany 1x, ostatnio: misiakufal, 2013-06-13 23:27

Pozostało 580 znaków

2013-06-13 23:34
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ść.

edytowany 1x, ostatnio: Azarien, 2013-06-13 23:34

Pozostało 580 znaków

2013-06-13 23:52
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-06-14 13:00
4

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

tak, wiem ze powinno się budować obiekty w oparciu o klasy Custom*, jednak ten problem testowałem i na TEdit i na TCustomEdit i działo się to samo - misiakufal 2013-06-14 23:05

Pozostało 580 znaków

2013-06-14 22:51
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ł?

Z czego wywnioskowałeś że "dalej jest domyślnie clBlack" ? - _13th_Dragon 2013-06-14 22:58
może źle sie wyraziłem... jak tworze obiekt dynamicznie, to faktycznie jest clGreen, jednak jak tworzę w czasie projektowania, to w ObjectInspectorze jest dalej clBlack i po uruchomieniu programu dalej jest clBlack - misiakufal 2013-06-14 23:02
Odinstaluj i zainstaluj ponownie swój komponent. - _13th_Dragon 2013-06-14 23:08
wyrejestrowanie komponentu, restart IDE i ponowna instalacja i nadal bez zmian. Tworzony dynamicznie działa poprawnie, statycznie nie... Zainstalowanie tego samego komponentu na innym PC też z Delphi6 i takie same objawy, czyli nie jest kwestia uwalonego IDE - misiakufal 2013-06-14 23:14
Oczywiście używasz tą 3-cią wersje ? - _13th_Dragon 2013-06-14 23:21
tak, trzecią, inherited a potem ustawienie koloru - misiakufal 2013-06-14 23:26

Pozostało 580 znaków

2013-06-14 23:38

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


I tak jak napisał @Juhas - staraj się wykorzystywać klasy TCustom*; Pomimo tego powyższy kod działa i z jedną i drugą klasą; - furious programming 2013-06-14 23:40
Ok, to i tak było testowo, domyślnie będę faktycznie dziedziczył po TCustomach - misiakufal 2013-06-14 23:46

Pozostało 580 znaków

2013-06-14 23:45
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ę :)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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