PDA

Ver la Versión Completa : Crear clase. Basico de POO.


DarkByte
11-08-2005, 21:09:03
Buenas, estoy haciendo un programa que me identifique todos los recursos compartidos de red. Consigo localizarlos y demás, pero para trabajar con ellos necesitro crear una clase, TOrdenador, por ejemplo....

Seria de la siguiente forma...
TOrdenador contendria:
Ip:string;
Hostname:string;
Recursos:TStringList;

No le veo mucha complicación, solo la mía porque no se POO... ni se donde colocar la clase, ni cómo acceder a ella.

Gracias por adelantado, a todos.

yusnerqui
11-08-2005, 21:55:01
Primero que nada enviarte un fuerte abrazo, que hacía tiempo no te leía y ya se te estraña.

Con respecto a tu pregunta te diré que aunque no soy un maestro en el asunto trataré de ayudarte:

Te puedes crear una nueva unidad para tu clase:


interface
uses Classes;
Type
TOrdenador = Class(TObject)
Private
FIp : String;
FHostname:string;
FRecursos:TStringList;
FRcursos: TStringList;
procedure SetHostname(const Value: String);
procedure SetIp(const Value: String);
procedure SetRcursos(const Value: TStringList);
Public
Property Ip : String Read FIp Write SetIp;
Property Hostname : String Read FHostname Write SetHostname;
Property Rcursos : TStringList Read FRcursos Write SetRcursos;
Constructor Create;
Destructor Destroy;override;
end;
implementation
{ TOrdenador }
constructor TOrdenador.Create;
begin
FRecursos := TStringList.Create;
end;
destructor TOrdenador.Destroy;
begin
FRecursos.Free;
inherited;
end;
procedure TOrdenador.SetHostname(const Value: String);
begin
if FHostname <> Value then
FHostname := Value;
end;
procedure TOrdenador.SetIp(const Value: String);
begin
if FIp <> Value then
FIp := Value;
end;
procedure TOrdenador.SetRcursos(const Value: TStringList);
begin
FRcursos.Assign(Value);
end;
end.



Bueno también puedes declarar métodos públicos para tu clase, pero no los comentas, pero básicamente es así, claro que puedo estar equivocado, pero de ser así ya alguien se encargará de rectificarme.

Saludos

yusnerqui
11-08-2005, 22:27:31
Bueno pues ahora mismo parese que mi clase da un problema, en una prueba que hice:

implementation
Uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Var
FPc : TOrdenador;
begin
try
FPc := TOrdenador.Create;
FPc.Rcursos.Add('1');//aqui se para pr error de acceso a la memoria
FPc.Rcursos.Add('2');
FPc.Rcursos.Add('3');
ShowMessage(FPc.Rcursos.Text);
finally
FPc.Free;
end;
end;


Estoy investigando que es lo que está pasando, desde que de con el problemo te alumbro, si alguien sabe el por que ya seremos dos los agradecidos.
Saludos.

yusnerqui
11-08-2005, 22:49:21
Nada era un problema con la palabra Recurso que se declaró mal por accidente, a continuación te pongo el código arreglado:



interface
uses Classes;
Type
TOrdenador = Class(TObject)
Private
FIp : String;
FHostname:string;
FRecursos:TStringList;
procedure SetHostname(const Value: String);
procedure SetIp(const Value: String);
procedure SetRecursos(const Value: TStringList);
Public
Property Ip : String Read FIp Write SetIp;
Property Hostname : String Read FHostname Write SetHostname;
Property Recursos : TStringList Read FRecursos Write SetRecursos;
Constructor Create;
Destructor Destroy;override;
end;
implementation
{ TOrdenador }
constructor TOrdenador.Create;
begin
FRecursos := TStringList.Create;
end;
destructor TOrdenador.Destroy;
begin
FRecursos.Free;
inherited;
end;
procedure TOrdenador.SetHostname(const Value: String);
begin
if FHostname <> Value then
FHostname := Value;
end;
procedure TOrdenador.SetIp(const Value: String);
begin
if FIp <> Value then
FIp := Value;
end;
procedure TOrdenador.SetRecursos(const Value: TStringList);
begin
FRecursos.Assign(Value)
end;
end.


