Newsgroup: it.comp.lang.delphi
Titolo: Imparando l'OOP ...

Bene, prima o poi bisognerà impararlo, è sempre una cosa che si sa in un
più, quindi in certi campi può essere di grande vantaggio... Allora, sto
facendo esperimenti con le classi... Per adesso sto costruendo una classa
che gestisca le queue di download da Irc...
Bene strutturando la classe in questo modo mi sorge un dubbio. E' inutile
usare un Client(socket) nella classe, per poi gestire tutti gli eventi
collegati ad esso? E' sbagliato o converrebbe con il socket, agganciarsi
alla classe precedentemente create?
Inoltre adesso come adesso mostro lo stato del record Elemento in una
Listview, quindi con un ciclo for gestisco l'array, e ogni elemento viene
inserito in essa.
Però usando una classe, come posso fare per farmi ritornare tali valori,
essendo privati e quindi non accessibili dall'esterno? In alcuni libri e
tutorial su internet, ho letto che usare variabili pubbliche nella classe,
comporta molti richi...
unit Unit2;
interface
uses IdTcpClient;
type
TStatoDownload = (transfer, pausa, stop, errore, finito, queue);
TUser = record
nick,
realname,
ip : String;
end;
TInfo = record
trigger : String;
canale : String;
proprietario : TUser;
end;
TElemento = record
nome : String;
directory : String;
size : Integer;
stato : TStatoDownload;
posizione : String;
priorita : Integer;
Id : Integer;
end;
TSocket = record
Client : TIdTcpClient;
end;
const Max_Queue = 100;
type TFServe = class
private
FIndice : Integer;
FSize : Integer;
FInfo_Fserve : TInfo;
FElemento : array[0..Max_Queue] of TElemento;
FSocket : TSocket;
public
constructor Create();
function CheckConnect() : Boolean;
function GetPriority : Integer;
function Inserisci(elemento : TElemento) : Integer;
function LeggiSocket : String;
procedure SetInfo(info : TInfo);
procedure OnConnected(Sender: TObject);
function Connect(ip : String; porta : Integer) : Boolean;
procedure Write(txt : String);
end;
implementation

 comporta molti richi...
sostituire gli array con TList e gli tipi record con altre classi
Nella tua classe, nella create, crei una istanza di TList
constructor Create;
begin
  inherited Create;
  fList := TList.Create;
end;
nella destroy;
destructor destroy;
var
  i: integer
begin
  for i:= 0 to pred(Flist.count) do
  TTuaClasseElemento(FList.Items[i]).Free
flist.free;
inherited;
end;
.
Poi, dichiari nella public:
property Elemento[Index: integer]: TTuaClasseElemento read GetElemento;
function getElemento(Index: integer): tTuaClasseElemento;
begin
  Result := TTuaClasseElemento(FList.Items[index]))
end;
Quando inizi a usare le classi corri il rischio di dimentcarti degli array..
;P
Bye
A

Uhm, non mi č chiara come funziona la lista, ed usarla. Io non ho trovato
altro modo per definire TElemento, in quanto non mi serve costruire una
classe, ma penso che un record, sia piů che sufficiente.
Ecco invece usando piů classi, come faccio a richiamare le altre procedure
delle altri classi?
Es:
Avendo una classe TSocket con i metodi Connected, Disconnected, ecc..., come
faccio ad arrivarci avendo un'altra classa che incorpora TSocket? Inoltre vi
sono problemi nella creazione della classe di TSocket all'interno di quella
dove viene usata?
Ultimo dubbio
Per creare la mia classe(chiamando il metodo constructor), la
"dichiarazione" esatat quale sarebbe?
public
    constructor Create();
constructor TFServe.Create();
begin
FIndice := 0;
FSize := 0;
FSocket.Client := TIdTcpClient.Create(nil);
FSocket.Client.OnConnected := OnConnected;
end;
Mi sembra sbagliato il modo, specie quel nil, ma per adesso sembrerebbe
funzionare (almeno non da errori di compilazione)

