Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-03-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cual es la mejor opcion para aumentar rendimiento de Base de Datos

hola amigo hoy vengo con una consulta, estoy desarrollando un sistema en delphi 11 multiplataforma inicialmente para windows y luego compilarlo para mobiles, tengo una base de datos en un servidor pago en insternet con windows server y un Sql Server instalado con una base de dato donde almaceno imagenes y datos sin embargo veo que mi aplicacion aun es lenta. sera posible que pueda yo desarrollar una aplicacion que corra localmente en el servidor y que todas la consultas se hagan en el servidor y que el cliente de alguna forma solo visualizara los resultados. pude investigar algo en una aplicacion que se desarrolle con REST cliente Servidor. mi pregunta es. Es Conveniente? o hay otra alternativa?
Responder Con Cita
  #2  
Antiguo 24-03-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Todo depende de cómo sea la interacción entre tu aplicación y la base de datos.
El problema de trabajar a través de internet es la latencia.
Por esto, deberías obtener todo lo necesario en una sola consulta en vez de hacer muchas.
Por ejemplo, si obtienes la cabecera de facturas y luego tienes que obtener el nombre del cliente. Puedes hacerlo en dos consultas o en una sola con un JOIN o utilizando una vista. Llevado al extremo puedes obtener datos sobre cabecera, totales, descripciones, etc.
Por otro lado, puedes hacer un cache de cosas que necesitas regularmente. Por ejemplo tablas pequeñas que puedas guardar localmente para evitar consultas. Por ejemplo tipo y descripción de doumento, lista de series de facturación, datos de usuario, etc.
Responder Con Cita
  #3  
Antiguo 24-03-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Depende de lo que necesites.
Responder Con Cita
  #4  
Antiguo 24-03-2023
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.275
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 giantonti1801 Ver Mensaje
...sin embargo veo que mi aplicacion aun es lenta.
Es relativo y falta mucha información.
Depende de qué es lento en este caso. De qué estás haciendo. De qué SQL's o consultas estás lanzando.

Tendrías que o concretar más o centrarte en un ejemplo concreto.

Ejemplo: La consulta de clientes es lenta.
Centrándote en esto: ¿Qué consulta estás haciendo? ¿Cuantos clientes estás leyendo? ¿Cuando tarda?

Cita:
Empezado por giantonti1801 Ver Mensaje
pude investigar algo en una aplicacion que se desarrolle con REST cliente Servidor. mi pregunta es. Es Conveniente? o hay otra alternativa?
Relacionado con lo anterior.
Si haces una consulta sobre clientes y tarda mucho porque trae 10000 registros. Si conviertes toda tu aplicación a esa configuración de REST y haces la misma consulta va a tardas más (va a traer los mismos 10000 registros, pero haciendo más cosas). Por eso digo, que hay que saber primero porqué va lenta y luego buscar la solución según el problema.
__________________
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
  #5  
Antiguo 24-03-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
Todo depende de cómo sea la interacción entre tu aplicación y la base de datos.
El problema de trabajar a través de internet es la latencia.
Por esto, deberías obtener todo lo necesario en una sola consulta en vez de hacer muchas.
Por ejemplo, si obtienes la cabecera de facturas y luego tienes que obtener el nombre del cliente. Puedes hacerlo en dos consultas o en una sola con un JOIN o utilizando una vista. Llevado al extremo puedes obtener datos sobre cabecera, totales, descripciones, etc.
Por otro lado, puedes hacer un cache de cosas que necesitas regularmente. Por ejemplo tablas pequeñas que puedas guardar localmente para evitar consultas. Por ejemplo tipo y descripción de doumento, lista de series de facturación, datos de usuario, etc.
Realmente es una aplicación bastante importante y me refiero a esto al tamaño de la información que pueda tener ya que que estamos hablando de una sola base de dato y lo único que hace la diferencia entre una empresa y otro es un identificador que coloco en todas las tablas Es decir que cada empresa o licencias si la queremos llamar es dueña de su propia información. Ahora escribiéndolo aquí en el foro talvez esto sea un error y puedo repararlo sin ningún problema creando una base de dato para cada Empresa/Licencia, pero no creo que aun esta sea la solución ya que aun lo tengo en prueba y solo estoy trabajando con una sola empresa. Asi que creo que debo verificar las consultas. Mi gran duda es la siguiente:
Cuando ejecutamos el programa en la PC o Movil que hace? Me refiero cuando iniciamos el programa el sistema recorre todos los query? Solamente conecta la Base de datos? carga toda la Grafica? o que? por ejemplo cuando ejecuto la aplicación lo primero que muestra es un from con el login y password y alli también se tarda. Cabe destacar que solamente el Login y password está en un from separado luego de eso el sistema entra en otro from (diria yo Unico) donde en el hay diferentes pestañas (TABCONTROL) no se si el problema está allí. es un software de telemedicina las consultas son necesaria y en las tablas estoy almacenado Fotos, Archivos entre otra cosas.
Que me pueden recomendan? Desarrollar el sistema en diferente From? Que cada empresa/Licencia tenga su propia base de dato (aun haciendo eso talvez no sea la solución ya que en este momento ya es lento y estoy trabajando con una sola Empresa pero pudiera ser una de las soluciones)? Todas las tablas tienen índices.
Responder Con Cita
  #6  
