Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-10-2007
Avatar de thelibmx
thelibmx thelibmx is offline
Miembro
 
Registrado: mar 2007
Posts: 515
Poder: 18
thelibmx Va por buen camino
encapsular codigo de delphi

hola amigos desde hace tiempo tengo esta duda, hay manera de que un codigo que se va ejecutar muchas veces en diferentes partes de un programa en delphi se pueda encapsular para su reutilizacion?, no se si me explique bien, suponiendo que tengamos una ventana con un panel, en el cual tenga 5 cajas de texto tedit; entonces podemos dar altas bajas y modificaciones, entonces cuando se trata de altas blanqueamos los tedit y pues de igual manera en modificacion, y bajas, entonces iria algo asi como

Código Delphi [-]
edith1.text:='';
edith2.text:='';
edith3.text:='';
edith4.text:='';
edith5.text:='';
suponiendo que hay un boton de alta, otro de baja y otro de modificacion, iria esas 5 lines en cada boton, y si lo encapsulo pues solo mando llamar ese proceso o ese conjunto de instrucciones en una sola linea y no repito el codigo 5 veces, este es un ejemplo muy sencillo pues son 5 lineas, pero que pasa cuando son mas de 50 lineas de codigo, hay alguna manera de encapsularlo y reutilizarlo sin tener que repetir todo el codigo espero haberme explicado bien, gracias
__________________
En movimiento...
Responder Con Cita
  #2  
Antiguo 17-10-2007
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: México D.F
Posts: 3.068
Poder: 23
poliburro Va por buen camino
es cuestión de aprovechar la OOP, por ejemplo, creas una clase que hereda a TForm, pero que implemta el método para limpiar todos los EditBox de un contenedor en particular.

Al heredar en tu código cada Form de tu Propia forma, podrás reutilizar el método de limpieza.

Eso es solo un ejemplo.
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #3  
Antiguo 17-10-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. En el caso concreto de los "TEdit" que dices... tal vez podrías preparar un procedimiento que se encargara de recorrer en un determinado contenedor (por ejemplo un formulario) todos sus controles, comprobar cuáles son "TEdit", y utilizar el método "Clear()" de estos últimos cuando sea así. Algo similar a esto:

Código Delphi [-]
procedure ClearEdits(container: TWinControl);
var
  i: integer;
begin
  for i := 0 to container.ControlCount-1 do
  begin
    if (container.Controls[i] is TEdit) then
      TEdit(container.Controls[i]).Clear();
  end;
end;

Pero se te pueden ocurrir otras ideas, como, por ejemplo:

Código Delphi [-]
procedure ClearEdits(container: TWinControl;
 edits: array of TCustomEdit);
var
  i: integer;
begin
  for i := Low(edits) to High(edits) do begin
    if (container.FindChildControl(edits[i].Name) <> nil) then
      edits[i].Clear();
  end;
end;

Con este último procedimiento no es preciso borrar "todos los edits", sino sólo los que quieras, de una forma similar a esta:

Código Delphi [-]
ClearEdits(self, [Edit1, Edit2, Edit3]);
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 17-10-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Otro más:

Usa un Frame, colocas los 5 edits, los botones de limpieza.... y listo. Cuando quieras usar añades el frame a la ventana / panel que deseas y ya lo tienes implementado.

Para crear el frame: File -> New -> (other) -> Frame
Para añadirlo a una ventana: Paleta de componentes -> Standard -> frame -> clic sobre el Form y te saldrá una lista de frames existentes en tu proyecto.

Yo por ejemplo tengo DBGrid que hace muchas cositas:
- Propiedades preestablecidas (ancho y alto de celdas, etc)
- coloreo de filas alternas
- multiordenación de columnas
- Formateo de números (negativos en rojo; muestra el total en euros de un color si está pagado o no, etc).

Todas las funcionalidades estan dentro del frGrid (FRameGrid). Si necesito un Grid, no tengo que usar el de la paleta de componentes y establecer todo de nuevo, directamente pego mi frame.

Otro ejemplo: un frame que contiene 1 Edit y un combo, el Edit para introducir el código de cliente y el combo para mostrar el nombre, de forma que siempre estén sincronizados (al escribir en uno, se actualiza los datos del otro).

