Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Crear clase. Basico de POO. (https://www.clubdelphi.com/foros/showthread.php?t=24216)

DarkByte 11-08-2005 21:09:03

Crear clase. Basico de POO.
 
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

Hola
 
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:

Código Delphi [-]
 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

Hola
 
Bueno pues ahora mismo parese que mi clase da un problema, en una prueba que hice:
Código Delphi [-]
 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

Hola
 
Nada era un problema con la palabra Recurso que se declaró mal por accidente, a continuación te pongo el código arreglado:

Código Delphi [-]
 
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...
Código Delphi [-]
 Ordenadores : Array[0..MAX_INT] of TOrdenadores
.... supongo que seria algo asi, pero no se dónde colocarlo... ¿Debajo de
Código Delphi [-]
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í:
Código Delphi [-]
  Property Rcursos : TString Read FRcursos Write SetRcursos;
Lo demás que da igual. ¿Por qué? porque así puedes usar algo como:
Código Delphi [-]
memo1.Lines.Assign(Miordenador.Recursos);

DarkByte mira este hilo sobre el 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

Hola
 
Cita:

Empezado por DarkByte
¡Hombre yusnerqui! ¿Que hay?...

Pues aquí me ves, pequeño hermano, como siempre, tratando de encontrarle las 4 patas al gato
Cita:

Empezado por DarkByte
¿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
Cita:

Empezado por DarkByte
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
Cita:

Empezado por DarkByte
¿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.
Cita:

Empezado por Lepe
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:
Código Delphi [-]

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:
Código Delphi [-]
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

Cita:

Empezado por DarkByte
Lo que no se es cómo declararla como un array... por ejemplo...
Código Delphi [-]
 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
Código Delphi [-]
 Ordenadores : Array of TOrdenadores;

Luego en tu código especificas la cantidad que queres
Código Delphi [-]
  SetLength(Ordenadores, cantidad);

si queres uno más
Código Delphi [-]
  SetLength(Ordenadores, Length(Ordenadores)+1);

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

Cita:

Empezado por DarkByte
pero no se dónde colocarlo... ¿Debajo de
Código Delphi [-]
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

Cita:

Empezado por DarkByte
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


La franja horaria es GMT +2. Ahora son las 05:53:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi