Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cambiar caption a los botones de OpenDialog1 (https://www.clubdelphi.com/foros/showthread.php?t=75553)

Ledian_Fdez 01-09-2011 17:53:46

Cambiar caption a los botones de OpenDialog1
 
Hola amigos tengo un OpenDialog1 que lo utilizo en dependencia la acción a realizar tanto para guardar un archivo como para abrirlo, lo cierto es que no se como podría cambiarle el caption de los botones en dependencia al uso que le valla a dar.


Mil grasias de antemano,
Salu2

ecfisa 01-09-2011 18:59:01

Hola Ledian_Fdez.

Código Delphi [-]
...
procedure TForm1.OpenDialog1Show(Sender: TObject);
begin
  if TOpenDialog(Sender).Tag = 1 then
    SetDlgItemText(GetParent(OpenDialog1.Handle), IDOK, PChar('&Abrirlo'))
  else
    SetDlgItemText(GetParent(OpenDialog1.Handle), IDOK, PChar ('&Guardarlo'));
end;

procedure TForm1.btnAbrirClick(Sender: TObject);
begin
  OpenDialog1.Tag:= 1;
  if OpenDialog1.Execute then
  ...
end;

procedure TForm1.btnGuardarClick(Sender: TObject);
begin
  OpenDialog1.Tag:= 2;
  if OpenDialog1.Execute then
  ...
end;
...

Saludos.

Ledian_Fdez 01-09-2011 19:09:55

Como cambiar el Caption del boton y saber cual ha sido pulsado
 
Hola amigos estoy haciendo este procedimiento para Salvar y/o Restaurar la base de datos.

Tengo 2 interrogantes.

La 1ra: ¿Cómo sustituir el caption del boton Abrir por Guardar del OpendDialog?
La 2da: Como saber cuando me cierran el OpendDialog por el boton Cancelar.

Código Delphi [-]
type TAccion = (Salva, Restaura);

procedure GestionBD(Accion:TAccion);

{
.
.
.
}
procedure GestionBD(Accion:TAccion);
var
 OpenDialog: TOpenDialog;
 Query: TADOQuery;
 SQL, MSG: String;
begin
 try
   OpenDialog := TOpenDialog.Create(nil);
   OpenDialog.FileName := '';
   OpenDialog.DefaultExt := '.slv';
   OpenDialog.Filter := 'Fichero Salva(*.slv)|*.slv';
   OpenDialog.FilterIndex := 1;
   OpenDialog.Initialdir := ExtractFilePath(application.ExeName) ;

   Query := TADOQuery.Create(nil);
   Query.ConnectionString := 'Provider=SQLOLEDB.1;Workstation ID=LEDIAN;User ID=sa;Password=pass';
   Query.SQL.Clear;

   case Accion of
    Salva:    begin
               SQL := 'Backup database DB to disk = :File';
               OpenDialog.Title := 'Guardar Salva.';
               MSG := 'La Salva se realizó satisfactoriamente';
         // Aqui debe ir el código para sustituir el caption del boton Abrir por Guardar ¿Cómo hacerlo? no se.
              end;
    Restaura: begin
               SQL := 'Restore database DB from disk = :File';
               OpenDialog.Title := 'Selecionar Salva para la Restaura.';
               MSG := 'La Restaura se realizó satisfactoriamente';
              end;
   end;

   OpenDialog.Execute;

   if (not(FileExists(OpenDialog.FileName)) and (Accion = Restaura)) then
     begin
      Application.MessageBox('No se encuentra el archivo de Salva','Error al Restaurar', MB_ICONERROR);
      Abort;
     end;
    try
     Query.SQL.Add(SQL);
     Query.Parameters.ParamByName('File').Value := OpenDialog.FileName;
     Query.ExecSQL;
     Application.MessageBox(PChar(MSG),'Información', MB_ICONINFORMATION);
    except
     Application.MessageBox('No se pudo realizar la Operación.','Error', MB_ICONERROR);
    end;
 finally
  OpenDialog.Free;
  Query.Free;
 end;
end;

Mil grasias de antemano.

Chris 01-09-2011 19:14:11

Tu primera interrogante ecfisa ya magistralmente te la contestó. Con respecto a la segunda, la línea "OpenDialog.Execute;" devolverá False si el usuario presionó el botón "Cancelar" o simplemente cerró la ventana con el botón "X" en la parte superior derecha. Por ejemplo:

Código Delphi [-]
    { .. código anterior .. }
    if not OpenDialog.Execute then // el usuario canceló
        exit;

Saludos,
Chris

Ledian_Fdez 01-09-2011 19:45:26

Muchas grasias Chris por tu ayuda, lo hice como me dijo y no hubo problema. En cuanto al codigo de ecfisa:


Código Delphi [-]
procedure TForm1.OpenDialog1Show(Sender: TObject);
begin
  if TOpenDialog(Sender).Tag = 1 then
    SetDlgItemText(GetParent(OpenDialog1.Handle), IDOK, PChar('&Abrirlo'))
  else
    SetDlgItemText(GetParent(OpenDialog1.Handle), IDOK, PChar ('&Guardarlo'));
end;

No tengo el evento OnShow. lo puse en la linea que habia comentado en mi procedimiento y no hace nada. Sigue saliendo el boton con el texto de Abrir.

Código Delphi [-]
case Accion of
    Salva:    begin
               SQL := 'Backup database DB to disk = :File';
               OpenDialog.Title := 'Guardar Salva.';
               MSG := 'La Salva se realizó satisfactoriamente';
               SetDlgItemText(GetParent(OpenDialog.Handle), IDOK, PChar ('&Guardar'));
              end;

En espera de su respuesta,
Muchas grasias por su ayuda .

ecfisa 01-09-2011 19:51:14

Hola Ledian_Fdez.
Cita:

No tengo el evento OnShow.
El evento pertenece al componente TOpenDialog, teniéndolo seleccionado, buscalo en la pestaña Events del Object Inspector.

Un saludo.

Ledian_Fdez 01-09-2011 20:13:11

Hola ecfisa

Cita:

El evento pertenece al componente TOpenDialog, teniéndolo seleccionado, buscalo en la pestaña Events del Object Inspector.
Es que yo no inserte el componente, yo lo cree de esta forma
Código Delphi [-]
OpenDialog := TOpenDialog.Create(nil);

No se como acceder a sus Eventos.

En espera de su ayuda ...

ecfisa 01-09-2011 20:28:32

Hola.

Código Delphi [-]
...
type
  TForm1 = class(TForm)
    btAbrir: TButton;
    procedure btAbrirClick(Sender: TObject);
  private
    procedure OpenDialogShow(Sender: TObject);
  public
  end;
...
implementation

procedure TForm1.OpenDialogShow(Sender: TObject);
begin
  if TOpenDialog(Sender).Tag = 1 then
    SetDlgItemText(GetParent(TOpenDialog(Sender).Handle), IDOK, PChar('&Abrirlo'))
  else
    SetDlgItemText(GetParent(TOpenDialog(Sender).Handle), IDOK, PChar ('&Guardarlo'));
end;

procedure TForm1.btAbrirClick(Sender: TObject);
begin
  with TOpenDialog.Create(nil) do
  try
    OnShow:= OpenDialogShow;  // <- Aqui se asigna el evento
    Tag:= 1;
    if Execute then
    ...
  finally
    Free;
  end;
end;
...

Saludos.

Ledian_Fdez 01-09-2011 22:03:16

Me da el siguiente error:

[Error] Glabal.pas(71): Incompatible types: 'method pointer and regular procedure'

ecfisa 01-09-2011 22:23:37

Cita:

Empezado por Ledian_Fdez (Mensaje 410649)
Me da el siguiente error:

[Error] Glabal.pas(71): Incompatible types: 'method pointer and regular procedure'

Poné el código que estás utilizando y vemos donde estás cometiendo el error.

Un saludo.

Ledian_Fdez 01-09-2011 22:30:31

Código Delphi [-]
procedure OpenDialogShow(Sender: TObject);
begin
  if TOpenDialog(Sender).Tag = 1 then
    SetDlgItemText(GetParent(TOpenDialog(Sender).Handle), IDOK, PChar('&Abrirlo'))
  else
    SetDlgItemText(GetParent(TOpenDialog(Sender).Handle), IDOK, PChar ('&Guardarlo'));
end;
//------------------------------------------------------------------------------

procedure GestionBD(Accion:TAccion);
var
 OpenDialog: TOpenDialog;
 Query: TADOQuery;
 SQL, MSG: String;
begin
 try
//   OpenDialog := TOpenDialog.Create(nil);
   with TOpenDialog.Create(nil) do
    begin
    OnShow:= OpenDialogShow;  // <- Aqui se asigna el evento
    Tag:= 1;
{...}

[Error] Glabal.pas(71): Incompatible types: 'method pointer and regular procedure'

ecfisa 01-09-2011 22:41:32

Hola.

Fijate que el ejemplo que te puse más arriba dice:
Código Delphi [-]
type
  TForm1 = class(TForm)
    btAbrir: TButton;
    procedure btAbrirClick(Sender: TObject);
  private
    procedure OpenDialogShow(Sender: TObject);
  public
  end;
Donde se vé claramente que el procedimiento OpenDialogShow es un método de la clase TForm1.

En el código que pusiste, OpenDialogShow está declarado como un procedimiento regular y eso es lo que te marca el error.

La declaración de la cabecera del procedimiento debería ser:
Código Delphi [-]
procedure TNombre_de_tu_form.OpenDialogShow(Sender: TObject);

Te adjunto una muestra probada y funcionando para que puedas ver con tranquilidad como implementarlo.

Un saludo

Ledian_Fdez 02-09-2011 13:22:35

Es que estoy implementado ese procedimiento en una Unit Global, no es un formulario, es una Unit donde tengo almacenado varias funciones y procedimiento generales, para luego usuarlas en cualquier proyecto.

Código Delphi [-]
unit Global;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, Menus, ExtCtrls, DB, ADODB, DateUtils;

type TAccion = (Salva, Restaura);

procedure GestionBD(Accion:TAccion);
procedure OpenDialogShow(Sender: TObject);

Luego agrego la unit al Uses de donde lo valla usar y llamo al procedimiento y/o funciones.

Código Delphi [-]
GestionBD(Salva);

Dentro de GestionBD es donde creo el OpenDialog, le cambio sus propiedades y es donde quisiera cambiarle en dependencia de la Accion el texto del boton:

Si es Salva, cambiar el texto del boton a guardar.
Si es Restaura, cambiar el texto del boton a abrir.

No se si me hice entender.

Salu2
Ledian.

ecfisa 02-09-2011 13:45:17

Hola.

Creo que la cosa pasa por implementar tus rutinas como métodos de una clase.

Basándome en el código que pusiste, sería algo como:
Código Delphi [-]
unit uRutGlobal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, Menus, ExtCtrls, DateUtils;

type
  TAccion = (Salva, Restaura);
  TRutinasGlobales = class(TObject)
  private
    procedure OpenDialogShow(Sender: TObject);
    ...
  public
    ...
    procedure GestionDB(Accion: TAccion);
  end;

var
  RutGlob: TRutinasGlobales;

implementation

procedure TRutinasGlobales.OpenDialogShow(Sender: TObject);
begin
  if TOpenDialog(Sender).Tag = 1 then
    SetDlgItemText(GetParent(TOpenDialog(Sender).Handle), IDOK, PChar('&Abrirlo'))
  else
    SetDlgItemText(GetParent(TOpenDialog(Sender).Handle), IDOK, PChar ('&Guardarlo'));
end;

procedure TRutinasGlobales.GestionDB(Accion: TAccion);
begin
  with TOpenDialog.Create(nil) do
  try
    OnShow:= OpenDialogShow;
    Tag:= Integer(Accion);
    if Execute then

  finally
    Free;
  end;
end;
...

Y como ejemplo de llamada:
Código Delphi [-]
....
uses uRutGlobal;

procedure TForm1.Button1Click(Sender: TObject);
begin
  RutGlob.GestionDB(Salva);
end;

Saludos.

escafandra 02-09-2011 14:47:53

También podría hacerlo como lo hace pero llamando a la función desde el evento OnShow:

Código Delphi [-]
procedure OpenDialogShow(var Sender: TObject);
begin
  if TOpenDialog(Sender).Tag = 1 then
    SetDlgItemText(GetParent(TOpenDialog(Sender).Handle), IDOK, PChar('&Abrirlo'))
  else
    SetDlgItemText(GetParent(TOpenDialog(Sender).Handle), IDOK, PChar ('&Guardarlo'));
end;


procedure TForm1.OpenDialog1Show(Sender: TObject);
begin
  OpenDialogShow(Sender);
end;


Y mantiene su filosofía de unidades de código...

Saludos.

ecfisa 02-09-2011 14:56:04

Hola.
Cita:

También podría hacerlo como lo hace pero llamando a la función desde el evento OnShow
Si, esa también es una opción válida.

Un saludo.:)

ariefez 03-09-2011 17:48:11

También puedes implementar una rutina de clase

Código Delphi [-]
...

  // Rutinas de la unidad global

  Rutinas = class

  public

    class procedure OpenDialogShow(var Sender: TObject);

  end;

...


class procedure Rutinas.OpenDialogShow(Sender: TObject);
begin
  if TOpenDialog(Sender).Tag = 1 then
    SetDlgItemText(GetParent(TOpenDialog(Sender).Handle), IDOK, PChar('&Abrirlo'))
  else
    SetDlgItemText(GetParent(TOpenDialog(Sender).Handle), IDOK, PChar ('&Guardarlo'));
end;

// Asigna el evento al componente TOpenDialog

...

  with TOpenDialog.Create(nil) do
  try
    OnShow:= Rutinas.OpenDialogShow;
    Tag:= Integer(Accion);
    if Execute then
      ...
  finally
    Free;
  end;

...


La franja horaria es GMT +2. Ahora son las 00:31:26.

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