Antiguo 24-03-2023
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
https://www.clubdelphi.com/foros/showthread.php?t=93348
Responder Con Cita
  #7  
Antiguo 24-03-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Cita:
por ejemplo cuando ejecuto la aplicación lo primero que muestra es un from con el login y password y alli también se tarda.
Esto puede ser porque al arrancar la aplicación estás haciendo más cosas de las que necesitas...
Por ejemplo:
¿Conectas a la base de datos antes de obtener usuario y password? No deberías hacerlo, pues todavía no puede usar nada.
Luego de obtener estos datos, puedes crear la conexión y verificarlos.

¿Traes datos para crear cosas (Gráfica?) antes de obtener usuario y password?

¿Tienes los formularios con autocreate? Deberías crearlos a medida que los necesites.

¿Inicializas cosas que quizás no necesites hasta que se pidan?

Como ves, habría que analizar qué es lo que estás haciendo al iniciar la aplicación.
Te recomiendo hacer un Log en cada formulario para ver cuando se abren y cierran y quizás en los puntos donde se traen datos para saber cuando se pasa por alli.
Lo guardas todo con fecha y hora delante en un fichero que luego puedas abrir para revisar.

A veces te enteras de que estás abriendo una tabla para luego filtrarla y volverla a abrir.
También podría ser que estés haciendo consultas en cada OnChange de alguna cosa y eso podría guardarse en memoria.
Responder Con Cita
  #8  
Antiguo 24-03-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
Esto puede ser porque al arrancar la aplicación estás haciendo más cosas de las que necesitas...
Por ejemplo:
¿Conectas a la base de datos antes de obtener usuario y password? No deberías hacerlo, pues todavía no puede usar nada.
Luego de obtener estos datos, puedes crear la conexión y verificarlos.

¿Traes datos para crear cosas (Gráfica?) antes de obtener usuario y password?

¿Tienes los formularios con autocreate? Deberías crearlos a medida que los necesites.

¿Inicializas cosas que quizás no necesites hasta que se pidan?

Como ves, habría que analizar qué es lo que estás haciendo al iniciar la aplicación.
Te recomiendo hacer un Log en cada formulario para ver cuando se abren y cierran y quizás en los puntos donde se traen datos para saber cuando se pasa por alli.
Lo guardas todo con fecha y hora delante en un fichero que luego puedas abrir para revisar.

A veces te enteras de que estás abriendo una tabla para luego filtrarla y volverla a abrir.
También podría ser que estés haciendo consultas en cada OnChange de alguna cosa y eso podría guardarse en memoria.
gracias por tu respuestas esto me esta abriendo algunas soluciones pero como puedo hacer un log de cada formulario?
como mencione antes solo tengo el From de Login y el prom principal donde en el tengo tabControl y todo esta alli?
Responder Con Cita
  #9  
Antiguo 24-03-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
Esto puede ser porque al arrancar la aplicación estás haciendo más cosas de las que necesitas...
Por ejemplo:
¿Conectas a la base de datos antes de obtener usuario y password? No deberías hacerlo, pues todavía no puede usar nada.
Luego de obtener estos datos, puedes crear la conexión y verificarlos.

¿Traes datos para crear cosas (Gráfica?) antes de obtener usuario y password?

