Ir al contenido


Foto

Crear clase u objeto y acceder a el


  • Por favor identifícate para responder
23 respuestas en este tema

#1 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 02 abril 2013 - 01:56

Hola de nuevo, les pregunto ¿Como puedo crear una clase en delphi y acceder a ella?, bueno les explico me han encargado crear una clase que contenga un metodo de conexion a una bd  para sacar los datos de usuarios y la insercion de datos tambien, he creado una nueva unidad y he creado los procedimientos pero no puedo acceder a ellos he puesto el nombre de mi unidad en los uses, tambien me han dicho que en la clase tengo que crear el objeto Usuarios para acceder a su informacion
Bueno desconozco todo esto en delphi les pongo mis codigos
EL NOMBRE DE MI UNIDAD ES REGISTROCLASS


delphi
  1. unit registroclass;
  2.  
  3.  
  4. interface
  5.  
  6. uses
  7.   DM;
  8.  
  9.  
  10.  
  11. implementation
  12.  
  13. end.
  14. uses DB;
  15.  
  16.  
  17.  
  18. procedure UsuariosInfo (clave: Integer; sub: Integer);
  19. begin
  20. FDM.ZQUser.SQL.Text := 'Select * from productos where cuenta =:cu and subcuenta ' +
  21.   '=:sub';
  22. FDM.ZQUser.ParamByName('cu').AsInteger :=clave;
  23. FDM.ZQUser.ParamByName('sub').AsInteger :=sub;
  24.  
  25.  
  26. end;
  27.  
  28. procedure insertCobro (cuenta: Integer; sriego: Smallint; scder:Double; ssder:Double; cuotacd:Currency; cuotasd:Currency; nom:String;ap:String);
  29.  
  30.  
  31. begin
  32.  
  33. FDM.ZQUser.SQL.Text := 'START TRANSACTION;Insert into pagosagua (idCuenta,nRiegos,supConDer,subSinDer,cuotaConDer,cuotaSinDer,nombre,apellido)'+
  34. 'values(:cuen,:nriego,:scder,:ssder,:cuotacd,:cuotasd,:nom,:ap,:idu,:idc)' +
  35.   '=:sub';
  36. FDM.ZQUser.SQL.Add('COMMIT');
  37. FDM.ZQUser.ParamByName('cuen').AsInteger :=cuenta;
  38. FDM.ZQUser.ParamByName('nrigeo').AsInteger :=sriego;
  39. FDM.ZQUser.ParamByName('scder').AsFloat :=scder;
  40. FDM.ZQUser.ParamByName('ssder').AsFloat :=ssder;
  41. FDM.ZQUser.ParamByName('cuotacd').AsCurrency :=cuotacd;
  42. FDM.ZQUser.ParamByName('cuotasd').AsCurrency :=cuotasd;
  43. FDM.ZQUser.ParamByName('nom').AsString :=nom;
  44. FDM.ZQUser.ParamByName('ap').AsString :=ap;
  45.  
  46.  
  47.  
  48.  
  49.       try
  50.         FDM.ZQUser.ExecSQL;
  51.  
  52.  
  53.       except
  54.  
  55.         FDM.ZQUser.SQL.Text := 'ROLLBACK';
  56.         FDM.ZQUser.ExecSQL;
  57.  
  58.  
  59.       end;
  60.  
  61.  
  62.  
  63.  
  64. end;
  65.  
  66.  
  67.  
  68. end.



Aqui mi form para acceder los procedures



delphi
  1. procedure TFormMain.btn_cobroClick(Sender: TObject);
  2. begin
  3.   if edit_superficie.Text = '' then begin
  4.  
  5.   ShowMessage('Ingrese la superfice de riego');
  6.   edit_superficie.SetFocus;
  7.   end else begin
  8.       cu :=grid_Usuarios.Fields[0].AsInteger;
  9.       subc := grid_Usuarios.Fields[1].AsInteger ;
  10.   UsuariosInfo(cu,subc);
  11.  
  12.  
  13.  
  14.   end;
  15.  
  16. end;
  17.  
  18. end.