El resultado es como si tuvieras un nuevo componente de la paleta de delphi, que hace lo que tú quieres. El código fuente solo está en una unidad, por lo que no se duplica código fuente.

Espero que estos ejemplos te ayuden a pensar en verde .

Saludos

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 17-10-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.339
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por thelibmx Ver Mensaje
...suponiendo que hay un boton de alta, otro de baja y otro de modificacion, iria esas 5 lines en cada boton, y si lo encapsulo pues solo mando llamar ese proceso o ese conjunto de instrucciones en una sola linea y no repito el codigo 5 veces, este es un ejemplo muy sencillo pues son 5 lineas, pero que pasa cuando son mas de 50 lineas de codigo, hay alguna manera de encapsularlo y reutilizarlo sin tener que repetir todo el codigo
Colocalas en un procedimiento/función (con parámetros si lo necesitas) y utilízalo tantas veces como quieras.
¿A eso te refieres?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 17-10-2007
Avatar de thelibmx
thelibmx thelibmx is offline
Miembro
 
Registrado: mar 2007
Posts: 515
Poder: 18
thelibmx Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
Colocalas en un procedimiento/función (con parámetros si lo necesitas) y utilízalo tantas veces como quieras.
¿A eso te refieres?
si,mi idea iba mas orientada a un procedimiento o funcion, es decir que se meta cierto codigo en el procedimiento o funcion y despues mandarlo a llamar, estoy empezando en esto y no se mucho sobre como deberia ser la estructura del procedimiento o la funcion, es decir si quisiera hacer un procedimiento en donde debo declararlo y que es lo que tengo que hacer?, si debe de ir antes o despues de llamarlo?, si se declara en los procedures ? etc.. pues he intentado hacerlo como si fuera procedimiento pero no encuentro la sintaxys correcta, ni la forma en como se manda a llamar, no tengo ahorita un caso en especifico, pero he hecho algunos programas y he tenido que repetir todo el codigo en cada boton por no poder hacerlo y eso como que no se ve bien,creo que dec a puesto un ejemplo de los procedimientos y como utilizarlos, podrian poner un ejemplo de como se haria si fuera funcion y como seria si fuera procedimiento, se los agradeceria mucho, de todos modos tomare en cuenta todas las formas que han escrito para investigar mas a fondo y entender un poco mejor. gracias por su atencion amigos
__________________
En movimiento...

Última edición por thelibmx fecha: 17-10-2007 a las 18:01:28.
Responder Con Cita
  #7  
Antiguo 17-10-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola thelibmx,

Según entiendo, y considerando que dices que recién estás empezando. La opción de Dec es la más adecuada para ti. De hecho, yo estoy haciendo cosas así, funciones de "proposito general" que reciben arrays de controles.

Creo que el ejemplo que te puso Dec es ilustrativo.
A los fines y propósitos de lo que es "Limpiar Edits", no tiene utilidad convertir dicho procedimiento en una función. De poder se puede, pero a mi modo de ver... no se ajusta lo deseado a una función. Recuerda que una función debe devolver un valor, un resultado. ¿Que valor debería o podría devolver una función que tiene como propósito limpiar edits? No se si me explico.

Lo que puedes hacer es tener una unidad con procedimientos y/o funciones de "propósitos generales" Por ejemplo una unidad ULimpieza que se encarga de hacer labores de limpieza, en ella podrías tener un variado conjunto de procedimientos o funciones que realizan limpieza según los controles y/o parámetros que necesites. Una vez que tienes esta unidad sólo es cuestión de agregar en la sección uses de alguna otra unidad en donde sea necesario llamar o usarlas.

No se si me explico. Tu unidad ULimpieza no tiene un form asociado. Es una unidad simple... tu sólo deberás llamarla cuando sea necesario.

Puedes luego, cuando afianses tus conocimientos, probar las otras opciones: Frames y/o Forms que puedas reutilizar en base a la herencia visual. Esto requiere de un poco más de astucia y son conceptos un poco más complicados. Por ello te digo que comiences teniendo la ULimpieza y después ver como ir aumentandola y/o adaptarla a Frames o Forms de herencia.