Bueno espero te ayude, Buena suerte AMIGO

Saludos.

DarkByte
12-08-2005, 11:42:48
¡Hombre yusnerqui! ¿Que hay?... ¿Donde esta el burro?... :s (antes tenias en el avatar el burro de shrek, si no empiezo a desvariar... :P)...

Pues si, hacía tiempo que no entraba... ya que he estado liado con C y C++... y Delphi lo he tocado poco... además he estado diseñando la página de mi madre (que aún la sigo diseñando... aunque ahora solo haya subido un fake para mientras tanto...)... por lo que no he tenido mucho tiempo. :\

Que se le va a hacer... es lo que hay... :(... ¿que has estado haciendo tu mientras tantooo? que te tengo perdido :P

Vaya, esa clase funciona fenomenal y me viene como anillo al dedo... Lo que no se es cómo declararla como un array... por ejemplo...

Ordenadores : Array[0..MAX_INT] of TOrdenadores

.... supongo que seria algo asi, pero no se dónde colocarlo... ¿Debajo de

var
FormX:TFormX

quizás?... :s

Gracias una vez más, simplemente por leer mis pesados tochos :\

Lepe
12-08-2005, 12:40:08
Un pequeño detalle que puede ser curioso.

Al declarar Recursos, creo que sería conveniente hacerlo así:

Property Rcursos : TString Read FRcursos Write SetRcursos;

Lo demás que da igual. ¿Por qué? porque así puedes usar algo como:

memo1.Lines.Assign(Miordenador.Recursos);


DarkByte mira este hilo sobre el TObjectList (http://www.clubdelphi.com/foros/showthread.php?t=18114&highlight=tobjectlist) te olvidas de usar arrays directemente.

Por supuesto busca por TobjectList, se ha explicado varias veces su uso.

Un saludo

yusnerqui
12-08-2005, 14:14:34
¡Hombre yusnerqui! ¿Que hay?...
Pues aquí me ves, pequeño hermano, como siempre, tratando de encontrarle las 4 patas al gato

¿Donde esta el burro?...
Es que el burro no me hacía justicia:mad: , consideré que este se acercaba más a mi vida cotidiana como programador:D

Pues si, hacía tiempo que no entraba... ya que he estado liado con C y C++... y Delphi lo he tocado poco...
Pues hombre, tienes que administrar mejor tu tiempo, no debes renunciar a los viejos amores.:D

¿que has estado haciendo tu mientras tantooo? que te tengo perdido :P
Pues aquí, en el lugar de siempre, haciéndole la vida imposible a mi ordenador, y tratando de aprender cada día un poquito más.

Un pequeño detalle que puede ser curioso.
Pues muchas gracias por la aclaración, me parece muy oportuna, a mi favor solo tengo que decir que transcribí el nombre y tipo de datos que suministró el amigo DarkByte sin percatarme de esta particularidad.

Saludos

DarkByte
12-08-2005, 18:22:26
A ver... voy a practicarlo y a ver que tal... porque tantos conceptos nuevos... :s

Muchísimas gracias, informaré con el resultado de la "operación" :P

DarkByte
13-08-2005, 12:41:42
Uf.. lo siento por mi torpeza... pero entre que estoy MUY verde en esto de POO y que hay un montón de cosas nuevas del tirón.. no me aclaro. He entendido más o menos el funcionamiento del TObject list, y lo de crear la var Lista:TObjectList y demás... pero no consigo entender el código como para aplicarlo a mi proyecto.

Gracias por vuestra ayuda una vez más.

Lepe
13-08-2005, 16:20:02
Pseudocodigo, pero creo que se entiende el método:


Form1 = class(Tform)

private
Lista:TobjectList;


procedure Form1 Oncreate;
begin
if not Assigned(Lista) then
Lista := TobjectList.Create(true);
// el parametro true, hace que cuando liberemos la lista, tambien se liberen
// los Tordenadores que tiene dentro
end;

Procedure form1 OnClose;
begin
if assigned(Lista) then
freeandnil(Lista);
// destruimos la lista y todos los ordenadores que lleve dentro.
end;

Procedure Form1Button1Click();
var ord :TOrdenador
i:integer;
begin
for i:=0 to 5 do // creamos 6 ordenadores
begin
ord := Tordenador.Create;
ord.IP := '192.168.2.' + inttostr(i);

Lista.Add(ord);
end;
end;

Listo, ya tenemos 6 ordenadores creados dentro del TObjectList. Para acceder al segundo ordenador usaríamos:

var miIP :String;
begin
if Assigned(lista) and
(Lista.Count > 2) then
begin
miIP := Tordenador(Lista.items[1]).Ip;
memo1.lines.Assign(Tordenador(Lista[items[1]).Recursos);
end;
end;


¿Ves algo raro? es la forma de trabajar en delphi con todas las instancias de objetos.

Un saludo.

DarkByte
20-08-2005, 13:43:31
El código parece perfecto. Únicamente no encuentro la uses del TString :S

Gracias una vez más :)

Lepe
22-08-2005, 11:18:38
En el editor de código pon el cursor sobre la palabra TStrings y F1.

saludos

DarkByte
22-08-2005, 12:26:58
Ya lo hice... y me encontré el TStringList.. pero no el TString :\

De todos modos, volveré a buscar :P

Lepe
22-08-2005, 16:42:51
TStrings

:D :p

edito:Probado y sale del tiron la ayuda

Crandel
22-08-2005, 17:13:51
Lo que no se es cómo declararla como un array... por ejemplo...

Ordenadores : Array[0..MAX_INT] of TOrdenadores



no te recomendaria crear un vector de esta forma dado que estaras reservando una gran cantidad de memoria que nunca vas a ocupar.

La solución es crear vectores dinámicos. Lo definis asi, sin declarar la cantidad

Ordenadores : Array of TOrdenadores;


Luego en tu código especificas la cantidad que queres

SetLength(Ordenadores, cantidad);


si queres uno más

SetLength(Ordenadores, Length(Ordenadores)+1);


y los accedes igual que cualquier vector, pero recuerda que el primero es el indice cero.

pero no se dónde colocarlo... ¿Debajo de

var
FormX:TFormX



Puede ser ahi, o en cualquier otro lado, por ejemplo si tenes una unit con definiciones de constantes y variables globales podrias ponerlo ahi.

Lepe
22-08-2005, 17:37:36
Se desperdicia memoria RAM según el valor de Max_Int.

TOrdenadores deriva de TObject, por tanto, cada elemento del Array es un puntero (4 Bytes), 1000 elementos serían 4kb de memoria.

Eso sí, tiene más trabajo, inicializarlos a nil, comprobar que no es nil al acceder a ellos, y por último poner a nil cada elemento al liberarlo de memoria.

Básicamente es lo que hace un TList, por eso es conveniente usar el TobjectList, aprovechando el resto de propiedades y métodos que trae (Count, Sort, Pack, etc.).

Un saludo

DarkByte
24-08-2005, 15:49:16
Muchisimas gracias. Funciona a la perfeccion.

Creo que de momento desperdiciare un poco de memoria... hasta que ya tenga claro los conceptos :\

Crandel
24-08-2005, 17:37:21
Creo que de momento desperdiciare un poco de memoria... hasta que ya tenga claro los conceptos :\

Si 8 Gb de memoria RAM te parece un poco !!!!

son MAXINT*4 bytes = 8 Gb