Pero me marca error no se como implementarlo OJO ya esta en Uses el REGISTROCLASS
  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 02 abril 2013 - 02:18

¿Puedes indicar el error que te marca?.

Saludos.
  • 0

#3 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 02 abril 2013 - 02:21

Undeclared identifier UsuariosInfo
  • 0

#4 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 02 abril 2013 - 02:29

Prueba de esta manera:



delphi
  1. unit registroclass;
  2.  
  3. interface
  4.  
  5. uses
  6.   DM, DB;
  7.  
  8. procedure UsuariosInfo (clave: Integer; sub: Integer);
  9. procedure insertCobro (cuenta: Integer; sriego: Smallint; scder:Double; ssder:Double; cuotacd:Currency; cuotasd:Currency; nom:String;ap:String);
  10.  
  11. implementation
  12.  
  13. procedure UsuariosInfo (clave: Integer; sub: Integer);
  14. begin
  15. FDM.ZQUser.SQL.Text := 'Select * from productos where cuenta =:cu and subcuenta ' +
  16.   '=:sub';
  17. FDM.ZQUser.ParamByName('cu').AsInteger :=clave;
  18. FDM.ZQUser.ParamByName('sub').AsInteger :=sub;
  19.  
  20.  
  21. end;
  22.  
  23. procedure insertCobro (cuenta: Integer; sriego: Smallint; scder:Double; ssder:Double; cuotacd:Currency; cuotasd:Currency; nom:String;ap:String);
  24.  
  25.  
  26. begin
  27.  
  28. FDM.ZQUser.SQL.Text := 'START TRANSACTION;Insert into pagosagua (idCuenta,nRiegos,supConDer,subSinDer,cuotaConDer,cuotaSinDer,nombre,apellido)'+
  29. 'values(:cuen,:nriego,:scder,:ssder,:cuotacd,:cuotasd,:nom,:ap,:idu,:idc)' +
  30.   '=:sub';
  31. FDM.ZQUser.SQL.Add('COMMIT');
  32. FDM.ZQUser.ParamByName('cuen').AsInteger :=cuenta;
  33. FDM.ZQUser.ParamByName('nrigeo').AsInteger :=sriego;
  34. FDM.ZQUser.ParamByName('scder').AsFloat :=scder;
  35. FDM.ZQUser.ParamByName('ssder').AsFloat :=ssder;
  36. FDM.ZQUser.ParamByName('cuotacd').AsCurrency :=cuotacd;
  37. FDM.ZQUser.ParamByName('cuotasd').AsCurrency :=cuotasd;
  38. FDM.ZQUser.ParamByName('nom').AsString :=nom;
  39. FDM.ZQUser.ParamByName('ap').AsString :=ap;
  40.  
  41.  
  42.  
  43.  
  44.       try
  45.         FDM.ZQUser.ExecSQL;
  46.  
  47.  
  48.       except
  49.  
  50.         FDM.ZQUser.SQL.Text := 'ROLLBACK';
  51.         FDM.ZQUser.ExecSQL;
  52.  
  53.  
  54.       end;
  55.  
  56.  
  57.  
  58.  
  59. end;
  60.  
  61.  
  62.  
  63. end.


  • 0

#5 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 02 abril 2013 - 03:06

Perfecto gracias funciono muchas gracias disculpa los molesto con otra preogunta ¿Como podria crear el objeto Ususarios?
para poder acceder a su informacion
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 02 abril 2013 - 07:21

Hola edorantes,
Así como tienes la unidad no hay definida ninguna clase por tanto no puedes crear un objeto o instancia de la misma.
La unidad está bajo el pensamiento estructurado... básicamente cuenta con dos procedimientos.

Para llevarlo al pensamiento OO habrá que hacerle unos cuantos cambios. No voy a explicar todo la teoría OO y como llevarla en Delphi, para ello he elaborado una serie de manuales que tratan en forma de "capítulos" los conceptos.

Recomiendo su lectura. Tienes además ha disposición en la Zona de Descargas un muy buen libro que trata desde la A a la Z sobre POO en Delphi: La Cara Oculta de Delphi 4. El capítulo 6 es todo sobre el tema.