¿Tienes los formularios con autocreate? Deberías crearlos a medida que los necesites.

¿Inicializas cosas que quizás no necesites hasta que se pidan?

Como ves, habría que analizar qué es lo que estás haciendo al iniciar la aplicación.
Te recomiendo hacer un Log en cada formulario para ver cuando se abren y cierran y quizás en los puntos donde se traen datos para saber cuando se pasa por alli.
Lo guardas todo con fecha y hora delante en un fichero que luego puedas abrir para revisar.

A veces te enteras de que estás abriendo una tabla para luego filtrarla y volverla a abrir.
También podría ser que estés haciendo consultas en cada OnChange de alguna cosa y eso podría guardarse en memoria.
En efecto uno de los problema que tenia es que todos los fron estaban en autocreate pero ahora surge otro problema que estoy intentando de todo para abrir y cerrar los formulario pero me da error. cual es la sentencia correcta para abrir y cerra un formulario que no esta en autocreate?
Responder Con Cita
  #10  
Antiguo 26-03-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Cita:
... estoy intentando de todo para abrir y cerrar los formulario pero me da error. cual es la sentencia correcta para abrir y cerra un formulario que no esta en autocreate?
Básicamente tienes que ejecutar la sentencias
Código Delphi [-]
Formulario := TFormulario.Create(Self);
Transcribo a continuación la ayuda de Delphi 6.

Creating forms dynamically
You may not always want all your application’s forms in memory at once. To reduce the amount of memory required at load time, you may want to create some forms only when you need to use them. For example, a dialog box needs to be in memory only during the time a user interacts with it.
To create a form at a different stage during execution using the IDE, you:
  1. Select the File|New Form from the main menu to display the new form.
  2. Remove the form from the Auto-create forms list of the Project|Options|Forms page.
    This removes the form’s invocation. As an alternative, you can manually remove the following line from program’s main entry point:
    Application.CreateForm(TResultsForm, ResultsForm);
  3. Invoke the form when desired by using the form’s Show method, if the form is modeless, or ShowModal method, if the form is modal.
An event handler for the main form must create an instance of the result form and destroy it. One way to invoke the result form is to use the global variable as follows. Note that ResultsForm is a modal form so the handler uses the ShowModal method.

Código Delphi [-]
procedure TMainForm.Button1Click(Sender: TObject);
begin
ResultsForm:=TResultForm.Create(self);
try
  ResultsForm.ShowModal;
finally
  ResultsForm.Free;
end;
In the above example, note the use of try..finally. Putting in the line ResultsForm.Free; in the finally clause ensures that the memory for the form is freed even if the form raises an exception.
The event handler in the example deletes the form after it is closed, so the form would need to be recreated if you needed to use ResultsForm elsewhere in the application. If the form were displayed using Show you could not delete the form within the event handler because Show returns while the form is still open.

Note: If you create a form using its constructor, be sure to check that the form is not in the Auto-create forms list on the Project Options|Forms page. Specifically, if you create the new form without deleting the form of the same name from the list, Delphi creates the form at startup and this event-handler creates a new instance of the form, overwriting the reference to the auto-created instance. The auto-created instance still exists, but the application can no longer access it. After the event-handler terminates, the global variable no longer points to a valid form. Any attempt to use the global variable will likely crash the application.


En el caso de que quieras mostrar un formulario con ShowModal puedes envolver todo en un try..finally
En el caso de mostrarlo con Show no debes hacerlo porque estarías eliminándolo inmediatamente después de crearlo.
En ese caso debes crearlo y dejar que el formulario en su evento OnClose establezca la acción caFree;

Código Delphi [-]
procedure TFormulario.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  inherited;
  Action := caFree;
end;
Responder Con Cita
  #11  
Antiguo 26-03-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Con respecto al log te sugiero ir a lo más simple:

