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 02-08-2006
Sudamericano Sudamericano is offline
Miembro
 
Registrado: feb 2004
Posts: 41
Poder: 0
Sudamericano Va por buen camino
codigo roman = 4 lineas
Código Delphi [-]
 
if not Assigned(FrmCliente) then  FrmCliente := TfrmCliente.Create(Application)else  FrmCliente.Show;

Mi codigo = 3 lineas

Código Delphi [-]
 
 if not Assigned(FrmCliente) then  FrmCliente := TfrmCliente.Create(Application)  FrmCliente.Show;

ambos codigos son equivalentes
Responder Con Cita
  #2  
Antiguo 02-08-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Las líneas al compilador le son indistintas. El punto es que hay un paso de más en la otra manera (Show después de Create). Claro que- como dije al principio -no afecta y seguro que en este caso concreto nadie notará un ciclo más del procesador, pero yo prefiero como norma evitar redundancias. Desde luego es más cuestión de gustos.

// Saludos
Responder Con Cita
  #3  
Antiguo 03-08-2006
grone35 grone35 is offline
Miembro
 
Registrado: jul 2006
Posts: 16
Poder: 0
grone35 Va por buen camino
Smile

Muy buen debate!! Pero compañeros, he tenido el mismo problema con cualquiera de los dos codigos!!! Despues de que cierro el formulario secundario no lo puedo volver a abrir.

saludos!!
Responder Con Cita
  #4  
Antiguo 24-08-2006
kesu kesu is offline
Registrado
 
Registrado: ago 2006
Posts: 3
Poder: 0
kesu Va por buen camino
Un saludo a todos los foreros, quiza sea un poco tarde para este mensaje, pero espero que le sirva a alguno.

codigo para mostrar form hijas: ( procedimiento)

Código Delphi [-]
procedure mostrarHija(aHija: TFormClass);
var
auxForm: TForm;

begin
auxForm:= Application.FindComponent(Copy(aHija.ClassName,2,255)) as TForm;
if Assigned(auxForm) then
auxForm.Show
else
auxForm.Create(Application);

end;



luego ... si se decea destruir una ventana(form) hija al cerrarla y no solo
minimizarla, solo adicionamos una linea de codigo en el evento OnClose de
esta:

Código Delphi [-]
Action:= caFree;




de antemano pido disculpas si existe algun error en el codigo, lo escribo de
memoria, pero los que tienen el libro de Ian Marteens pueden consultarlo, pues fue en la "Cara Oculta" donde lo lei hace algun tiempo atras.
Responder Con Cita
  #5  
Antiguo 24-08-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Parece que el compañero se quedó con el error, despues de 3 semanas supongo que lo habrá solucionado; tambien puede darse el caso de que lo haya "postpuesto".

Reuniendo todo lo dicho, sin entrar en más debates, una solución completa sería:
Código Delphi [-]
// En un toolbar del MDI abrimos la ventana.
procedure TFrmMDI.Toolbutton1Click(Sender:Tobject);
begin
  if not Assigned(FrmCliente) then
    FrmCliente := TfrmCliente.Create(Application)
  else
    FrmCliente.BringtoFront;
end;

// En el evento OnClose del propio FrmCliente añadimos:
procedure TFrmCliente.FormClose(...var action:TCloseaction);
begin
  action := cafree;
  FrmCliente := nil;
end;

Ventajas de este método:
- En la ventana de facturas se puede usar datos de Frmclientes de forma cómoda:
Código Delphi [-]
  if assigned(frmcliente) then
    ShowMessage(frmCliente.Loquesea);

- No necesitamos hacer un bucle para encontrar una ventana, porque tenemos sus referencias Frmclientes, FrmFacturas, etc.

- Solo permitimos una ventana abierta de cada tipo al mismo tiempo. En algunos casos es una desventaja, en otros una ventaja, depende de la filosofía que se quiera seguir.

El método de kesu si tiene un pequeño error, pero al haber sido escrito de memoria, demasiado bien está. Por otra parte, es "la otra filosofía" para trabajar con ventanas MDI, ese método si permite tener varias ventanas FrmClientes abiertas al mismo tiempo, pero tambien tiene sus inconvenientes. Si interesa ese método, pregunten.

Lo que sí es muy importante es no mezclar ambos métodos, porque tendríamos Access Violation, Abstract Error y otras muchas excepciones nada obvias de localizar

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 25-08-2006
grone35 grone35 is offline
Miembro
 
Registrado: jul 2006
Posts: 16
Poder: 0
grone35 Va por buen camino
Smile Aplicacion Multiformulario

Gracias Kesu y Lepe!!

La verdad no habia solucionado este inconveniente pero habia buscado otros caminos que solucionaban de manera diferente mi problema. Voy a probar lo que ustedes acosejan y espero dar parte positivo despues de esto.

Saludos!!
Responder Con Cita
  #7  
Antiguo 07-01-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
Pues lepe diste justo en el blanco...

Disculpen que habra este hilo desde hace tiempo... lo que pasa es que yo estaba buscando en los foros algo que me ayude a determinar un error.

Hace un tiempo dejé un hilo inconcluso. Pues, empecé a retomarlo... y estuve metiendo código.
Veran, estoy declarando un descendiente de TForm ,lo llamé TExpertForm. Pues en dicha forma se encapsulan procedimientos y propiedades que permitan realizar visualizaciones tanto en forma modales como no modales... y que funcionen tanto para aplicaciones MDI como SDI (es asi?)

Me leí todo y al llegar aqui:

