AGB  ·  Datenschutz  ·  Impressum  







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

Neue Komponente von bestehender ableiten

Ein Thema von Luckie · begonnen am 13. Jun 2004 · letzter Beitrag vom 13. Jun 2004
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Neue Komponente von bestehender ableiten

  Alt 13. Jun 2004, 16:20
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Duffy
Duffy

Registriert seit: 19. Mär 2003
Ort: Wuppertal
835 Beiträge
 
Delphi 3 Standard
 
#2

Re: Neue Komponente von bestehender ableiten

  Alt 13. Jun 2004, 16:23
Hallo Luckie,
veruchs mal indem Du override bei SetText wegläßt.

bye
Claus

[EDIT]die OH gibt Audkunft über die Klasse TCustomEdit[/EDIT]
Künftige Generationen wollen ihre Fehler selber machen.
Jedes Programm wird nie das können, was Du wirklich brauchst.
Das Gegenteil von gut ist gut gemeint
-----
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Neue Komponente von bestehender ableiten

  Alt 13. Jun 2004, 16:35
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Duffy
Duffy

Registriert seit: 19. Mär 2003
Ort: Wuppertal
835 Beiträge
 
Delphi 3 Standard
 
#4

Re: Neue Komponente von bestehender ableiten

  Alt 13. Jun 2004, 16:39
Hallo Luckie,
die Eigenschaft heißt IMO GetTextBuf und SetTextBuf.

bye
Claus
Künftige Generationen wollen ihre Fehler selber machen.
Jedes Programm wird nie das können, was Du wirklich brauchst.
Das Gegenteil von gut ist gut gemeint
-----
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Neue Komponente von bestehender ableiten

  Alt 13. Jun 2004, 16:43
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Neue Komponente von bestehender ableiten

  Alt 13. Jun 2004, 16:44
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).
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Neue Komponente von bestehender ableiten

  Alt 13. Jun 2004, 16:46
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?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Neue Komponente von bestehender ableiten

  Alt 13. Jun 2004, 16:48
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#9

Re: Neue Komponente von bestehender ableiten

  Alt 13. Jun 2004, 18:14
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.
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#10

Re: Neue Komponente von bestehender ableiten

  Alt 13. Jun 2004, 18:36
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:32 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