Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Invertir funcionamiento botones TDBNavigator (https://www.clubdelphi.com/foros/showthread.php?t=52870)

Ivanzinho 02-02-2008 15:11:39

Invertir funcionamiento botones TDBNavigator
 
Hola compañeros, quería saber si se puede invertir el funcionamiento de los botones de un TDBNavigator en Delphi 5.

Lo que quiero es intercambiar el funcionamiento de nbFirst con el de nbLast y el de nbPrior con nbNext. Lo intente capturando el boton pulsado en el evento beforeAction, pero el problema está en que si nos encontramos en uno de los extremos (primero o último registros), el par nbFirst-nbPrior y el nbLast-nbNext aparecen desabilitados según corresponda y me quedo bloqueado en un registro.

También pensé en crear un componente heredado de TDBNavigator, pero si puedo hacerlo de otra manera y evitar esto lo prefiero.

¿Se les ocurre alguna idea de como realizarlo?

Muchas gracias por vuestra ayuda.

Un saúdo.

Delphius 02-02-2008 15:52:21

Hola Ivanzinho,
Extraño requerimiento.

¿Porqué es necesario hacer eso? ¿Lo dices más por una cuestión de alguna "estética" de los botones?
¿Necesariamente debes usar un TNavigator?
Porque la solución "pobre" Y simple es poner tantos botones como sean necesarios y que llame al evento adecuado del TNavigator (estando este ocultado).

Saludos,

eduarcol 02-02-2008 16:05:23

creo que a fin de cuentas seria mejor derivar del componente y cambiarle el comportamiento, es menos trabajo

Delphius 02-02-2008 16:16:23

Puede que la solución de Eduardo si se puede llegar a cabo. Al menos asi lo estoy entiendo ahora... me acabo de fijar en la VCL y los métodos necesarios para alterar están en la sección protected por lo que en teoria no habría problemas.

Yo estaba pensando en que serían privados.

Saludos,

Ivanzinho 02-02-2008 16:21:50

Cita:

Empezado por Delphius
Hola Ivanzinho,
Extraño requerimiento.

Te doy la razón. :)

Cita:

Empezado por Delphius
¿Porqué es necesario hacer eso? ¿Lo dices más por una cuestión de alguna "estética" de los botones?

La cuestión es que me encargaron un modulo para una aplicación. Este modulo permitirá a los usuarios introducir una serie de registros y sus líneas de detalle.

Cuando los usuarios acceden a la pantalla se deben cargar todos los registros no tratados y los introducidos en el último mes, pueden ser unos 1000 registros, y se visualice el último registro introducido.

Intenté convencerlos de que eso me parecía una tontería, ya que 1000 registros no los van a utilizar, utilizarán a lo sumo 10 y el modulo incluye la posibilidad de realizar filtros que permiten localizar facilemente 1 registro o un grupo de registros en base a unas condiciones, pero me dijeron que no, que el resto de modulos de la aplicación tenían ese funcionamiento y que lo querían así.

Por lo que decidí realizar la consulta ordenada descendentemente por número de registro, para evitar tener que hacer un last y que así solo se realice el fetch de un registro.

El problema de esto es que si queremos ir al registro anterior debemos pulsar el boton nbNext ya que están ordenados descendentemente, y en el resto de la aplicación nbNext te lleva al siguiente y nbPrior al anterior. Por esto es por lo que busco este funcionamiento del TDBNavigator. Espero haberme explicado :p.

Cita:

Empezado por Delphius
¿Necesariamente debes usar un TNavigator?

Si puedo evitar componentes de terceros lo prefiero, ya que no se usan en ningún otro lado de la aplicación.

Cita:

Empezado por Delphius
Porque la solución "pobre" Y simple es poner tantos botones como sean necesarios y que llame al evento adecuado del TNavigator (estando este ocultado).

Pensé en ello. :)

Un saúdo y muchas gracias, Delphius, por responder

Ivanzinho 02-02-2008 16:24:59

Cita:

Empezado por eduarcol
creo que a fin de cuentas seria mejor derivar del componente y cambiarle el comportamiento, es menos trabajo

Cita:

Empezado por Delphius
Puede que la solución de Eduardo si se puede llegar a cabo. Al menos asi lo estoy entiendo ahora... me acabo de fijar en la VCL y los métodos necesarios para alterar están en la sección protected por lo que en teoria no habría problemas.

Yo estaba pensando en que serían privados.

Saludos,


Sí, si no tengo otra solución lo haré así, pero de principio me da algo de miedo :o:p

eduarcol 02-02-2008 16:26:57

Cita:

Empezado por Ivanzinho (Mensaje 262978)
Sí, si no tengo otra solución lo haré así, pero de principio me da algo de miedo :o:p

Hombre y cual es el miedo, si el TDBNavigator es uno solo y en el club somos muchos :D:D

Ivanzinho 02-02-2008 16:44:55

Cita:

