Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Eigene Komponete von TEdit ableiten? (https://www.delphipraxis.net/60936-eigene-komponete-von-tedit-ableiten.html)

Sharky 14. Jan 2006 14:31


Eigene Komponete von TEdit ableiten?
 
Hai ihr lieben,

ich möchte mir gerne ein eigenes TEdit erzeugen.
Jetzt gehört die Ableitung von (VCL)-Komponeten nicht zu meinen Stärken :oops:

Darum habe ich folgende Frage:

"Mein" Edit soll diese Funktionalität/Eigenschaft haben:
  • Ein Property "CheckEmpty" True/False
  • Wenn "CheckEmpty" auf True ist soll es, wenn es leer ist, "EmtpyColor" als Color verwenden werden.
  • Wenn "CheckEmpty" auf False ist soll "NoEmptyColor" als Color verwendest werden (wenn es leer ist).
  • In jedem Fall möchte ich das "IsEmpty (Boolean)" in abhängigkeit gesetzt wird.

Ich könnte das ja jetzt in Delphi-Referenz durchsuchenOnChange eines Edits lösen. Aber wie mache ich das sauber in einer von TEdit abgeleiteten Komponente/Klasse ?

Ich währe echt froh wenn mir einer von euch einen Anstoss geben könnte.

Danke :-D

mkinzler 14. Jan 2006 14:45

Re: Eigene Komponete von TEdit ableiten?
 
Zitat:

Zitat von Sharky
Hai ihr lieben,

ich möchte mir gerne ein eigenes TEdit erzeugen.
Jetzt gehört die Ableitung von (VCL)-Komponeten nicht zu meinen Stärken :oops:

Darum habe ich folgende Frage:

"Mein" Edit soll diese Funktionalität/Eigenschaft haben:
  • Ein Property "CheckEmpty" True/False
  • Wenn "CheckEmpty" auf True ist soll es, wenn es leer ist, "EmtpyColor" als Color verwenden werden.
  • Wenn "CheckEmpty" auf False ist soll "NoEmptyColor" als Color verwendest werden (wenn es leer ist).
  • In jedem Fall möchte ich das "IsEmpty (Boolean)" in abhängigkeit gesetzt wird.

Ich könnte das ja jetzt in Delphi-Referenz durchsuchenOnChange eines Edits lösen. Aber wie mache ich das sauber in einer von TEdit abgeleiteten Komponente/Klasse ?

Ich währe echt froh wenn mir einer von euch einen Anstoss geben könnte.

Danke :-D

Delphi-Quellcode:
unit Edit1;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, Graphics;

type
  TMyEdit = class(TEdit)
  private
    { Private-Deklarationen }
    FCheckEmpty: Boolean;
    FEmptyColor: TColor;
    FNoEmptyColor: TColor;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    function GetColor: TColor;
  published
    { Published-Deklarationen }
    property CheckEmpty: Boolean read FCheckEmpty write FCheckEmpty;
    Property Color: TColor read getColor;
  end;

procedure Register;

implementation

function TMyEdit.GetColor: TColor;
begin
    if FCheckEmpty then result := FEmptyColor else result := FNoEmptyColor;
   
end;
procedure Register;
begin
  RegisterComponents('MyComp', [TMyEdit]);
end;

end.
Ich hoffe, das war was du gewünscht hast.

SirThornberry 14. Jan 2006 14:46

Re: Eigene Komponete von TEdit ableiten?
 
du müsstest schauen wo das OnChange ausgelöst wird und die methode überschreiben (falls es eine methode gibt). In der Regel ist das eine Methode namens doChange etc.
Wenn dem nicht so ist musst du entweder von TCustomEdit ableiten (und das Onchange nicht nach außen reichen) und das OnChange dann wie normal auf eine Private/Public/protected-Procedure zuweisen oder das OnChange umbiegen.

@mkinzler: Ich denke sein Problem ist mehr die OnChange nutzung innerhalb der Komponente. Im übrigen stimmt deine GetColor methode nicht. Denn wenn CheckEmpty aktiv ist wird immer die Farbe verwendet als wäre es leer.

mkinzler 14. Jan 2006 14:48

Re: Eigene Komponete von TEdit ableiten?
 
Sorry es wär natürlich auch sinnvoll die Farben zu setzen :-) Bitte wie folgt ergänzen:
Delphi-Quellcode:
    property EmptyColor: TColor read FEmptyColor write FEmptyColor;
    property NoEmptyColor: TColor read FNoEmptyColor write FNoEmptyColor;

