Delphi-PRAXiS

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/)
-   -   Delphi Neue Komponente von bestehender ableiten (https://www.delphipraxis.net/23989-neue-komponente-von-bestehender-ableiten.html)

Luckie 13. Jun 2004 15:20


Neue Komponente von bestehender ableiten
 
Wir hatten ja gerade das problem, dass da jemand ein IntegerEdit haben wollte. Nun wollte ich das mal probieren und ein TIntEdit von TEdit ableiten.

Mein Ansatz:
Delphi-Quellcode:
type
  TIntEdit = class(TCustomEdit)
    private
      FValue: Integer;
      procedure SetText(Value: Integer); override;
      function GetText: Integer;
    property
      Text: Integer read GetText write SetText;
  end;

procedure TIntEdit.SetText(Text: Integer);
begin
  FText := Value;
end;

function TIntEdit.GetText: Integer;
begin
  Result := Value;
end;
Nur sagt er mir da:
Zitat:

[Error] Unit1.pas(13): Method 'SetText' not found in base class
Woher weiß ich nun wie die Methoden in der basisklasse heißen, wenn ich die Sourcen nicht habe?

Und zweitens: kann mein Ansatz zum Erfolg führen?

Duffy 13. Jun 2004 15:23

Re: Neue Komponente von bestehender ableiten
 
Hallo Luckie,
veruchs mal indem Du override bei SetText wegläßt.

bye
Claus

[EDIT]die OH gibt Audkunft über die Klasse TCustomEdit[/EDIT]

Luckie 13. Jun 2004 15:35

Re: Neue Komponente von bestehender ableiten
 
Gerade das will ich ja überschreiben. Ich sehe gerade da ist wohl noch ein Denkfehler drin.

Aber in der OH stehen nur die öffentlichen Eigenschaften und Ereignisse. Ich will aber eine anscheinend protected Methode überschreiben.

Duffy 13. Jun 2004 15:39

Re: Neue Komponente von bestehender ableiten
 
Hallo Luckie,
die Eigenschaft heißt IMO GetTextBuf und SetTextBuf.

bye
Claus

Muetze1 13. Jun 2004 15:43

Re: Neue Komponente von bestehender ableiten
 
Moin!

Wieso willst du sie überhaupt überschreiben ? Weil durch die neue Definition der Property mit deinen eigenen SetText/GetText (auch wenn sie nun gleich heissen mögen) überschreibst du doch schon die Property itself.

Und selbst wenn, die Property Methoden sind nicht als virtuelle oder dynamische Methoden gekennzeichnet, somit hast du da wenig Chancen, schon alleine, da die Property Methoden alle im private - Abschnitt definiert werden...

MfG
Muetze1

Bernhard Geyer 13. Jun 2004 15:44

Re: Neue Komponente von bestehender ableiten
 
Zitat:

Zitat von Luckie
Gerade das will ich ja überschreiben. Ich sehe gerade da ist wohl noch ein Denkfehler drin.

Willst Du eine Property überschreiben, so reicht es auch die Property neu zu definieren. Es ist nicht nötig bei den Get/Set-Methoden ein Overload anzugeben (welches ja auch i.d.R. nicht möglich ist, da die Get/Set-Methoden nicht als virtuelle/dynamische Methode deklariert sind).

Luckie 13. Jun 2004 15:46

Re: Neue Komponente von bestehender ableiten
 
Danke. Aber woher weiß man das, wenn man die Sourcen nicht hat?

Jetzt bin ich schon ein Schritt weiter, stehe aber vor dem nächsten Problem:
Delphi-Quellcode:
type
  TIntEdit = class(TCustomEdit)
    private
      FValue: Integer;
      procedure SetTextBuf(Value: Integer); override;
      function GetTextBuf: Integer; override;
    property
      Text: Integer read GetTextBuf write SetTextBuf;
  end;
Zitat:

[Error] Unit1.pas(13): Cannot override a static method
Die hilfe sagt dazu:
Zitat:

You have tried, in a derived class, to override a base method which was not declared as one of the virtual types.
Was kann man da machen?

SirThornberry 13. Jun 2004 15:48

Re: Neue Komponente von bestehender ableiten
 
also ich würde das ganze so lösen:
Delphi-Quellcode:
  TIntEdit = class(TEdit)
  private
    fAllowed: String;
    fNewOnChange: TNotifyEvent;
    fNewOnKeyPress: TKeyPressEvent;
    function fGetText: String;
    procedure fSetText(AValue: String);
    procedure fOnKeyPressproc(Sender: TObject; var Key: Char);
    procedure fOnChangeProc(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Text: String read fGetText write fSetText;
    property OnChange: TNotifyEvent read fNewOnChange write fNewOnChange;
    property OnKeyPress: TKeyPressEvent read fNewOnKeyPress write fNewOnKeyPress;
  end;

[...]

constructor TIntEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  fAllowed := '0123456789';
  inherited OnKeyPress := fOnKeyPressproc;
  inherited OnChange := fOnChangeProc;
end;

function TIntEdit.fGetText: String;
begin
  result := inherited Text;
end;

procedure TIntEdit.fSetText(AValue: String);
var LCount: Integer;
begin
  for LCount := 1 to length(AValue) do
  begin
    if pos(AValue[LCount], fAllowed) > 0 then Exit;
  end;
  inherited Text := AValue;
end;

procedure TIntEdit.fOnKeyPressproc(Sender: TObject; var Key: Char);
begin
  if pos(key, fAllowed) < 1 then
     key := #0
  else if Assigned(fNewOnKeyPress) then fNewOnKeyPress(Sender, Key);
end;

procedure TIntEdit.fOnChangeProc(Sender: TObject);
var LCount: Integer;
    Lnew: String;
begin
  LNew := '';
  for LCount := 1 to length(Text) do
  begin
    if pos(Text[LCount], fAllowed) > 0 then
       LNew := LNew + Text[LCount];
  end;
  if LNew <> Text then Text := LNew;
  if Assigned(fNewOnChange) then fNewOnChange(Sender);
end;
Wobei diese Variante kein "Strg + V" mehr zulässt

Pseudemys Nelsoni 13. Jun 2004 17:14

Re: Neue Komponente von bestehender ableiten
 
Zitat:

Zitat von Luckie
Danke. Aber woher weiß man das, wenn man die Sourcen nicht hat?

Jetzt bin ich schon ein Schritt weiter, stehe aber vor dem nächsten Problem:
Delphi-Quellcode:
type
  TIntEdit = class(TCustomEdit)
    private
      FValue: Integer;
      procedure SetTextBuf(Value: Integer); override;
      function GetTextBuf: Integer; override;
    property
      Text: Integer read GetTextBuf write SetTextBuf;
  end;
Zitat:

[Error] Unit1.pas(13): Cannot override a static method
Die hilfe sagt dazu:
Zitat:

You have tried, in a derived class, to override a base method which was not declared as one of the virtual types.
Was kann man da machen?


hallo luckie, override funktioniert nicht wenn bei dem vorgänger die funktion/prozedur kein virtual;/dynamic; hat.

ach... bernhard hatte schon geantwortet....leute ohne avatar übersieht man leicht.

Robert Marquardt 13. Jun 2004 17:36

Re: Neue Komponente von bestehender ableiten
 
Finger weg von der Text property. Die hier zu ueberschreiben ist unnoetig.
Besser bei OnChange ansetzen bzw Changing (wenn das die ueberschreibbare Methode zu OnChange ist).
Dort pruefst due den aktuellen Text und korrigierst ihn.
Nicht vergessen das das Aendern von Text ein OnChange ausloest das du ignorieren solltest.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:45 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