En el DataModule principal o en una unidad compartida por toda la aplicación creas una función que guarde en un fichero lo que le envíes.
Yo lo tengo así en un DataModule principal. Te crea un fichero .log con el mismo nombre que la aplicación.
Código Delphi [-]
procedure TDMMain.Log(s: string);
{$IFDEF Debug}
var
  F : TextFile;
  FileName : string;
{$ENDIF}
begin
  {$IFDEF Debug}
  FileName := ChangeFileExt(Application.ExeName, '.log');
  AssignFile(F, FileName);
  try
     Append(F);
  except
     try
        Rewrite(F);
     except
        on e: Exception do
           ShowMessage('Error al abrir fichero : ' + FileName + #13#10 + e.Message);
     end;
  end;
  WriteLn(F, FormatDatetime('[yyyy-mm-dd hh:nn:ss.zzz] ', Now) + s);
  CloseFile(F);
  {$ENDIF}
end;

Luego en los formularios, en cualquier sitio puedes poner cosas como estas:
Código Delphi [-]
procedure TFMPrincipal.FormCreate(Sender: TObject);
begin
  inherited;
  DMMain.Log('FormCreate - ' + Self.Name);
end;
Código Delphi [-]
procedure TFMPrincipal.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  inherited;
  Action = caFree;
  DMMain.Log('FormClose - ' + Self.Name);
end;
Código Delphi [-]
procedure TFMain.AArticulosExecute(Sender: TObject);
begin
  DMMain.Log('Accion - Abrir formulario de articulos');
  [...]
end;
Responder Con Cita
  #12  
Antiguo 27-03-2023
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Creo que aquí hay muchas cosas además de la velocidad.
¿Datos médicos?
Las normativas de protección de datos son muy estrictas con ellos. Te recomendaría ver que pide la comunidad europea o el ENS en esos casos, si hablamos de empresas españolas.

Para empezar tener juntos datos de diferentes empresas es un error. Seguro. Deben estar contenidas físicamente en diferentes lugares aunque lógicamente tengan la misma estructura.
No he usado SQL server a ese nivel, pero en Oracle definirías distintos tablespace para cada empresa, usuario o lo que decidas.

Yo no soy partidaria de cargarlo todo de una vez mi experiencia me ha demostrado que rara vez desean ver todo, todo pero todo, aunque solo sea porque es humanamente imposible hacerlo.
Además si hablas de tablas muy grandes (muchos campos) con datos pesados (imágenes, documentos adjuntos) lo mejor es hacer la carga por secciones, según lo necesites en cada pestaña o en un proceso en segundo plano que recupere la información poco a poco sin que ello dificulte el trabajo del usuario y los elementos más pesados que tenga que abrirlos el propio usuario (no la aplicación de forma automática).

Las posibilidades son muchas y un buen análisis previo te ahorrará trabajo después.
Responder Con Cita
  #13  
Antiguo 27-03-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
Con respecto al log te sugiero ir a lo más simple:

En el DataModule principal o en una unidad compartida por toda la aplicación creas una función que guarde en un fichero lo que le envíes.
Yo lo tengo así en un DataModule principal. Te crea un fichero .log con el mismo nombre que la aplicación.
Código Delphi [-]
procedure TDMMain.Log(s: string);
{$IFDEF Debug}
var
  F : TextFile;
  FileName : string;
{$ENDIF}
begin
  {$IFDEF Debug}
  FileName := ChangeFileExt(Application.ExeName, '.log');
  AssignFile(F, FileName);
  try
     Append(F);
  except
     try
        Rewrite(F);
     except
        on e: Exception do
           ShowMessage('Error al abrir fichero : ' + FileName + #13#10 + e.Message);
     end;
  end;
  WriteLn(F, FormatDatetime('[yyyy-mm-dd hh:nn:ss.zzz] ', Now) + s);
  CloseFile(F);
  {$ENDIF}
end;

Luego en los formularios, en cualquier sitio puedes poner cosas como estas:
Código Delphi [-]
procedure TFMPrincipal.FormCreate(Sender: TObject);
begin
  inherited;
  DMMain.Log('FormCreate - ' + Self.Name);
end;
Código Delphi [-]
procedure TFMPrincipal.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  inherited;
  Action = caFree;
  DMMain.Log('FormClose - ' + Self.Name);
end;
Código Delphi [-]
procedure TFMain.AArticulosExecute(Sender: TObject);
begin
  DMMain.Log('Accion - Abrir formulario de articulos');
  [...]
end;
amigo no logro entender que estoy haciendo mal tengo un form llamado login a la cual usuario y contraseña y entro en el from principal sin ningun problema:
Código Delphi [-]
FormInicio := TFormInicio.Create(Application);
                      Self.Free;
                      FormInicio.ShowModal;
ok luego de eso tengo diferente from que debo abrir segun la opcion selecionada (Button)
Entonces el siguiente from que abro lo abro sin singun problema:
Código Delphi [-]
FormMedico := TFormMedico.Create(Self);
    try
    FormMedico.ShowModal;
    finally
    FormMedico.Free;
    end;
oh continuo: en este fron tengo un botton que al presionarlo deberia abrir otro from donde me muestra una pantalla de busqueda ect. y alli tengo problema ya que me da access violation.
Código Delphi [-]
begin
  FormBuscarMedico:=TFormBuscarMedico.Create(self);
  try
  FormBuscarMedico.ShowModal;
  finally
  FormBuscarMedico.Free;
end;

end;
y alli finalemente se me tranco el juego ahora tambien nunca pude colocar
Código Delphi [-]
Action = caFree;
en el Evento onclose ya que me dice que CaFree no esta declarado.
Responder Con Cita
  #14  
Antiguo 29-03-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Cita:
oh continuo: en este fron tengo un botton que al presionarlo deberia abrir otro from donde me muestra una pantalla de busqueda ect. y alli tengo problema ya que me da access violation.
¿En qué punto exactamente?
Pon tu código real para poder ver qué estás haciendo.
Un "Access Violation" suele ser una llamada a un objeto que no está creado. Seguramente estás liberanto antes de tiempo un objeto o lo estás utilizando antes de crearlo.

Cita:
y alli finalemente se me tranco el juego ahora tambien nunca pude colocar
Lo mismo de antes... pon tu código real ya que caFree es un tipo definido en los formularios en la unidad Forms.

Código Delphi [-]
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  inherited;
  Action := caFree;
end;

De la ayuda de Delphi 6:

Cita:
TCustomForm.OnClose
Occurs when the form closes.

type
TCloseAction = (caNone, caHide, caFree, caMinimize);

TCloseEvent = procedure(Sender: TObject; var Action: TCloseAction) of object;

property OnClose: TCloseEvent;

Description

Use OnClose to perform special processing when the form closes. The OnClose event specifies which event handler to call when a form is about to close. The handler specified by OnClose might, for example, test to make sure all fields in a data-entry form have valid contents before allowing the form to close.

A form is closed by the Close method or when the user chooses Close from the form's system menu.

The TCloseEvent type points to a method that handles the closing of a form. The value of the Action parameter determines if the form actually closes. These are the possible values of Action:

Value Meaning

caNone The form is not allowed to close, so nothing happens.
caHide The form is not closed, but just hidden. Your application can still access a hidden form.
caFree The form is closed and all allocated memory for the form is freed.
caMinimize The form is minimized, rather than closed. This is the default action for MDI child forms.

If a form is an MDI child form, and its BorderIcons property is biMinimize, then the default Action is caMinimize. If a MDI child form does not have these settings, the default Action is caNone, meaning that nothing happens when the user attempts to close the form.

If a form is an SDI child form, Action defaults to caHide.

To close the form and free it in an OnClose event, set Action to caFree.

Note: When the application shuts down, the main form receives an OnClose event, but any child forms do not receive the OnClose event.
Responder Con Cita
  #15  
Antiguo 29-03-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
¿En qué punto exactamente?
Pon tu código real para poder ver qué estás haciendo.
Un "Access Violation" suele ser una llamada a un objeto que no está creado. Seguramente estás liberanto antes de tiempo un objeto o lo estás utilizando antes de crearlo.


Lo mismo de antes... pon tu código real ya que caFree es un tipo definido en los formularios en la unidad Forms.

Código Delphi [-]
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  inherited;
  Action := caFree;
end;

De la ayuda de Delphi 6:
Ya se quito el error en Action:=caFree;
Código Delphi [-]
procedure TFormPacienteNew.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  inherited;
  Action := caFree;
  end;
el error se quito cuando coloque esta linea en Type
Código Delphi [-]
type
  TCloseAction = (caNone, caHide, caFree, caMinimize);  //<--esta linea quito el error
  TFormPacienteNew = class(TForm)
    Layout17: TLayout;
    Label153: TLabel;
    TMSFMXEdit13: TTMSFMXEdit;
    ShadowEffect244: TShadowEffect;
    Label154: TLabel;
    TMSFMXEdit14: TTMSFMXEdit;
    ShadowEffect258: TShadowEffect;
    Label156: TLabel;
    TMSFMXEdit15: TTMSFMXEdit;
    ShadowEffect262: TShadowEffect;
    Label158: TLabel;
    Label159: TLabel;
    TMSFMXEdit16: TTMSFMXEdit;
    ShadowEffect265: TShadowEffect;
    Label160: TLabel;
    Label161: TLabel;
    Label177: TLabel;
    Label192: TLabel;
    TMSFMXEdit17: TTMSFMXEdit;
pero ahora cuando cierro la ventada
Código Delphi [-]
procedure TFormPacienteNew.TMSFNCButton1Click(Sender: TObject);
begin
FormPacienteNew.Close;
end;
me sale un Mensaje 'Invalid Piont operation' y otro que dice 'Invalid Argument'
los formulario se abren asi:
Código Delphi [-]
procedure TFormInicio.TMSFMXToolBarButton2Click(Sender: TObject);
begin
FormPacienteNew := TFormPacienteNew.Create(Self);
    try
    FormPacienteNew.ShowModal;
    finally
    FormPacienteNew.Free;
    end;
end;
Responder Con Cita
  #16  
Antiguo 29-03-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Dentro de un formulario no tienes que llamarlo por su nombre...

Código Delphi [-]
procedure TFormPacienteNew.TMSFNCButton1Click(Sender: TObject);
begin
   // Close hace referencia a si mismo
   // No importa como se llame la variable que apunta al objeto
   Close;
end;

Luego puedes tener dos ventanas de ese tipo y que cada una se cierre a si misma.


Código Delphi [-]
procedure TFormPacienteNew.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  inherited;
  // No necesitaré liberar este objeto, porque FormClose ya lo hará.
  Action := caFree;
end;

[...]

begin
    // Creo dos ventanas de "paciente nuevo"
    PacienteNew1 := TFormPacienteNew.Create(Self);
    PacienteNew2 := TFormPacienteNew.Create(Self);

    // Muestra la primera ventana
    PacienteNew1.Show;

    // Muestra la otra ventana
    PacienteNew2.Show;
end;
Responder Con Cita
  #17  
Antiguo 29-03-2023
giantonti1801 giantonti1801 is offline
Miembro
 
Registrado: oct 2022
Posts: 143
Poder: 2
giantonti1801 Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
Dentro de un formulario no tienes que llamarlo por su nombre...

Código Delphi [-]
procedure TFormPacienteNew.TMSFNCButton1Click(Sender: TObject);
begin
   // Close hace referencia a si mismo
   // No importa como se llame la variable que apunta al objeto
   Close;
end;

Luego puedes tener dos ventanas de ese tipo y que cada una se cierre a si misma.


Código Delphi [-]
procedure TFormPacienteNew.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  inherited;
  // No necesitaré liberar este objeto, porque FormClose ya lo hará.
  Action := caFree;
end;

[...]

begin
    // Creo dos ventanas de "paciente nuevo"
    PacienteNew1 := TFormPacienteNew.Create(Self);
    PacienteNew2 := TFormPacienteNew.Create(Self);

    // Muestra la primera ventana
    PacienteNew1.Show;

    // Muestra la otra ventana
    PacienteNew2.Show;
end;
Si funciona pero si le coloco en el evento on close Action := caFree; despues que se cierra el formulario me da el error de Invalid argument por lo que decidi quitarlo y funciona perfecto.
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
Cual es la mejor opción de conexión a Bases de Datos en Lazarus para ... ? rolandoj Lazarus, FreePascal, Kylix, etc. 20 24-09-2012 01:44:57
Cual es el mejor manejador gratis de base de datos para MySQl 5.0+ ? juangabriel1786 SQL 3 15-12-2008 00:10:29
Cual es la mejor opcion para un sistema de esta clase... jcarteagaf Varios 10 24-09-2008 23:57:51
Sobre cuál es la mejor opción para trabajar con Word Gabo Servers 6 16-01-2008 13:36:21
Cual es la mejor opción para imprimir ?? Delphitest Impresión 4 27-10-2006 21:50:59


La franja horaria es GMT +2. Ahora son las 10:19:10.


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