Problema col Text in una classe derivata da Tedit

di il
2 risposte

Problema col Text in una classe derivata da Tedit

In questo componente ereditato da Tedit volevo che oltre a ricevere solo caratteri numerici virgola compresa, la proprieta' Text fosse inizialmente vuota, come impostato nel costruttore, invece tale proprieta' vale sempre il valore presente in Object Ispector anche all'avvio della form. Dove sbaglio?

unit EditNum;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls;

type
  TEditNum = class(TEdit)
  private
    { Private declarations }
  protected
    { Protected declarations }
    procedure KeyPress(var Key: Char); override;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Standard', [TEditNum]);
end;

constructor TEditNum.Create(AOwner: TComponent);
begin
  // 1. Chiama sempre il costruttore del genitore
inherited Create(AOwner);
Text:=''; 
end;

procedure TEditNum.KeyPress(var Key: Char);
begin
if not (Key in ['0'..'9', '.', ',' ,#8]) then  // #8 -> Backspace
   begin
   Key:=#0;
   exit;
   end;
if Key='.' then
   Key:=',';
if (Key=',') And (Pos(',',Self.Text)>0) then // ',' multiple
   Key:=#0;
inherited KeyPress(Key);
end;

end.

2 Risposte

  • Re: Problema col Text in una classe derivata da Tedit

    01/04/2026 - franco ha scritto:

    In questo componente ereditato da Tedit volevo che oltre a ricevere solo caratteri numerici virgola compresa, la proprieta' Text fosse inizialmente vuota, come impostato nel costruttore, invece tale proprieta' vale sempre il valore presente in Object Ispector anche all'avvio della form. Dove sbaglio?

    Nel costruttore stai impostando il valore iniziale di quella proprietà, ma poi vengono caricati anche i valori che sono salvati all'interno del DFM, e se tra loro è presente una riga per la proprietà Text (e generalmente è presente), quel valore viene impostato all'interno della proprietà Text.

    In realtà, sarebbe meglio ereditare da TCustomEdit, ovvero la classe da cui eredita TEdit: questa classe fondamentalmente fa/ha tutto ciò che trovi in una Edit comunissima, ma è solo nella classe discendente TEdit che vengono "pubblicate" (con l'apposita visibilità published) le proprietà che trovi nell'Object Inspector. Se erediti da TCustomEdit quindi, puoi scegliere tu quali proprietà pubblicare, e potresti quindi evitare di esporre la proprietà Text andando a modificarne comunque il valore nel codice del tuo componente, magari aggiungendo una proprietà che contenga invece il valore decimale numerico che vai a rappresentare in formato testo all'interno di Text, proprietà che rimarrebbe non visibile nell'Object Inspector e non "streammata" all'interno del file DFM.

  • Re: Problema col Text in una classe derivata da Tedit

    Come da te suggerito funziona, grazie

Devi accedere o registrarti per scrivere nel forum
2 risposte