Si necesitas que te ayudemos a armar dicha unidad y/o si sigues teniendo dudas ya sabes. Puedes contar con nosotros.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #8  
Antiguo 17-10-2007
Avatar de thelibmx
thelibmx thelibmx is offline
Miembro
 
Registrado: mar 2007
Posts: 515
Poder: 18
thelibmx Va por buen camino
ok aqui hay un caso practico sencillito,igual y me pueden dar una mejor manera de optimizarlo o me pueden dar alguna sugerencia, veran tengo el siguiente codigo
Código Delphi [-]
 
procedure TFormquincena.Button3Click(Sender: TObject);
var
Count1,pos: integer;
text: string;
begin

//llenado de combo box de años de quincena
    Pos := ComBoxselectoranio.SelStart;
    ComBoxselectoranio.Items.Clear;
    Text := ComBoxselectoranio.Text;
formconecciones.Query_catalogo_quincenasmod.Close;
formconecciones.Query_catalogo_quincenasmod.SQL.Clear;
formconecciones.Query_catalogo_quincenasmod.SQL.Add('select distinct anio from catalogo_quincenas');
formconecciones.Query_catalogo_quincenasmod.ExecSQL;
formconecciones.Query_catalogo_quincenasmod.Open;
 Count1:=formconecciones.Query_catalogo_quincenasmod.RowsAffected;

    if Count1 > 0 then
     begin
      repeat Dec(Count1);
      ComBoxselectoranio.Items.Add(formconecciones.Query_catalogo_quincenasmod.FieldByName('anio').AsStrin  g);
       formconecciones.Query_catalogo_quincenasmod.Next;
      until Count1 = 0;
      ComBoxselectoranio.ItemIndex := 0;
      ComBoxselectoranio.SelStart := Pos;
      ComBoxselectoranio.SelLength := 255;
    end;
//llena combobox año  de quincena
 
end;
bien con ese codigo lo que hago esque lleno un combobox con los años que se encuentran en una tabla. Entonces al yo apretar un boton, pues trae todo los resultados y los mete al combobox, cuando yo corro mi programa en el evento form create se encuentra ese codigo, entonces se ejecuta y me llena el combo con los años que estan en ese momento en la tabla, digamos 1999,2000,2003, ok, ahora bien, tengo en un panel, con tedit, y desde ahi puedo insertar mas años en la tabla, digamos que 2004,2005,2006, como al crear el formulario se leyeron los que ya habia, ahora necesito que vuelva a ejecutar esa parte de codigo para que aparezcan los años agregados,entonces lo ideal creo yo seria meter esa parte de codigo en un proceso, para que cuando yo inicie la forma solo mande llamar ese proceso o cuando agregue un nuevo año, se mande a llamar el proceso, entonces lo que hago es esto
Código Delphi [-]
procedure llenadocombo();
var
Count1,pos: integer;
text: string;
comboxselectoranio:tcombobox;
begin
//llenado de combo box de años de quincena
    Pos := ComBoxselectoranio.SelStart;
    ComBoxselectoranio.Items.Clear;
    Text := ComBoxselectoranio.Text;
formconecciones.Query_catalogo_quincenasmod.Close;
formconecciones.Query_catalogo_quincenasmod.SQL.Clear;
formconecciones.Query_catalogo_quincenasmod.SQL.Add('select distinct anio from catalogo_quincenas');
formconecciones.Query_catalogo_quincenasmod.ExecSQL;
formconecciones.Query_catalogo_quincenasmod.Open;
 Count1:=formconecciones.Query_catalogo_quincenasmod.RowsAffected;
  showmessage(inttostr(count1));
    if Count1 > 0 then
     begin
      repeat Dec(Count1);
      ComBoxselectoranio.Items.Add(formconecciones.Query_catalogo_quincenasmod.FieldByName('anio').AsStrin  g);
       formconecciones.Query_catalogo_quincenasmod.Next;
      until Count1 = 0;
      ComBoxselectoranio.ItemIndex := 0;
      ComBoxselectoranio.SelStart := Pos;
      ComBoxselectoranio.SelLength := 255;
    end;