Básicamente una clase se define así:



delphi
  1. type
  2.   TMiClase = class
  3.   private
  4.     // aquí los atributos y metodos privados
  5.   protected
  6.     // aquí lo protegido
  7.   public
  8.     // aquí lo público
  9.   published
  10.     // y aquí los publicados. Sólo tiene sentido si la clase es un componente
  11.   end;



Por ejemplo:



delphi
  1. type
  2. TPerro = class
  3.   private
  4.     FNombre: string; // atributo Nombre
  5.   public
  6.     procedure SetNombre(Value: string); // método setter para el atributo nombre
  7.     function GetNombre: string; // método getter para el mismo atributo
  8. end;



Luego en la sección implementation se da forma al código de cada método... como el procedimiento y función de toda la vida. La diferencia es que ahora tiene la forma:



delphi
  1. implementation
  2.  
  3. procedure TNombreClase.NombreMetodo(...);
  4. function TNombreClase.NombreMetodo(...): TipoDato;



Para el ejemplo se veería algo como esto:



delphi
  1. procedure TPerro.SetNombre(Value: string);
  2. begin
  3.   FNombre := Value;
  4. end;
  5.  
  6. function TPerro.GetNombre: string;
  7. begin
  8.   result := FNombre;
  9. end;



Para crear una clase basta con invocar al constructor:



delphi
  1. var MiObjeto: TPerro;
  2. begin
  3.   MiObjeto := TPerro.Create; // creamos...
  4.   MiObjeto.SetNombre('Fido'); // usamos...
  5.   MiObjeto.Free; // y liberamos...
  6. end;



Con esta breve orientación y el material que te he recomendado debieras estar en condiciones de seguir adelante. Si tienes más dudas avisa.

Saludos,
  • 0

#7 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 03 abril 2013 - 04:13

Muy bien compañero gracias cualquier duda la posteo
Gracias Dios te bendice
  • 0

#8 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 05 abril 2013 - 12:19

Bueno amigos he estado buscando como crear el objeto que va a guardar los datos de usuarios y despues mostrarlos en una tabla pero me he quedado trabado miren esto es lo que he hecho


delphi
  1. unit uUsuarios;
  2.  
  3. interface
  4.  
  5. uses classes, Types, SysUtils;
  6.  
  7. type
  8.  
  9. //Aqui defino mis propios tipos de variables
  10. TIntArray = array[0..200] of shortint;
  11. TSingleArray = array[0..200] of currency;
  12.  
  13.  
  14.   Tusuarios = class(TObject)
  15.   private
  16.   id  :  TIntArray;
  17.   supCder, supSder :  TSingleArray;
  18.   nombre, cultivo    :  Tstrings;
  19.   ap : shortint;  {Apuntador, lleva el numero de recibos en el cobro actual}
  20.   public
  21.  
  22.     procedure inicializa();
  23.  
  24.     procedure add() ;
  25.    
  26.  
  27.   end;
  28.  
  29. implementation
  30.  
  31. constructor Tusuarios.create;
  32. begin
  33.   nombre := Tstringlist.create;
  34.   cultivo := Tstringlist.creat;
  35. end;
  36.  
  37. procedure Tusuarios.inicializa;
  38. begin
  39.   ap := 0; //inicializamos ap que es el apuntador
  40. end;
  41.  
  42. end.



bueno he buscado y he tratado de hacerlo pero no se como hacer el proceso para meter los datos.
Agradezcu sus respuestas Dios los bendice
  • 0

#9 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 05 abril 2013 - 12:40

Una pregunta amigo mio, deas que la información se grabe en una base de datos o solo permanezca en las clases
  • 0

#10 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 05 abril 2013 - 12:53

que solo permanezca en las clases  para despues mostrarlos en una tabla pero que simpre permanezcan en la clase
  • 0

#11 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 abril 2013 - 01:36

Hola edorantes,

Las clases por si mismas no cuentan con herramientas para almacenar y poder recuperar los datos. Ten en cuenta que los datos en sus atributos sólo estarán disponibles mientras exista un objeto o instancia de la misma en memoria. En el momento en que liberes dicho objeto pierdes toda información.