Empezado por eduarcol
Hombre y cual es el miedo, si el TDBNavigator es uno solo y en el club somos muchos :D:D

Gracias Eduardo, esto anima a cuaquiera a ponerse manos a la obra.

Lo dejo aquí por hoy, que es sabado por la tarde y me está esperando mi novia (no puedo tardar :eek::p). Si mañana no tengo otra respuesta ya saben que camino van a llevar mis próximas intervenciones en el foro.:)

Muchas gracias por sus aportes, uno se siente comodo con gente así.

Un saúdo.

eduarcol 02-02-2008 16:47:15

Cita:

Empezado por Ivanzinho (Mensaje 262986)
Gracias Eduardo, esto anima a cuaquiera a ponerse manos a la obra.

Lo dejo aquí por hoy, que es sabado por la tarde y me está esperando mi novia (no puedo tardar :eek::p). Si mañana no tengo otra respuesta ya saben que camino van a llevar mis próxima intervenciones en le foro.:)

Muchas gracias por sus aportes, uno se siente comodo con gente así.

Un saúdo.

Ok, que disfrutes la tarde ;)

Al González 03-02-2008 00:11:46

¡Hola!

Entiendo la situación, una flecha "->" es ir al "siguiente hacia arriba" y una flecha "<-" simboliza ir al "anterior hacia abajo".

Si quieres hacerlo con TDBNavigator, el reto sería estudiar esa clase, en especial sus métodos virtuales/mensaje, y crear una clase derivada que cambie algunos aspectos de su comportamiento.

Antes de llegar a eso, se me ocurre que si el único problema es causado por las propiedades BOF y EOF del conjunto de datos, cuando éstas adquieren un valor de True, y no te importaría que en ningún momento tuviesen ese valor, tal vez podría emplearse un truco de "reposicionamiento" del conjunto de datos para que nunca obtenga de forma permanente los estados BOF y EOF.

Desde luego, la derivación del componente parece ser la solución más elegante, si es que la estructura de la clase lo facilita. Sería cosa de echarle un vistazo...

Seguimos en contacto.

Al González.

keyboy 03-02-2008 09:56:50

Si el intercambio de acciones ya lo tienes resuelto con el BeforeAction, basta intercambiar el estado de los botones. Esto lo puedes hacer en el evento OnDataChange del DataSource asociado al DBNavigator:

Código Delphi [-]
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
var
  ButtonEnabled: Boolean;

begin
  with DBNavigator1 do
  begin
    // intercambia estado entre prior y next
    ButtonEnabled := Buttons[nbPrior].Enabled;
    Buttons[nbPrior].Enabled := Buttons[nbNext].Enabled;
    Buttons[nbNext].Enabled := ButtonEnabled;

    // intercambia estado entre first y last
    ButtonEnabled := Buttons[nbFirst].Enabled;
    Buttons[nbFirst].Enabled := Buttons[nbLast].Enabled;
    Buttons[nbLast].Enabled := ButtonEnabled;
  end;
end;

El único impedimento aquí, es que Buttons es una propiedad protegida del DBNavigator, pero puedes "desprotegerla" fácilmente añadiendo esta declaración antes de tu formulario:

Código Delphi [-]
type
  TDBNavigator = class(DBCtrls.TDBNavigator);

Bye

Ivanzinho 04-02-2008 09:36:03

Efectivamente, con la propuesta de keyboy consigo lo deseado, por lo que para ir tirando me va a valer. Pero mi intención es derivar el componente ya que es una opción que no descarto utilizar en otros modulos de la aplicación.

Muchas gracias a todos por vuestra ayuda.

Un saúdo.

keyboy 04-02-2008 17:26:15

Veo un poco difícil que pueda derivarse un componente del TDBNavigator para lograr este comportamiento. Los métodos involucrados en el cambio de estado del dataset (DataChanged, EditingChanged y ActiveChanged), si bien son métodos protegidos, no son virtuales, por lo que no pueden redefinirse.

Bye

Ivanzinho 04-02-2008 17:48:03

Sí, ya me había fijado. En principio a mi sólo me interesaba modificar el DataChanged, pero me encontré con ese problema.

Al final lo dejé como me indicaste anteriormente incluyendo en el formcreate el siguiente código :
Código Delphi [-]
procedure TFMovRec.FormCreate(Sender: TObject);
var
  Button: TNavigateBtn;
begin

.......

  with DBNavigator do
    begin
      Button := Buttons[nbPrior].Index;
      Buttons[nbPrior].Index := Buttons[nbNext].Index;
      Buttons[nbNext].Index := Button;
      Button := Buttons[nbFirst].Index;
      Buttons[nbFirst].Index := Buttons[nbLast].Index;
      Buttons[nbLast].Index := Button;
    end;

......

end;

Así obtengo el funcionamiento requerido y por ahora me vale perfectamente.

Un saúdo y nuevamente gracias.


La franja horaria es GMT +2. Ahora son las 06:04:12.

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