//llena combobox año  de quincena
end;
y pues para mandarlo llamar seria algo asi
Código Delphi [-]
procedure TFormquincena.FormCreate(Sender: TObject);
begin
llenadocombo();
end;
o si se tratara de un boton seria algo asi
Código Delphi [-]
procedure TFormquincena.Button4Click(Sender: TObject);
begin
llenadocombo();
end;

pero asi me manda un error de acces violation at adress 004ebc55 in modulo' modulo' .Read of adress 5s0000, cada ves que mando a llamar el procedimiento por medio del boton, o por el evento form create y asi me ha pasado con otros codigos que he querido intentar encapsular, se q algo estoy haciendo mal, tenganme mucha paciencia, no se desesperen se que es una tonteria, tal ves error de sintaxys o algo que no he declarado no se, enseñenme la luz jejeje gracias por su atencion
__________________
En movimiento...
Responder Con Cita
  #9  
Antiguo 17-10-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola nuevamente thelibmx,
Estuve haciendo unas diligencias y ya volví.

El error te que arroja se debe a que tu procedimiento LlenadoCombo tiene una variable del tipo TComboBox, precisamente la variable comboxselectoranio. Dicha variable en ningún momento está asociada a algún control y/o está instanciada (para tener acceso a dicha variable debes primero crearla). Por lo que entiendo, en el procedimiento Button3 cuando invocas al combo lo haces a un combo ya instanciado, pues existe en memoria y está asociado a un form.
Cuando declaraste la variable dentro del procedimiento, el compilador interpreta correctamente que se trata de un combo pero como nunca fue creado, provoca dicho error.
La solución sería borrar dicha variable y tener el procedimiento en alguna parte (posiblemente en la parte private) de la unidad asociada de la form para mantener la referencia al combo.

La otra posibilidad es que alteres a LlenadoCombo para que reciba por parámetro el combo. Es decir:

Código Delphi [-]
procedure LlenadoCombo(Combo: TComboBox);

Vas bien.

Aprovecho para recomendarte que si deseas conseguir una mayor modularidad y beneficiar la reutilización que evites mezclar la lógica, con la parte de acceso a datos y hacia con la parte de la interfaz. No es sencillo conseguir eso. Pero es preferible tener separado en una parte las funciones y procedimientos que hacen a cuestiones exclusivas a interfaz en un lado, por otro lado las funciones que tienen que ver con el acceso a los datos y por el otro la lógica.
En ocasiones es sencillo particionar el código... en otras es inevitable.
Esto se consigue, como la mayoría de las cosas de la vida, con la práctica y un buen diseño y planteo del problema.

Como ayuda puedes hacer lo siguiente:
Ve al sistema desde 3 puntos de vista:
1. Lo que debe hacer la interfaz. Confeccciona una lista de funcionalidades que hacen al empleo de la interfaz.
2. Haz la misma lista, pero esta vez sólo para lo relacionado con el aspecto a base de datos.
3. Ahora por último, lo más complicado: La lógica. Es aqui el problema debes conseguir armar un juego de funcionalidades que permitan dirigir el programa hacia ambos puntos: la interfaz y hacia el acceso a datos. Con ambas listas en mano busca aquellos puntos (funcionalidades) que se unen y/o que forman una "dependencia I/D" (I de interfaz y D de Datos). A cada dependencia le asocias un nombre, un evento lógico que tenga sentido. Declaralo en forma de procedimientos o funciones y trata de mantener cada "dependencia" tan separado de las otras. Es posible que hayas relaciones entre ellas.

Bueno espero que se me entienda. Esto es un TIP. Hay varias maneras de conseguir modular un sistema... esta es la más simple que se me ocurre.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 17-10-2007 a las 21:06:20.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ANN: AnyNET-Delphi: Herramienta para generar codigo fuente Delphi desde :NET mamcx Noticias 7 21-05-2007 02:12:36
Recuperar codigo delphi CORBATIN Varios 2 10-05-2007 01:33:12
ó Código BAT o con Delphi Deiv Varios 8 12-06-2006 00:35:50
de codigo VB a codigo Delphi ingel Impresión 2 20-07-2004 14:15:44
codigo sql en delphi azaagh SQL 4 11-06-2004 18:15:55


La franja horaria es GMT +2. Ahora son las 23:40:07.


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
Copyright 1996-2007 Club Delphi