Si lo buscas es que estas clases lean y almacenen datos de una tabla de base de datos pues ya las cosas se complican un poco. Y hay varias alternativas de como encararlo.

La manera más fácil y directa de hacerlo es que dicha clase cuente con unos hipotéticos métodos que podríamos llamar como LeerDeBaseDatos, GuardarEnBaseDatos. Éstos se comunicarían con los componentes adecuados y ejecutarían la instrucción adecuada. Ante una lectura el proceso se resume en algo como:



delphi
  1. procedure TMiClase.LeerDeBaseDatos;
  2. begin
  3.   // conectarse a la base de datos
  4.   // abrir el xxxTable o bien ejecutar una consulta SELECT
  5.   // Pasamos los datos al objeto:
  6.   FAtributo := MiDataSet.FieldByName('NombreCampo').AsInteger; // o el AsTipo adecuado
  7. end;



Para guardar se procede de forma inversa:


delphi
  1. MiDataSet.FieldByName('NombreAtributo').AsTipo := FAtributo;



Y ejecutar una instrucción INSERT si el data set es un xxxQuery o si se trata de un xxxTable se debe de ejecutar previamente un .Append o .Insert para ponerlo en modo de "inserción" y finalmente se confirma la acción con el .Post.

Quisiera que por favot nos indiques en que te trabaste. No me queda bien en claro a lo que comentas sobre como pasarle datos. Como he dicho antes, para usar la clase debes crear una instancia de la misma. Para pasarle datos hay variadas formas:

1) Por y hacia los atributos de forma directa:



delphi
  1. TMiClase = class
  2. public
  3.   FAtributo1: integer;
  4. end;
  5.  
  6. ...
  7. var
  8. MiObjeto: TMiClase;
  9. ...
  10. begin
  11.   MiObjeto := TMiClase.Create;
  12.   MiOjeto.Atributo1 := 5;
  13. end;



Para leer basta con hacer:



delphi
  1. variable := MiObjeto.Atributo1;



2) Mediante métodos setter y getter:

Basta con aplicar el ejemplo que he dado en mi post anterior:



delphi
  1. MiObjeto.SetAtributo(5); // pasarle datos
  2. variable := MiObjeto.GetAtributo; // leer



3) Combinando ambas, usando propiedades:



delphi
  1. TMiClase = class
  2. private
  3.   FAtributo: integer;
  4.   procedure SetAtributo(Value: integer);
  5.   function GetAtributo: integer;
  6. public
  7.   property Atributo: integer read GetAtributo write SetAtributo;
  8. end;



Luego basta con:



delphi
  1. MiObjeto.Atributo := 5; // pasarle datos
  2. variable := MiObjeto.Atributo; // leer



Las propiedades se parecen a los atributos, lo que las diferencia de estos es que leer y guardar con las propiedades implica un paso de seguridad intermedio gracias a esos métodos privados. En la implementación de estos métodos uno puede hacer las verificaciones y controles que requiera para garantizar de que un setter sobre el atributo no almacene un valor incorrecto (como por ejemplo: edad negativa) y un getter sobre el mismo atributo lea de forma segura el dato correcto.

Existe también casos en los que una clase no requiera disponer de un atributo para almacenar un dato, sino más bien que la información para realizar determinada acción venga por parámetro:



delphi
  1. TMiClase = class
  2. public
  3.   HacerAlgo(ConEsto: integer);
  4. end;



En el ejemplo TMiClase cuenta con un método llamado HacerAlgo que recibe un parámetro. En este caso como no se tiene interés de que la clase cuente con el atributo FConEsto, necesita que el dato sea pasado por esta vía.

Se más concreto en tus dudas. No logro vislumbrar hasta donde llegan tus conocimientos y dudas sobre POO. Repito: no puedo estar exponiendo toda una clase (que en una universidad demora un semestre)... hay mucho material al respecto, y tengo la impresión de que en parte tus problemas ya no son exclusivamente sobre como es que se lleva la OO en Delphi sino también sobre el propio paradigma. Date tiempo para ir asimilando lo que vas leyendo y los ejemplos de código que hay en los manuales que he dejado son funcionales y no hay error.