SirThornberry 14. Jan 2006 14:52

Re: Eigene Komponete von TEdit ableiten?
 
so, hab geschaut. TCustomEdit hat die Methode "Change". Diese also überschreiben (darin die Farbe setzen) und dann inherited.

@mkinzler: Wie ich gerade sehe hast du auch vergessen die Farben zu initialisieren mit standardwerten.

Delphi-Quellcode:
type
  TEdit = class(StdCtrls.TEdit)
  protected
    fCheckEmpty: Boolean;
    fEmptyColor: TColor;
    fNonEmptyColor: TColor;
    procedure Change; override;
    procedure FSetCheckEmpty(AValue: Boolean);
    procedure FSetColor(AType: Integer; AColor: TColor);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property CheckEmpty: Boolean read fCheckEmpty write fSetCheckEmpty default True;
    property ColorEmpty: TColor Index 0 read fEmptyColor write FSetColor;
    property ColorNonEmpty: TColor Index 1 read fNonEmptyColor write FSetColor;
  end;
[...]
constructor TEdit.Create(AOwner: TComponent);
begin
  fCheckEmpty := True;
  fEmptyColor := clBlue;
  inherited Create(AOwner);
  fNonEmptyColor := Color;
  Change;
end;

procedure TEdit.Change;
var LColor: TColor;
begin
  if fCheckEmpty then
  begin
    if Self.Text = '' then
      LColor := fEmptyColor
    else
      LColor := fNonEmptyColor;
  end else
    LColor := fNonEmptyColor;
  if LColor <> Color then
    Color := LColor;
  inherited;
end;

procedure TEdit.FSetCheckEmpty(AValue: Boolean);
begin
  if AValue <> fCheckEmpty then
  begin
    fCheckEmpty := AValue;
    Change;
  end;
end;

procedure TEdit.FSetColor(AType: Integer; AColor: TColor);
  procedure LSetVal(var ACurrVal: TColor);
  begin
    if (ACurrVal <> AColor) then
    begin
      ACurrVal := AColor;
      if fCheckEmpty then
        Change;
    end;
  end;
begin
  case AType of
    0: LSetVal(fEmptyColor);
    1: LSetVal(fNonEmptyColor);
  end;
end;

Sharky 15. Jan 2006 08:58

Re: Eigene Komponete von TEdit ableiten?
 
Zitat:

Zitat von SirThornberry
so, hab geschaut. TCustomEdit hat die Methode "Change". Diese also überschreiben (darin die Farbe setzen) und dann inherited. ...

Hai SirThornberry,

genau das war der Tip den ich brauchte :-D
Ich wusste einfach nicht welche Methode ich überschreiben muss. Gibt es denn eine Liste welche Methode wan aufgerufen wird?

SirThornberry 15. Jan 2006 09:10

Re: Eigene Komponete von TEdit ableiten?
 
keine Ahnung ob es solch eine Liste gibt, ich schau bei sowas in den sourcen nach bzw. verbiege das Event wenn ich die Methode nicht finde. In dem Fall hab ich also geschaut wo das onChange ausgelöst wird.
Ich hab so eben mal einen Blick in die Hilfe schweifen lassen um zu sehen ob bei OnChange vermerkt ist das man mit überschreiben der "Change"-Methode da noch was dazu basteln kann. Und Siehe da. Wenn man auf "See also" klickt kommt da unter anderem "change method"
Bei MouseDown hab ich aber zum Beispiel nix dergleichen gefunden, ist also immer ein bischen glück dabei oder man durchstöbert gleich die Quelltexte.

Sharky 15. Jan 2006 15:30

Re: Eigene Komponete von TEdit ableiten?
 