Sě, per il record č vero, ma se devo assegnare qlc al record, posso farlo
cosě
miorecord.campo := valore;
Credo che se invece debba usare una classe debba fare
MiaClasse.AssegnaValore(campo, valore) giusto? Non č piů scomodo e forse ma
dico forse meno efficiente?
Beh, sul modo di tener aperta la strada hai ragione, anzi... Perň forse
perchč adesso non lavoro, ma secondo me converrebbe solitamente riscrivire
il programma, in quanto ogni giorno si imparano nuove cose e si riescono a
gestire meglio cose che prima non sembrava possibile...
Ripeto forse perchč adesso ho ancora un po' di tempo... Cmq continuare a
rattoppare un programma, aggiungendo cose, non mi sembra il max, poi č un
parere mio e di altri miei colleghi.
Beh, per quanto riguarda il socket come potrei fare ad implementarlo? Mi
converrebbe creare una sotto-classe all'interno di essa? Ma per arrivare poi
ai suoi metodi?
Inoltre come posso gestire gli eventi all'interno di una classe?
Es:- Appena finito il download di un file o altro, voglio che venga
scatenato l'evento OnDownloadFinish, e che gestisca la procedura
assegnata...
Per quanto riguarda la guida di Delphi, ho piů o meno capito il
funzionamento del "tag" OWNER, in quanto quando la creo teoricamente devo
dire che č il "proprietario", solitamente puň essere SELF, no? Ma NIL, non č
a puntatore nullo? Quindi che sarebbe poi il proprietario?
Grazie ancora delle info

 
Nessuno. Infatti i componenti (discendenti dalla classe TComponent) 
possono anche essere creati via codice (non solo piazzandoli su una 
form) anche nel caso in cui non esista una form per contenerli, in 
questo caso l'owner e' nil, nessuno.
-- 
Roal Zanazzi

 FOnQualcosaEnd(Self)
Grazie fin da ora.
Mario Piva
--------------------------------
Inviato via 
http://usenet.libero.it

Guarda il seguente codice. l'ho estrapolato dal file sorgente del componente
TLabel..
type
  TNotifyEvent = procedure(Sender: TObject) of object;
  TCustomLabel = class(TGraphicControl)
  private
....
    FOnMouseLeave: TNotifyEvent;
    FOnMouseEnter: TNotifyEvent;
....
  public
    ....
    property OnMouseEnter: TNotifyEvent read FOnMouseEnter write
FOnMouseEnter;
    property OnMouseLeave: TNotifyEvent read FOnMouseLeave write
FOnMouseLeave;
  end;
OnMouseEnter e OnMouseLeave sono degli eventi.... giusto?
Ma quando crei un componente tutti questi eventi valgono nil... Giusto?
In questo caso quando passa il mouse sopra la Label viene scatenato l'evento
OnMouseEnter. E se tu questo evento non lo hai definito? Vale nil! Ecco che
prima di chiamare l'"evento" devi verificare che questo sia stato
definito...
Nel gestore del messaggio CM_MOUSEENTER vedo
procedure TCustomLabel.CMMouseEnter(var Message: TMessage);
begin
  inherited;
  // Verifico se il "programmatore" ha definito l'evento OnMouseEnter e se
sě lo scateno.....
  if Assigned(FOnMouseEnter) then
    FOnMouseEnter(Self);
end;
--
Acqua
-------------------------------------------------------
Download new version of my PixExperts for Delphi 6/C++ Builder 6 at
http://www.salexander.supereva.it/Pix_Exp171D6.zip

Wow, un po alla volta si imparano tante cose.
Per adesso ho costruito una classe base TFQueue, poi vredo che all'interno
metterò anche quella di una classe Socket mia. Si vedrà... Vi farò sapere.
Grazie a tutti delle Info