Ver Mensaje Individual
  #1  
Antiguo 10-12-2006
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Reputación: 25
Delphius Va camino a la fama
Question Ayuda sobre gestion de ventanas modales y no modales

Buenos dias foristas,

Estaba viendo algunas recomendaciones que hace Ian Marteens en su libro La Cara Oculta de Delphi 4. Para ser exacto el método de clase que declara para crear ventanas modales o no modales, en la página 274.

Entiendo bien lo que hacen dichos algoritmos... y me gustaría llevarlo a la práctica... emplearlos en forma genérica (supuestamente esa es la ventaja de implementar como un método de clase) y al querer hacerlo me sale la duda: ¿Tengo que diseñar una clase TVentanaModal y TVentanaNoModal que derive de TForm? o de TCustomForm? A mi entender eso pretende...

¿Si declaro esas clases... como hago para que pueda hacer uso de las mismas?.... Generalmente uno hace File -> New -> Form. Y como es de esperar... este deriva de TForm. Ahora,.. la pregunta del millón: ¿Como hago para que al diseñar una nueva aplicación pueda usar dichas "formas" y no un TForm?

Por otro lado estaba pensando en que tengo que hacer herencia visual de un TForm y allí le meto el método de clase ¿?... pero la verdad es que nunca llevé a la práctica este tipo de herencia...
Tengo entendido que uno puede guardar una forma (para una aplicación)... y luego puede hacer File -> New -> Other -> Proyect, seleciona la forma deseada y tildando en Inherit hace herencia visual. Claro, todo dentro del aplicativo en cuestión. ¿Y si yo quiero tener algo genérico.... como los TAboutForm... pero que sea TVentanaModal y TVentanaNoModal como implementa Ian Marteens? De seguro que existe solución para lo que necesito.

Yo para combatir algunos de estos malestares de gestiones de ventanas me había declarado una unit (en mis primeros meses de programacion en Delphi) con funciones y procedimientos que realizan operaciones sobre las formas que se le pasen como parámetros. Algo como:

Código Delphi [-]
unit WindowsUses;

interface

uses Windows, SysUtils, Forms, Messages, Classes;

procedure Mostrar(Forma: TForm;Value:Boolean;PosX,PosY:integer);
procedure ExpandirForma(Forma:TForm;Ancho,Largo:integer);
function FormaCreada(Nombre: String): boolean;
procedure DestruirForma(Forma: TForm);
procedure MinimizarForma(Forma: TForm);
procedure MaximizarForma(Forma: TForm);
procedure RestaurarForma(Forma: TForm);
procedure MinimizarAplicacion;
procedure FinalizarAplicacion;

implementation

procedure Mostrar(Forma: TForm;Value:Boolean;PosX,PosY:integer);
var Ban: Boolean;
begin
Ban := FormaCreada(Forma.Name);
if Ban
   then begin
        with Forma do
          begin
          Left := PosX;
          Top := PosY;
          Visible := Value;
          end;
        end;
end;

procedure ExpandirForma(Forma:TForm;Ancho,Largo:integer);
var Ban: boolean;
begin
ban := FormaCreada(Forma.Name);
if Ban then begin
            with Forma do
              begin
              Height:= Largo;
              Width:= Ancho;
              end;
            end;
end;

function FormaCreada(Nombre: string): boolean;
var Ban: boolean;
    i: integer;
begin
Ban := False;
i := 0;
while (Ban = False) and (i<= Screen.FormCount-1) do
  begin
  if Screen.Forms[i].Name = Nombre
    then ban := True
    else Inc(i,1);
  end;
Result := Ban;
end;

procedure DestruirForma(Forma: TForm);
var Ban: boolean;
begin
Ban := FormaCreada(Forma.Name);
if Ban
   then Forma.Destroy;
end;

procedure MinimizarForma(Forma: TForm);
var Ban: boolean;
begin
Ban := FormaCreada(Forma.Name);
if Ban then begin
            with Forma do
            WindowState := wsMinimized;
            end;
end;

procedure MaximizarForma(Forma: TForm);
var Ban: boolean;
begin
Ban := FormaCreada(Forma.Name);
if Ban then begin
            with Forma do
            WindowState := wsMaximized;
            end;
end;

procedure RestaurarForma(Forma: TForm);
var Ban: boolean;
begin
Ban := FormaCreada(Forma.Name);
if Ban then begin
            with Forma do
            WindowState := wsNormal;
            end;
end;

procedure MinimizarAplicacion;
begin
Application.Minimize;
end;

procedure FinalizarAplicacion;
begin
Application.Terminate;
end;

end.

Disculpen que ponga todo el código, pero armar un zip con un solo pas y para que sólo contenga esto... me parece un desperdicio de recurso.

Las funciones sirven... pero me empezó a gustar la alternativa de Ian... es más, me justificaba dicendo: "Se entiene mejor FrmProveedores.Mostrar() que tener Mostrar(FrmProveedores,True,0,0).
Entonces... si puedo declarar tantos metodos de clase como para satisfacer las mismas ( o màs) funciones descriptas en la unidad expuesta anteriormente me evitaría que hacer uso de dicha unidad. ¡Ya quedraría todo encapsulado en la clase!

Como alternativa (me gusta buscar opciones, no es que quiera complicarme la vida)... e inspirandome en parte por Ian se me estaba ocurriendo diseñar un componente no visual que encapsule varias funciones e intercepte posibles mensajes que se le dirijan a la forma que lo contiene y realize las modificaciones y/o operaciones necesarias... pero claro... estaría reinventando el TApplicartionEvents ¿o me equivoco?

Bueno, despuès de tanto lío... espero que alguien me haya entendido... sino bueno... seguiré viendo a ver si se me ocurre algo, me siento bajo un manzano y espero a ver si una manzana me ayuda a darle explicaciòn... jaja.

Escucho alternativas... y si alguien ha logrado captar mi idea... y logra explicarme un poco del tema se lo agradecería.

Muchas gracias a todos que hayan dedicado tiempo en leer este hilo.
Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita