AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eigene Komponete von TEdit ableiten?

Ein Thema von Sharky · begonnen am 14. Jan 2006 · letzter Beitrag vom 15. Jan 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#1

Eigene Komponete von TEdit ableiten?

  Alt 14. Jan 2006, 14:31
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

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
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Eigene Komponete von TEdit ableiten?

  Alt 14. Jan 2006, 14:45
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

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
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Eigene Komponete von TEdit ableiten?

  Alt 14. Jan 2006, 14:46
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Eigene Komponete von TEdit ableiten?

  Alt 14. Jan 2006, 14:48
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;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Eigene Komponete von TEdit ableiten?

  Alt 14. Jan 2006, 14:52
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Eigene Komponete von TEdit ableiten?

  Alt 15. Jan 2006, 08:58
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
Ich wusste einfach nicht welche Methode ich überschreiben muss. Gibt es denn eine Liste welche Methode wan aufgerufen wird?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Eigene Komponete von TEdit ableiten?

  Alt 15. Jan 2006, 09:10
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Eigene Komponete von TEdit ableiten?

  Alt 15. Jan 2006, 15:30
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Eigene Komponete von TEdit ableiten?

  Alt 15. Jan 2006, 15:59
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Eigene Komponete von TEdit ableiten?

  Alt 15. Jan 2006, 16:08
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]
Miniaturansicht angehängter Grafiken
edit1_189.jpg   edit2_964.jpg  
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:04 Uhr.
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