Hai Sir,

eine Frage habe ich noch:

Wenn ich deinen Code nehme und mir das ganze als eine Komponente registriere und ein "MyEdit" auf die Form ziehe funktioniert alles wie es soll. Wenn ich aber ein "MyEdit" das auf der Form liegt markiere , kopiere und ein neues einfüge hat diese als Wet für Color immer den Wert von ColorEmpty? Woran kann das denn liegen?
Wie gesagt es ist nur zur Entwurfzeit so, zur Leufzweit ist alles so wie es sein soll.

SirThornberry 15. Jan 2006 15:59

Re: Eigene Komponete von TEdit ableiten?
 
ich hab eine Vermutung, aber eben nur eine Vermutung. Wenn du das Edit vom Form kopierst ist das property "Color" gesetzt. Wenn du jetzt die Componente auf dem anderen Form wieder einfügst wird das Property Color auch gesetzt was ja im ersten Form den Wert von ColorEmpty hatte. Man müsste also noch das Property Color überschreiben.

Ich seh grad das Color so ein Property ist wo man nicht einfach eine Methode überschreiben kann (Set-Methode). Entweder man würde die Message abfangen oder das ganze umbiegen. Werd das gleich mal noch machen und dann hier reinstellen. Werde dafür das Property ColorNonEmpty weg rationalisieren so dass, das Edit den Wert von Color hat wenn es nicht leer ist.

Delphi-Quellcode:
  TEdit = class(StdCtrls.TEdit)
  protected
    fCheckEmpty: Boolean;
    fEmptyColor: TColor;
    fNonEmptyColor: TColor;
    procedure Change; override;
    procedure FSetCheckEmpty(AValue: Boolean);
    procedure FSetColor(AType: Integer; AColor: TColor);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property CheckEmpty: Boolean read fCheckEmpty write fSetCheckEmpty default True;
    property ColorEmpty: TColor Index 0 read fEmptyColor write FSetColor;
    property Color: TColor Index 1 read fNonEmptyColor write FSetColor;
  end;
[...]
constructor TEdit.Create(AOwner: TComponent);
begin
  fCheckEmpty := True;
  fEmptyColor := clBlue;
  inherited Create(AOwner);
  fNonEmptyColor := inherited Color;
  Change;
end;

procedure TEdit.Change;
var LColor: TColor;
begin
  if fCheckEmpty then
  begin
    if Self.Text = '' then
      LColor := fEmptyColor
    else
      LColor := fNonEmptyColor;
  end else
    LColor := fNonEmptyColor;
  if LColor <> inherited Color then
    inherited Color := LColor;
  inherited;
end;

procedure TEdit.FSetCheckEmpty(AValue: Boolean);
begin
  if AValue <> fCheckEmpty then
  begin
    fCheckEmpty := AValue;
    Change;
  end;
end;

procedure TEdit.FSetColor(AType: Integer; AColor: TColor);
  procedure LSetVal(var ACurrVal: TColor);
  begin
    if (ACurrVal <> AColor) then
    begin
      ACurrVal := AColor;
      if fCheckEmpty then
        Change;
    end;
  end;
begin
  case AType of
    0: LSetVal(fEmptyColor);
    1: LSetVal(fNonEmptyColor);
  end;
end;
Zu beachten ist das mit einem Cast auf TCustomEdit oder StdCtrls.TEdit die Farbe trotzdem gesetzt werden kann.

Sharky 15. Jan 2006 16:08

Re: Eigene Komponete von TEdit ableiten?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von SirThornberry
... was ja im ersten Form den Wert von ColorEmpty hatte. ...

Hai Sir,

es passiert innerhalb einer Form. Aber das dürfte egal sein.
Der Punkt ist ja das im ersten Edit Color den Standardwert hat (siehe Edit1.jpg) und nur nach dem kopieren der Kompo und einfügen Color im zweiten Edit den Wert von ColorEmpty bekommt (edit2.jpg).

[Edit]Werde es gleich mal mit deinem Code versuche[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:24 Uhr.
Seite 1 von 2  1 2      

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