Saludos,
  • 0

#12 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 05 abril 2013 - 01:47

Muchas gracias amigo lo probare pero mira te explico tengo 4 cajas de texto una 1: es el nombre 2.es el monto a pagar 3. es el estado y 4. es adeudo anterior  entonces todo eso lo tengo que guardar en un objeto para despues recuperarlos y mostrarlos en una tabla asi
nombre | monto | estado | adeudo
  Luis        45        Puebla      4
  Miguel    35        Puebla    344

Lo que me pareceria que en el objeto lo guarde en un arreglo con un apuntado por si quiero eliminar alguno
espero me puedas ayudar hacerlo
  • 0

#13 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 abril 2013 - 02:36

¿Entonces tu duda es en como guardar los datos en tus atributos array?

Si es así necesariamente deberás disponer de métodos con parámetros que reciban el índice sobre cual acceder. Algo como:



delphi
  1. type
  2. TipoArreglo = array[1..100] of string;
  3.  
  4. TMiClase = class
  5. private
  6.   FArreglo: TipoArreglo;
  7. public
  8.   procedure GuardarEnArreglo(Indice: integer; Dato: string);
  9.   function LeerDeArreglo(Indice: integer): string;
  10. end;



La implementación creería que ya es medio obvia. En GuardarEnArreglo se hace un:



delphi
  1. FArreglo[Indice] := Dato;



Para almacenar el dato en cuestión. Y para leer basta con un:



delphi
  1. result := FArreglo[Indice];



El problema de esta alternativa es que deberás implementar tantos parámetros como atributos tengas.  En mi ejemplo como solo es uno, solamente necesito dos: uno para el índice y el otro para el único atributo.

Una manera de darle un giro a esto es definir directamente un esquema basado en registros:



delphi
  1. type
  2.   TInformacion = record
  3.     Dato1: integer;
  4.     Dato2, Dato3: string;
  5.   end;
  6.  
  7. TArregloInfo = array[1..100] of TInformacion;



Y ahora el método adquiere esta forma:



delphi
  1. procedure GuardarEnArreglo(Indice: integer; Info: TInformacion);



Antes de llamar a GuardarEnArreglo deberás disponer de una variable del tipo TInformacion y usar a ésta para registrar los datos:



delphi
  1. var inf: TInformacion;
  2. ...
  3. inf.Dato1 := 5;
  4. inf.Dato2 := 'Hola';
  5. ...



Puede proponerse otra manera de encarar el tema. En lugar de pasar el índice como otro parámetro se puede hacer que se lleve de forma interna (y creo que tu "apuntador" lo tienes pensado para esto mismo). Entonces tu clase debe definir los mecanismos para que se asigne el valor a este atributo y de este modo ahora los métodos que se encarguen de guardar simplemente deban leer del hipotético FIndice:



delphi
  1. TMiClase = class
  2. private
  3.   FIndice: integer; // ahora el indice se mantiene de forma interna
  4. public
  5.   procedure PosicionarseEn(Indice: integer);
  6.   function Indice: integer;
  7.   procedure Guardar(Info: TInformacion);
  8.   procedure Leer: TInformacion;
  9. end;



PosicionarseEn() se encarga de almacenar en FIndice el valor actual. Luego tanto Guardar() como Leer() simplemente se valen de FIndice para guardar y leer desde el arreglo. La función Indice la expuse como una vía de lectura del valor actual de índice por si necesita recuperarse alguna vez.

Lo que si ten presente que al definir un arreglo de esa forma el arreglo ya no es dinámico sino que se reserva exactamente esos 100 o 200 lugares. Los dinámicos por su parte pueden ser dimensionados.

Saludos,
  • 0

#14 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 05 abril 2013 - 02:38

Bueno mas o menos tengo la idea  asi pero aun no se como hacer el proceso de agregar y el de eliinar chequen mi idea



