Newsgroup: it.comp.lang.delphi
Titolo: sorgente

Salve a tutti,
riguardo al post precedente.
(posto un semplice sorgente)
<CODE>
unit Jbutton;
interface
uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls;
type
  TJbutton = class(TButton)
  private
      FNumber : integer;
  protected
  public
     constructor Create(AOwner : TComponent); override;
     procedure SetNumber(num : integer);
     function GetNumber : integer;
  published
     property Number : integer read GetNumber write SetNumber;
  end;
procedure Register;
implementation
constructor TJbutton.Create(AOwner : TComponent);
begin
    inherited Create(AOwner);
end;
procedure TJbutton.SetNumber(num : integer);
begin
       FNumber := num;
 end;
function TJButton.GetNumber : integer;
begin
    Result := FNumber;
end;
procedure Register;
begin
  RegisterComponents('Samples', [TJbutton]);
end;
end.
</CODE>
(Vi prego correggetemi se sbaglio....:-))
Ho creato un semplicissimo componente a cui ho aggiunto una nuova proprietà.
Creo il componente.
Creo un piccolo programma per testare il componente.
Durante il design del programma di prova setto la proprietà FNumber a un
intero.
Se eseguo il programma di prova, FNumber dovrebbe ritornare il valore
settato durante il design.
Perchè se eseguo il programma, la proprietà FNumber è inesorabilmente 0??
Dove che (continuo) sbaglio???
Grazie della sempre puntuale attenzione.


    Via De Gasperi, 14 - 42019
    Scandiano (Reggio Emilia)


A me funziona tutto bene, controlla bene il codice che hai usato per leggere
la proprietą e visualizzarla a run-time, sicuramente l'errore č li.
Magari posta il codice della programma di prova.
Ciao
Giorgio

 Ciao!
Grazie della risposta.
Ho settato l'opzione da te menzionata nelle opzioni del progetto di prova,
ma il risultato č sempre quello....la proprietą ha valore nullo.


 ma il risultato è sempre quello....la proprietà ha valore nullo.
Non volevo dirti di settare l'opzione, ma solo di accertarti se fosse
stata selezionata oppure no.
Quell'impostazione indica se il codice dei componenti devono essere
compilati all'interno dell'eseguibile oppure se è necessario predisporlo
affinchè si colleghi dinamicamente, a runtime, ai package che contengono
l'implementazione di tali componenti.
Se l'opzione è selezionata, il programma verrà compilato per collegarsi
ai package...se hai aggiornato il componente, ma non hai ricompilato il
package che lo conteneva, otterrai che la tua applicazione si collega ad
un package che non è aggiornato e potrebbe contenere codice con il
difetto che hai denunciato. Tu hai già provveduto a correggere il
codice, ma esso non è ancora stato inserito a livello binario nel
package a cui si collega dinamicamente la tua applicazione.
Se invece non usi l'opzione "Build with runtime packages", il codice del
componente viene compilato direttamente nell'eseguibile, pertanto
l'effetto che vedi in fase di esecuzione è quello effettivo relativo
all'ultima versione del progetto e anche del componente.
Per sicurezza, prova a generare nuovamente il file eseguibile tramite il
comando [Project][Build].
Se non noti miglioramenti, scrivi il codice del progetto perchè
probabilmente è in quella porzione di codice che è contenuto l'errore.
Ciao!


 Giorgio
Ciao,
ecco un sorgente di prova (forse ho capito l'errore, in ogni caso ve lo
mostro per fugare ogni dubbio a riguardo)
unit MyButton;
interface
uses
  Windows, Messages, SysUtils, Classes, Controls, StdCtrls;
type
  mButton = class(TButton)
  private
    FNumber : integer;
    procedure SetNumber(num : integer);
    function GetNumber: integer;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner : TComponent); override;
  published
    { Published declarations }
    property Number : integer read GetNumber write SetNumber;
  end;
procedure Register;
implementation
constructor mButton.Create(AOwner : TComponent);
var
    temp : string;
begin
    inherited Create(AOwner);
    // Supponiamo che FNumber indichi la caption del mio componente.
    // Run - Time, Caption dovrebbe essere valorizzata con il valore
    // della proprietà settato Design time????
    temp := IntToStr(FNumber);
    MessageBox(0, PChar(temp), 'Constructor', 0);
    Caption := IntToStr(FNumber);
end;
procedure mButton.SetNumber(num : integer);
var
    temp : string;
begin
    FNumber := num;
    temp := IntToStr(FNumber);
    MessageBox(0, PChar(temp), 'SetNumber', 0);
end;
function mButton.GetNumber: integer;
begin
    Result := FNumber;
end;
procedure Register;
begin
  RegisterComponents('Samples', [mButton]);
end;
end.
Suppongo, visto che ho tracciato le chiamate run time con un MessageBox, che
la proprietà FNumber non sia settata all'interno del
costruttore.....ho notato che in seguito viene richiamata automaticamente
SetNumber e li in effetti appare il valore corretto della proprietà FNumber.
Ma se la proprietà FNumber mi servisse all'interno del costruttore?
Grazie.

 Ma se la proprietà FNumber mi servisse all'interno del costruttore?
Cosa intendi?


 Ma se la proprietà FNumber mi servisse all'interno del costruttore?
Dichiari un constructor con un parametro aNumber da assegnare a FNumber:
constructor Create(aOwner: TComponent; aNumber: integer);
Saluti
Paolo Arosio
P.S. Un subject un po' piu' adeguato alla questione posta non sarebbe
stato inopportuno.