AGB  ·  Datenschutz  ·  Impressum  







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

Neue Komponente erstellen - Zahlenedit

Ein Thema von davar · begonnen am 14. Jun 2006 · letzter Beitrag vom 19. Jun 2006
Antwort Antwort
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#1

Neue Komponente erstellen - Zahlenedit

  Alt 14. Jun 2006, 13:02
Hallo Leute,

wieder einmal stehe ich vor einem Problem, und zwar ist es diesmal die Erstellung neuer Komponenten.

Um in diesem Bereich ein wenig zu üben, wollte ich ein Editfeld erstellen, das nur Zahlen als Eingabe annimmt. Also habe ich mich an dieses Tutorial gehalten und mein Glück versucht.

Folgender Code steht nun in der .pas-Datei:

Delphi-Quellcode:
unit Zahlenedit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TZahlenedit = class(TEdit)
  private
    { Private-Deklarationen }
    procedure KeyPress(Sender: TObject; var Key: Char);
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [TZahlenedit]);
end;

procedure TZahlenedit.KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in [#8, #9, #44, #48 .. #57]) then key:=#0;
end;

end.
Im Register "Beispiele" ist die Komponente drin, aber annehmen tut sie nach wie vor alle Zeichen. Was mach ich denn nun falsch?

MfG

davar
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Neue Komponente erstellen - Zahlenedit

  Alt 14. Jun 2006, 14:19
Hallo davar,

in deinem Code versuchst du dem Edit-Control eine Ereignis-Behandlungsroutine als "normale" Methode einzupflanzen. Da das Control aber nichts über die Existenz dieser neuen Routine weiß, wird es sie nicht aufrufen. Du mußt die Methode KeyPress des Original-Edits überschreiben:

Delphi-Quellcode:
type
  TZahlenEdit = class (TEdit)
  protected
    procedure KeyPress (var Key: Char);
      override;
  end;

procedure TZahlenEdit.KeyPress (var Key: Char);
begin
  if (not (key in [#8, #9, #44, #48 .. #57])) then
    key := #0;
  inherited;
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat
davar

Registriert seit: 4. Feb 2005
311 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Neue Komponente erstellen - Zahlenedit

  Alt 15. Jun 2006, 05:30
Tatsächlich, jetzt gehts..

Danke!

Noch eine ganz kurze Frage, die Hilfe hat mich auch nicht schlauer gemacht: wofür steht das Wort "inherited"?
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Neue Komponente erstellen - Zahlenedit

  Alt 15. Jun 2006, 06:50
inherited; führt die Funktion aus die in der Komponente (Klasse) deklariert ist, von der deine Komponente abstammt. Du fügst also deinen Prüfcode nur hinzu (so wie du's bisher vermutlich in jedem Projekt gemacht hast)
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Neue Komponente erstellen - Zahlenedit

  Alt 16. Jun 2006, 04:30
Guten Morgen.

Zu "inherited" habe ich noch eine Verständnisfrage:

Ich glaube mich zu erinnern, dass ich gelesen habe, inhereted dient dazu, dass auf alle Fälle - zusätzlich zu dem selbst programmierten Code - der geerbte Code der Komponente ausgeführt wird. Deshalb dachte ich, inherited müsste vor dem eigenen Code aufgerufen werden.

Angenommen, ich wollte nun die neue Komponente ZahlenEdit verwenden und daraus eine eigene Komponente entwickeln, die z.B. nur die Zahlen 1 bis 6 als Eingabe akzeptiert. Würde dann der Aufruf von inhereted nach meinem eigenen Code nicht dazu führen, dass dann doch wieder alle Zahlen akzeptiert würden? Möglicherweise macht es bei der Komponente ZahlenEdit ja deshalb keinen Unterschied, weil TEdit.Keypress die Zeicheneingabe nicht beschränkt.

Muss inhereted nun vor oder nach dem eigenen Code stehen oder ist es eventuell sogar egal, wo es steht? Für "Aufklärung" wäre ich dankbar.

Ich wünsche Euch allen noch einen schönen Tag.

Gruß Jürgen
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

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

Re: Neue Komponente erstellen - Zahlenedit

  Alt 16. Jun 2006, 07:01
Hai gfjs,

pauschal kann man nicht sagen wo das inherited stehen muss/darf. In deinem Fall sollte es nach deinem Code stehen. Dann sind die "unerwünschten" Zeichen im OnKeyPress der Komponente schon raus gefiltert.

Hier mal ein Beispiel für die falsche Position in TMyClass2. In TMyClass1 ist es richtig.
Delphi-Quellcode:
  TMyClass1 = class(TObject)
  private
    fList : TObjectList;
  public
    constructor Create;
    destructor Destroy; override;
    function AddItem (aValue : TObject) : integer;
  end;

  TMyClass2 = class(TMyClass1)
  public
    constructor Create;
    destructor Destroy; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  MyClass2 : TMyClass2;
begin
  MyClass2 := TMyClass2.Create;
end;

{ TMyClass1 }

function TMyClass1.AddItem(aValue: TObject) : integer;
begin
  fList.Add(aValue)
end;

constructor TMyClass1.Create;
begin
  inherited;
  fList := TObjectList.Create; // Hier wird eine Instanz von fList erzeugt
end;

destructor TMyClass1.Destroy;
begin
  fList.Free; // Hier wird fList wieder freigegeben.
  inherited;
end;

{ TMyClass2 }

constructor TMyClass2.Create;
begin
  fList.Add(nil); // Hier kommt ein Fehler weil fList noch nicht erzeugt wurde.
  inherited;
end;

destructor TMyClass2.Destroy;
var
  ndx: Integer;
begin
  inherited;
  for ndx := fList.Count - 1 downto 0 do // und hier weil fList nicht mehr existier
  begin
    fList.Delete(ndx);
  end;
end;
In der TMyClass1 wird eine Object vom Typ TObjectList erzeugt. Wenn ich im Construction von TMyClass2 vor dem inherited, welches in diesem Fall ja den Constructon von TMyClass1 aufruft, versuche auf fList zuzugreifen kommt es zu einer Schutzverletzung da von fList ja noch keine Instanz erzeugt wurde. Analog dazu knallt es beim freigeben von TMyClass2 da ich nachdem aufruf des Destructors von TMyClass1 noch einmal versuche auf fList zuzugreifen. Diese ist zu diesem Zeitpunkt aber schon zerstört worden.

Ich hoffe das hilft Dir etwas?
Stephan B.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Neue Komponente erstellen - Zahlenedit

  Alt 16. Jun 2006, 11:21
Zitat von gfjs:
Muss inhereted nun vor oder nach dem eigenen Code stehen oder ist es eventuell sogar egal, wo es steht? Für "Aufklärung" wäre ich dankbar.
Wie Sharky schon gesagt hat : es kann ein Fehler sein, es an der falschen Stelle aufzurufen ! Vielleicht irritiert es auch, daß Delphi in einen leeren begin end Block manchmal automatisch "inherited" hinschreibt. Das geschieht darum, damit man das nicht vergißt. Weil der Block leer ist, steht es eben am "Anfang". Wo sonst ? Gehe ich mal von diesem Code aus :

Delphi-Quellcode:
procedure TZahlenEdit.KeyPress (var Key: Char);
begin
  if (not (key in [#8, #9, #44, #48 .. #57])) then
    key := #0;
  inherited;
end;
Hier ist es egal, wo das steht. So wie es da steht passiert folgendes : falsche Tasten werden auf #0 gesetzt, also quasi gesperrt. Dann werden die Methoden des Original-Edits noch durchlaufen. Bei Vertauschen der 2 Zeilen wäre es so : die Taste wird vom TEdit durchgelassen und erst danach von Deiner Komponente dann abgefangen. Ergo : egal fürs Programm. Gucke Dir mal Fremdkomponenten an. Da ist es durchaus normal, daß "inherited" irgendwo mittendrin steht. Und auch, daß das in abgeleiteten Komponenten ganz fehlt, das ist alles andere als ein Fehler. Du kannst ja auch das OnKeyPress ganz anders behandeln, als beim TEdit und willst sonst aber alles so lassen. Dann wäre das "inherit" sogar fehl am Platze.
Gruß
Hansa
  Mit Zitat antworten Zitat
gfjs

Registriert seit: 8. Dez 2005
Ort: Hohenkammer
298 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Neue Komponente erstellen - Zahlenedit

  Alt 19. Jun 2006, 04:10
Hi Sharky, hi Hansa.

Vielen Dank für Eure Beiträge - Ihr habt mir echt weitergeholfen.

Servus und noch einen schönen Tag.

Gruß Jürgen
Mein neues Motto (von "Unbekannt"):
Gewinnen: Wenn Du kannst - Verlieren: Wenn Du musst - Aufgeben: NIE!
  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 17:44 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