delphi
  1. type
  2.  
  3. //Aqui defino mis propios tipos de variables
  4. TIntArray = array[0..200] of shortint;
  5. TSingleArray = array[0..200] of currency;
  6.  
  7. OUsuarios = class(TObject)
  8. private
  9.   monto,adeudo  :  TIntArray;
  10.  
  11.   nombre, estado    :  Tstrings;
  12.   ap : shortint;  {Apuntador para buscar en el array y eliminar}
  13. public
  14.  
  15.   end;
  16. implementation
  17. procedure add(nombre: String ;estado : String; monto : integer; adedudo : integer);begin
  18. // En esta parte no se como hacerle que los datos ingresados se vayan agregando a los arreglos de arriba con su respectivo
  19. //apuntador es decir que se guarden como si fuera tabla asi : apuntador,nombre,estado,monto,adeudo
  20. //                                                                                                      1          lalo        pue    234        43
  21. end;
  22.  
  23.   procedure delete(apuntador :Integer); begin
  24.         // aqui mediante el apuntador tengo eliminar los datos ingresados del arreglo
  25.  
  26.       // es decir que si ingresa el numero 1 elimine todo lo que contiene el 1 nombre,estado,monto y adeudo
  27.  
  28.   end;



Espero me haya dado a entender saludos amigos
Espero sus respuestas
  • 0

#15 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 06 abril 2013 - 01:06

Bueno amigos esto es lo que he hecho pero cuando quiero llamarlo desde mi form no me aparece ¿Por que?
es decir quiero llamar al add asi

delphi
  1. Tusuarios.add

pero no me aparece solo el de create este es mi codigo


delphi
  1. unit uUsuarios;
  2.  
  3. interface
  4.  
  5. uses classes, Types, SysUtils;
  6.  
  7. type
  8.  
  9. //Aqui defino mis propios tipos de variables
  10. TIntArray = array[0..200] of shortint;
  11. TSingleArray = array[0..200] of currency;
  12.  
  13.   Tusuarios = class(TObject)
  14.   Constructor Create;
  15.  
  16.   private
  17.   id,cuenta,subc  :  TIntArray;
  18.   supCder, supSder :  TSingleArray;
  19.   nombreU, cultivoU    :  TStrings;
  20.   ap : shortint;  {Apuntador, lleva el numero de recibos en el cobro actual}
  21.   public
  22.  
  23.     procedure inicializa();
  24.  
  25.     procedure add(cuenta : Integer; sub:Shortint ; nombre : String;
  26.   supConDer : Currency ; supSinDer:Currency; cultivo:String) ;
  27.  
  28.  
  29.  
  30.   end;
  31.  
  32. implementation
  33.  
  34. constructor Tusuarios.create;
  35. begin
  36.   nombre := Tstringlist.create;
  37.   cultivo := Tstringlist.create;
  38.  
  39.  
  40. end;
  41.  
  42. procedure Tusuarios.inicializa;
  43. begin
  44.   ap := 0; //inicializamos ap que es el apuntador
  45.  
  46. end;
  47.  
  48. procedure Tusuarios.add (cuenta : Integer; sub:Shortint ; nombre : String;
  49.   supConDer : Currency ; supSinDer:Currency; cultivo:String);
  50. begin
  51.     id[ap] := cuenta;
  52.     supCder[ap] := supConDer;
  53.     supSder[ap] := supSinDer;
  54.     nombreU.Add(nombre);
  55.     cultivoU.Add(cultivo);
  56.  
  57.  
  58.  
  59.  
  60. end;
  61.  
  62.  
  63. end.


Si algo va mal avisarme por favor, Bendiciones
  • 0

#16 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 06 abril 2013 - 01:31

Una vez que ya tienes hecha tu clase para usarla basta con que añadas en la sección uses de tu form (y/o cualquier otra unidad en donde la requieras) el nombre de la unidad. En tu caso será:



delphi
  1. uses uUsuarios;



Ya con esto puedes declarar tantas variables de la clase como quieras.

Como consejo: mantente en el estándar de nomeclatura que ofrece Delphi.
1) Las clases se nombran con el prefijo T, de Type.
2) Los atributos o campos con el prefijo F, de Field.

