Newsgroup: it.comp.lang.delphi
Titolo: Faccio pratica con la creazione dei componenti

ciao a tutti
Vi posto la unit di un componente derivato da TcomboBox .. Ho preso spunto
dal liro di cantú
dove lui crea un TFontComboBox,
mentre io vorrei creare un TFileComboBox
utilizzando una mia unit che contiene una funzione di ricerca dei file .
Il problema é che non riesco a mettere le 2 proprietá
Path,Mask (mi accetta solo una variabile).
unit FileComboBox;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TFileComboBox = class(TComboBox)
  private
    { Private declarations }
    FPath,Fmask:String;
    Procedure FindFiles(Path,Mask:String);
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
     Property Style default csDropDownList;
     Property ItemIndex default 0;
{ERRORE}
     Property Path:String read FPath write FindFiles ;
     Property Mask:String read Fmask write FindFiles ;
{ERRORE}
    { Published declarations }
  end;
procedure Register;
implementation
Uses MieFunz;
procedure Register;
begin
  RegisterComponents('Erik', [TFileComboBox]);
end;
Procedure TFileComboBox.FindFiles(Path,Mask:String);
begin
Fpath:=Path;
Fmask:=Mask;
Items.Assign(SearchFile(Path,Mask));
end;
end.
{[Error] FileComboBox.pas(22): Property setters cannot take var parameters
[Error] FileComboBox.pas(23): Property setters cannot take var parameters}
Come posso inserire tutte e 2 le proprietá?
grazie
erik

 Come posso inserire tutte e 2 le proprietá?
Non si puo' usare un solo setter per due proprieta' distinte. Se vuoi
usare un solo metodo per passare i due valori pubblica qualcosa tipo
procedure Search(aPath, aMask: string).
Cio' non ti impedisce di mantenere Path e Mask ciascuno (se lo desideri)
con un suo setter (per raffinare la ricerca, ad es, potrai cambiare solo
Mask).
Saluti
Paolo Arosio
-- 
"La dimostrazione dell'esistenza di specie intelligenti nell'universo
 e' che non ci vengono a trovare"

erik wrote:
  private
    Procedure SetPath(Value:String);
    Procedure SetMask(Value:String);
  public
    procedure Search ();
  published
    Property Path:String read FPath write SetPath;
    Property Mask:String read Fmask write SetMask;
  end;
Procedure TFileComboBox.SetPath(Value:String)
begin
 // eventuale errore check
 FPpath := Value;
end;
Procedure TFileComboBox.SetMask(Value:String);
begin
 // eventuale errore check
 FMask := Value;
end;
procedure TFileComboBox.Search ();
begin
 // eventuale errore check
  Items.Assign(SearchFile(FPath, FMask));
end;
-- 
I'am what I'am, I do what I can

le property non sono adatte a fare quel che ti serve.
La comodità che hanno è quella di poter includere del codice nel metodo 
che fa il set del valore, ma non per eseguire azioni esterne.
Un altro comodita è usare un reader e non un memmbro private:
property MayValue: integer read GetMayValue;
function GetMayValue: integer;
begin
   Result := FMyValue
end;
ma si può anche fare:
function GetMayValue: integer;
begin
   With TIniFile.Create(IniFileName) do
     try
     Result := ReadInteger('MySection', 'MyVar', 0=;
     finally
     free
end;
end;
In questo modo la tua app non sa da dove viene il valore; ergo: tu puoi 
decidere come leggerlo senza cambiare il codice esterno alla classe.
per il tuo probelma:
Property Path:String read FPath write SetPath
Property Mask:String read Fmask write SetMask
function Search: integer; overload;
function Search(const APath, AMask: string): integer; overload;
function Search: integer;
begin
   Result := InternalSearch;
end;
function Search(const APath, AMask: string): integer;
begin
   FPath := APath;
   FMask := AMask;
   Result := InternalSearch;
end;
function InternalSearch: integer;
begin
   // search for path&mask properties values
end;
A

Ok grazie a tutti con il meodo di Setec sono riuscito a fare ció che volevo
l'unica pecca é che devo richiamare all'onCreate della form
FileComboBox1.FindFiles;
ma posso provare a mettere una Proprietá Boolean
per attivare la ricerca.(tanto stó solo provando per imparare).
Un pó piú di difficoltá l'ho avuta cercando di capire
i due seguenti messaggi(probabilmente per l'inesperienza).
Un'ultima cosa come posso settare per default la Stringa Mask tipo '*.*'?
Per i Boolean ho visto si fá cosí :
 Property Attivo:Boolean read FSearch Write Search default true;
Grazie di nuovo
erik