Cita:
Empezado por Lepe
- Solo permitimos una ventana abierta de cada tipo al mismo tiempo. En algunos casos es una desventaja, en otros una ventaja, depende de la filosofía que se quiera seguir.

El método de kesu si tiene un pequeño error, pero al haber sido escrito de memoria, demasiado bien está. Por otra parte, es "la otra filosofía" para trabajar con ventanas MDI, ese método si permite tener varias ventanas FrmClientes abiertas al mismo tiempo, pero tambien tiene sus inconvenientes. Si interesa ese método, pregunten.

Lo que sí es muy importante es no mezclar ambos métodos, porque tendríamos Access Violation, Abstract Error y otras muchas excepciones nada obvias de localizar
¡Y eso es lo que me pasa!
Hasta ahora (todavia estoy viendo esto) el código que tengo es como sigue:

Código Delphi [-]
unit UExpertForm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

const
  MAX_VARIABLES = 25;

type
  TStateModal = (smModal, smNotModal);
  TInstancePermits = (ipOnlyOne, ipMultiple);

  TVarDomain = (vdPublic, vdPrivate);
  TVarInfo = record
    Value: Variant;
    Domain: TVarDomain;
  end;

  TArrayVariables = array [0..MAX_VARIABLES - 1] of TvarInfo;

  TExpertForm = class(TForm)
  private
    { Private declarations }
    FVars: TArrayVariables;
    FInstancePermits: TInstancePermits;
    FState: TStateModal;
  protected
    { Protected declarations }
    FID: integer;
    FOptionView: integer;
    function GetID: integer; virtual; abstract;
    procedure SetID(const Value: integer); virtual; abstract;
    function GetOptionView: integer; virtual; abstract;
    procedure SetOptionView(const Value: integer); virtual; abstract;
    procedure VariableChange(Index: integer; Value, OldValue: Variant); virtual; abstract;
    procedure DomainChange(Index: integer; Domain, OldDomain: TVarDomain); virtual; abstract;
  public
    { Public declarations }
    property ID: integer read GetID;
    property OptionView: integer read GetOptionView;
    property InstancePermits: TInstancePermits read FInstancePermits write FInstancePermits;
    procedure SetVariable(const Index: integer; Value: Variant; Domain: TVarDomain);
    function GetVariable(Sender: TObject; Index: integer): Variant;
    procedure View(OptionView: integer; NewInstance: boolean);
    procedure ViewModal(OptionView: integer);
    procedure ViewNotModal(OptionView: integer; NewInstance: boolean);
  end;


implementation

{$R *.dfm}

procedure TExpertForm.SetVariable(const Index: integer; Value: Variant; Domain: TVarDomain);
var OldV: Variant;
    OldD: TVarDomain;
begin
  OldV := FVars[Index].Value;
  OldD := FVars[Index].Domain;
  if (Value <> OldV)
     then begin
            FVars[Index].Value := Value;
            VariableChange(Index, Value, OldV);
          end;
  if (Domain <> OldD)
     then begin
            FVars[Index].Domain := Domain;
            DomainChange(Index, Domain, OldD);
          end;
end;

function TExpertForm.GetVariable(Sender: TObject; Index: integer): Variant;
begin
  if (Sender <> Self) AND (FVars[Index].Domain = vdPrivate)
     then raise Exception.Create('Error. Variable is private')
          else result := FVars[Index].Value;
end;

procedure TExpertForm.View(OptionView: integer; NewInstance: boolean);
begin
 if FState = smModal
    then ViewModal(OptionView)
    else ViewNotModal(OptionView, NewInstance);
end;

procedure TExpertForm.ViewModal(OptionView: integer);
begin
 if (NOT Assigned(Self))
    then begin
           with Create(Application) do
             try
               SetOptionView(OptionView);
               FState := smModal;
               ModalResult := ShowModal;
             finally
               Free;
             end;
         end
    else begin
           SetOptionView(OptionView);
           FState := smModal;
           ModalResult := ShowModal;
         end;
end;

procedure TExpertForm.ViewNotModal(OptionView: integer; NewInstance: boolean);
var Frm: TExpertForm;
begin
  // si es de una sola instancia...
  LockWindowUpdate(Application.MainForm.Handle);
  try
    if NOT (Assigned(Self))
       then begin
             // no hay ventana... hacer una
             with Create(Application) do
               try
                 FState := smNotModal;
                 FOptionView := OptionView;
                 Show;
               finally
                 Free;
               end;
            end
       else begin
               FState := smNotModal;
               FOptionView := OptionView;
               if Self.WindowState = wsMinimized
                  then Self.WindowState := wsNormal;
               Self.BringToFront;
               Self.Show;
               Exit;
            end;
  finally
    LockWindowUpdate(0);
  end;
end;

end.

Me preguntaba si se podrá realizar lo que pretendo... se que tiene errores... y algunos los veo ahorita. Mi pregunta mas que nada pasa por el hecho de como controlar que se pueda operar tanto para una sola instancia como para varias.

Desde ya muchas gracias,

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

Última edición por Delphius fecha: 07-01-2007 a las 06:13:07. Razón: EDITO: agregé el link hacia el hilo inconcluso. Correcciones de ortografía
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
Diferencia entre aplicacion Clx y aplicación normal??? JorgeBec Varios 1 27-10-2004 17:30:49
aplicacion vertical? aplicacion horizontal? maruenda Varios 3 28-02-2004 23:23:20


La franja horaria es GMT +2. Ahora son las 21:55:08.


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