Ir al contenido


Foto

Cambiar color de fondo de un SaveDialog


  • Por favor identifícate para responder
5 respuestas en este tema

#1 ricar2

ricar2

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 18 septiembre 2013 - 03:31

Necesito cambiar el color de fondo de un SaveDialog pues he cambiado el color de toda mi aplicacion
  • 0

#2 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 19 septiembre 2013 - 09:33

Es imposible hacerlo desde Delphi..., por que no es un diálogo de Delphi, sino de la API de Winbugs. Así que si tu Windows tiene un conjunto de colores que semeje a los de tu aplicación, tienes el problema resuelto; en caso contrario, ni modo, a apechugar...
  • 0

#3 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 20 septiembre 2013 - 06:17

TiammatMX siendo desautorizarte... si que se puede, creo... pero es algo complicado.

Todos los objetos -windows- que componen los dialogs estandar de windows están "marcados", es decir, se puede recuperar un handler a cada uno de los sub-objetos dentro del dialog y enviarles mensajes para que desaparezcan.

Aquí dejo un código que uso algunas veces para esconder el tipo de fichero de un TOpenDialog para hacer un "TCustomOpenDirDialog"  (h), muestra la tecnica y en los comentarios da pistas de donde buscar más información.

Lo que no sé a ciencia cierta es si el color de fondo estará o no accesible, supongo que es color del propio form... es cuestión de hacer pruebas.



delphi
  1. //
  2. ***********************
  3. //** Chose a directory **
  4. //**  uses Messages  **
  5. //***********************
  6.  
  7.   //General usage here:
  8.   //  [url=http://www.delphipages.com/forum/showthread.php?p=185734]http://www.delphipages.com/forum/showthread.php?p=185734[/url]
  9.  
  10.   //Need a class to hold a procedure to be called by Dialog.OnShow:
  11.   type TOpenDir = class(TObject)
  12.   public
  13.     Dialog: TOpenDialog;
  14.     procedure HideControls(Sender: TObject);
  15.   end;
  16.   //This procedure hides de combo box of file types...
  17.   procedure TOpenDir.HideControls(Sender: TObject);
  18.   const
  19.     //CDM_HIDECONTROL and CDM_SETCONTROLTEXT values from:
  20.     //  doc.ddart.net/msdn/header/include/commdlg.h.html
  21.     //  CMD_HIDECONTROL = CMD_FIRST + 5 = (WM_USER + 100) + 5;
  22.     //Usage of CDM_HIDECONTROL and CDM_SETCONTROLTEXT here:
  23.     //  msdn.microsoft.com/en-us/library/ms646853%28VS.85%29.aspx
  24.     //  msdn.microsoft.com/en-us/library/ms646855%28VS.85%29.aspx
  25.     CDM_HIDECONTROL =    WM_USER + 100 + 5;
  26.     CDM_SETCONTROLTEXT = WM_USER + 100 + 4;
  27.     //Component IDs from:
  28.     //  msdn.microsoft.com/en-us/library/ms646960%28VS.85%29.aspx#_win32_Open_and_Save_As_Dialog_Box_Customization
  29.     //Translation into exadecimal in dlgs.h:
  30.     //  [url=http://www.koders.com/c/fidCD2C946367FEE401460B8A91A3DB62F7D9CE3244.aspx]www.koders.com/c/fidCD2C946367FEE401460B8A91A3DB62F7D9CE3244.aspx[/url]
  31.     //
  32.     //File type filter...
  33.     cmb1: integer  = $470; //Combo box with list of file type filters
  34.     stc2: integer  = $441; //Label of the file type
  35.     //File name const...
  36.     cmb13: integer = $47c; //Combo box with name of the current file
  37.     edt1: integer  = $480; //Edit with the name of the current file
  38.     stc3: integer  = $442; //Label of the file name combo
  39.   var H: THandle;
  40.   begin
  41.     H:= GetParent(Dialog.Handle);
  42.     //Hide file types combo...
  43.     SendMessage(H, CDM_HIDECONTROL, cmb1,  0);
  44.     SendMessage(H, CDM_HIDECONTROL, stc2,  0);
  45.     //Hide file name label, edit and combo...
  46.     SendMessage(H, CDM_HIDECONTROL, cmb13, 0);
  47.     SendMessage(H, CDM_HIDECONTROL, edt1,  0);
  48.     SendMessage(H, CDM_HIDECONTROL, stc3,  0);
  49.     //NOTE: How to change label text (the lentgh is not auto):
  50.     //SendMessage(H, CDM_SETCONTROLTEXT, stc3, DWORD(pChar('Carpeta')));
  51.   end;
  52.  
  53. //Call it when you need the user to chose a folder for you...
  54. function GimmeDir(var Dir: string): boolean;
  55. var
  56.   OpenDialog: TOpenDialog;
  57.   OpenDir: TOpenDir;
  58. begin
  59.   //The standard dialog...
  60.   OpenDialog:= TOpenDialog.Create(nil);
  61.   //Objetc that holds the OnShow code to hide controls
  62.   OpenDir:= TOpenDir.create;
  63.   try
  64.     //Conect both components...
  65.     OpenDir.Dialog:= OpenDialog;
  66.     OpenDialog.OnShow:= OpenDir.HideControls;
  67.     //Configure it so only folders are shown (and file without extension!)...
  68.     OpenDialog.FileName:= '*.';
  69.     OpenDialog.Filter:=  '*.';
  70.     OpenDialog.Title:=    'Elija una carpeta';
  71.     //No need to check file existis!
  72.     OpenDialog.Options:= OpenDialog.Options + [ofNoValidate];
  73.     //Initial folder...
  74.     OpenDialog.InitialDir:= Dir;
  75.     //Ask user...
  76.     if OpenDialog.Execute then begin
  77.       Dir:= ExtractFilePath(OpenDialog.FileName);
  78.       result:= true;
  79.     end else begin
  80.       result:= false;
  81.     end;
  82.   finally
  83.     //Clean up...
  84.     OpenDir.Free;
  85.     OpenDialog.Free;
  86.   end;
  87. end;


  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.301 mensajes
  • LocationArgentina