Hay otras "normas" pero por ahora no vale la pena seguirle demasiado con el resto.

Saludos,
  • 0

#17 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 06 abril 2013 - 03:05

Hola amigo bueno mi ya esta mi metodo de almacenamiento solo que no se como hacerle para mi metodo de mostrar la info podrias ayudarme a como se hace,este es mi codigo de almacenar


delphi
  1. procedure Tusuarios.add (id : Integer; nombre : String;supConDer : Currency ; supSinDer:Currency; cultivo:String);
  2. begin
  3.     idU[ap] := id;
  4.     nombreU.Add(nombre);
  5.     supCder[ap] := supConDer;
  6.     supSder[ap] := supSinDer;
  7.     cultivoU.Add(cultivo);
  8.  
  9. end;



espero pedas guiarme a como hacer un metodo para mostra y a implementarlo en una interfaz
Gracias por sus repuestas estan siendo de mucha ayuda amigos
  • 0

#18 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 abril 2013 - 01:09

Hola edorantes, para mostrar los datos se debe tener en cuenta en que componente.
Puedes diseñar tu clase con algún "getter" individual como en los ejemplos que te he dado y simplemente leer desde éste para tener el valor. Por ejemplo:



delphi
  1. edit1.Text := StrToInt(miClase.GetID);



Ahora bien si lo que buscas es implementar una vía directa de como mostrar una información tabulada, como en un TStringGrid por ejemplo, del listado completo se puede hacer.

Viendo tu código, basta con ir recorriendo el arreglo y presentar la información de forma ordenada. Supongamos que lo haces en un TStringGrid.

Simplemente hago los siguientes pasos:
1) Establezco las propiedades RowCount y ColCount del TStringGrid para darle el tamaño en Filas x Columnas adecuado. En tu caso las filas vendría a ser un registro de cada usuario. Como definiste un arreglo de 0..200 entonces tendrás exactamente 201 filas (202 si quieres que la fila o sea en realidad el "encabezado" y esté fila), y en cada va columna un campo: como tenemos Nombre, SupCder, SupSder, y Cultivo pondremos 4 (5, si quieres que la primera sea "encabezado" y quede fija).



delphi
  1. MiGrid.RowCount := 201;
  2. MiGrid.ColCount := 4;



2) Luego gracias a .Cells[Col, Row] puedo posiconarme en cualquier celda dentro del TStringGrid.
Así por ejemplo si hago:

MiGrid.Cells[3,4] := MiClase.GetSupSder(4);

Lo que hago es que en la fila 4, columna 3 (que corresponde al atributo SupSder) se muestre el dato de SupSder para el índice 4.

Es fácil ver entonces que basta con algo como:



delphi
  1. for i := 0 to 200 do // el rango del arreglo [0..200]
  2. begin
  3.   MiGrid.Cells[1, i] := MiClase.GetNombre(i); // Col 1 >> Nombre
  4.   MiGrid.Cells[2, i] := CurrToStr(MiClase.SupCder(i)); // Col 2 >> SupCder
  5.   MiGrid.Cells[3, i] := CurrToStr(MiClase.SupSder(i)); // Col 3 >> SupSder
  6.   MiGrid.Cells[4, i] := MiClase.GetCultivo(i); // Col 4 >> Cultivo
  7. end;



Este código puede estar dentro de un método llamado


delphi
  1. procedure TUsuarios.MostrarEnGrid(ElGrid: TStringGrid);



De modo que se puede pasar por parámetro el grid en cual mostrar y hacer más fácil las cosas.

Esto va a funcionar mientras exista algún método GetXXX(indice) y que tenga como parámetro el índice sobre cual consultar. De otro modo habrá que jugar con otras alternativas como las que te había comentado antes que era posicionarse con un .SetIndice() y luego operar con un GetXXX que lea sobre el índice pre establecido.

Es decir necesariamente debe de disponerse de un modo de decirle a la clase sobre que "registro" deseamos operar. De otro modo es imposible consultar cualquier dato.

Espero que se me entienda.

Saludos,
  • 0

#19 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 08 abril 2013 - 01:26