Escrito 20 septiembre 2013 - 06:53

Bueno... el realidad Felipe no está del todo errado. Delphi si delega este trabajo a la API. Más aún se vale de una funcion que si no recuerdo mal se llama CreateCustomFromDialog o algo por el estilo, y ésta internamente trabaja con la API de Windows para generar el cuadro de diálogo.

Creo que lo más fácil es directamente definir un form propio on el color y hacer de este form el típico SaveDialog. Vamos, que no es más que disponer de los controles en un form... la "técnica del pobre" diríamos.

La otra posibilidad es investigar mejor como es el trabajo sucio que hace Delphi internamente para generar estos forms. Creo que es posible interceptar tal creación y cambiar el color al momento de visualizarlo.

Saludos,
  • 0

#5 TiammatMX

TiammatMX

    Advanced Member

  • Miembros
  • PipPipPip
  • 1.750 mensajes
  • LocationUniverso Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Ciudad de México\Xochimilco\San Gregorio Atlapulco\Home

Escrito 20 septiembre 2013 - 09:47

TiammatMX siendo desautorizarte...

: : : (li) (li) (li) *-) *-) *-)  jajajajajajaja

...en realidad Felipe no está del todo errado...

Delphius sí me entiende. Mi autoestima subió dos puntos...  :D :D ;)
  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 20 septiembre 2013 - 10:41

Delphius sí me entiende. Mi autoestima subió dos puntos...  :D :D ;)


Ustedes la que no ganan la empatan ....  continúan invictos.  :D :D :D

Hablando en plata blanca, todo lo que hace Delphi para interactuar con windows lo hace por intermedio de la API de windows, solo que unas cosas son más "transparentes y elaboradas" que otras, técnicamente nada impide trabajar con la API a muy bajo nivel, por lo tanto cambiar el color del fondo del diálogo por supuesto que se puede, de hecho existen varias librearías para cambiar la cara completa a la aplicación. Si aparecen los maestros de la API Escafandra o Seoane nos dirían como hacerlo.

Un cordial saludo.

  • 0




IP.Board spam blocked by CleanTalk.