Por otro lado, para cuando estés más familiarizado con los conceptos, considero que utilices un enfoque más prolijo y no tengas la información tan dispersa.
Tu estás utilizando un arreglo para un cosa, otro para otra... un TStrings para otra más... para mantener la información enlistada.

Ese enfoque tarde o temprano lleva a confusiones. Es mejor diseñar una clase que ya tenga la información individual... llamemosle TUsuario (en contraposición a tu TUsuarios) y entonces luego disponer de un TObjectList para mantener una lista de objetos de esta clase, ya como un atributo de la clase que administra la lista.

En resumen la propuesta es:



delphi
  1. TUsuario = class
  2. private
  3.   FID: integer;
  4.   FNombre: String;
  5.   FSupCder: Currency;
  6.   FSupSder: Currency;
  7.   FCultivo: string;
  8. public
  9.   property ID: integer read FID write FID;
  10.   {las propiedades también pueden leer/escribir directamente hacia los atributos
  11.   sin pasar por los getter y setters}
  12.   property Nombre: string read FNombre write FNombre;
  13.   ...
  14. end;
  15.  
  16. TUsuarios = class
  17. private
  18.   FLista: TStringList;
  19.   ...
  20. public
  21.   function AddUsuario(User: TUsuario): integer;
  22.   procedure DeleteUsuario(User: TUsuario); overload;
  23.   procedure DeleteUsuario(Index: integer); overload;
  24.   procedure InsertUsuario(Usuario: TUsuario; Index: integer);
  25.   function FindUsuario(Nombre: string): integer; overload; // regresa el "index" dentro de lista
  26.   function FindUsuario(Nombre: string): TUsuario; overload;
  27.   procedure MostrarEnStringGrid(Grid: TStringGrid);
  28. end;



Lee sobre TObjectList. La ayuda sobre Delphi es muy aclaratoria  ;)

Fíjate como este esquema reduce enormemente las cosas y abre un nuevo abanico de como administrar los datos... además que no te ves atado a un arreglo de tamaño fijo (y convengamos que si fuera un arreglo dinámico sería más engorroso de llevar a la práctica algunos métodos... como el Delete).

Saludos,
  • 0

#20 edorantes

edorantes

    Advanced Member

  • Miembros
  • PipPipPip
  • 78 mensajes

Escrito 09 abril 2013 - 03:34

Muy bien amigo antes que nada quisiera darles las gracias a Todos los que me han estado ayudando por tomarse el tiempo de
contestarme bueno yo sigo de pregunton perdonen si es que he estado molestando pero necesito aprender a hacer esto Gracias Dios los bendice
bueno ahora las preguntas, miren en mi objeto hice un metodo de show pero imprimo desde ahi los datos de usuario cosa que no quiero pero vi si resultaba y efectivamente funciono pero necesito obtener desde mi form los datos por separado
Aqui mi codigo



delphi
  1. procedure Tusuarios.Show(Indice: Integer);
  2. begin
  3.   if (Indice < 0)or(Indice > ap-1) then
  4.     raise Exception.Create('Indice fuera de rango');
  5.     Writeln(Format('%d %s %f %f %s',
  6.   [idU[Indice],nombreU[Indice],supCder[Indice],supSder[Indice],CultivoU[
  7.   Indice]]));
  8.  
  9. end;


Bueno esto me imprime todos en consola desde la clase cosa que no quiero quiero acceder a la informacion por separado mas o menos mi idea es asi que ponga en mi form principal un boton con un mensaje de mostrar la informacion OJO Desde el form
No de la clase


delphi
  1. procedure TFormMain.btn_cobroClick(Sender: TObject);
  2. begin
  3.  
  4. //ASi es como quisiera que quedara pero aun no se como
  5. showmessage(Tusuarios.Show(0).getNombre);// Aqui si quisiera mostrar solo el nombre
  6. O tambien
  7. showmessage(IntToString(Tusuarios.Show(0).getCuenta)+Tusuarios.Show(0).getNombre);// Aqui si quisiera mostrar cuenta y Nombre
  8.  
  9. end;


  • 0




IP.Board spam blocked by CleanTalk.