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

Cambiar color de fondo de un SaveDialog
Comenzado por
ricar2
, sep 18 2013 03:31
5 respuestas en este tema
#1
Escrito 18 septiembre 2013 - 03:31
#2
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...
#3
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"
, 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.
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"

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
// *********************** //** Chose a directory ** //** uses Messages ** //*********************** //General usage here: // [url=http://www.delphipages.com/forum/showthread.php?p=185734]http://www.delphipages.com/forum/showthread.php?p=185734[/url] //Need a class to hold a procedure to be called by Dialog.OnShow: type TOpenDir = class(TObject) public Dialog: TOpenDialog; procedure HideControls(Sender: TObject); end; //This procedure hides de combo box of file types... procedure TOpenDir.HideControls(Sender: TObject); const //CDM_HIDECONTROL and CDM_SETCONTROLTEXT values from: // doc.ddart.net/msdn/header/include/commdlg.h.html // CMD_HIDECONTROL = CMD_FIRST + 5 = (WM_USER + 100) + 5; //Usage of CDM_HIDECONTROL and CDM_SETCONTROLTEXT here: // msdn.microsoft.com/en-us/library/ms646853%28VS.85%29.aspx // msdn.microsoft.com/en-us/library/ms646855%28VS.85%29.aspx CDM_HIDECONTROL = WM_USER + 100 + 5; CDM_SETCONTROLTEXT = WM_USER + 100 + 4; //Component IDs from: // msdn.microsoft.com/en-us/library/ms646960%28VS.85%29.aspx#_win32_Open_and_Save_As_Dialog_Box_Customization //Translation into exadecimal in dlgs.h: // [url=http://www.koders.com/c/fidCD2C946367FEE401460B8A91A3DB62F7D9CE3244.aspx]www.koders.com/c/fidCD2C946367FEE401460B8A91A3DB62F7D9CE3244.aspx[/url] // //File type filter... cmb1: integer = $470; //Combo box with list of file type filters stc2: integer = $441; //Label of the file type //File name const... cmb13: integer = $47c; //Combo box with name of the current file edt1: integer = $480; //Edit with the name of the current file stc3: integer = $442; //Label of the file name combo var H: THandle; begin H:= GetParent(Dialog.Handle); //Hide file types combo... SendMessage(H, CDM_HIDECONTROL, cmb1, 0); SendMessage(H, CDM_HIDECONTROL, stc2, 0); //Hide file name label, edit and combo... SendMessage(H, CDM_HIDECONTROL, cmb13, 0); SendMessage(H, CDM_HIDECONTROL, edt1, 0); SendMessage(H, CDM_HIDECONTROL, stc3, 0); //NOTE: How to change label text (the lentgh is not auto): //SendMessage(H, CDM_SETCONTROLTEXT, stc3, DWORD(pChar('Carpeta'))); end; //Call it when you need the user to chose a folder for you... function GimmeDir(var Dir: string): boolean; var OpenDialog: TOpenDialog; OpenDir: TOpenDir; begin //The standard dialog... OpenDialog:= TOpenDialog.Create(nil); //Objetc that holds the OnShow code to hide controls OpenDir:= TOpenDir.create; try //Conect both components... OpenDir.Dialog:= OpenDialog; OpenDialog.OnShow:= OpenDir.HideControls; //Configure it so only folders are shown (and file without extension!)... OpenDialog.FileName:= '*.'; OpenDialog.Filter:= '*.'; OpenDialog.Title:= 'Elija una carpeta'; //No need to check file existis! OpenDialog.Options:= OpenDialog.Options + [ofNoValidate]; //Initial folder... OpenDialog.InitialDir:= Dir; //Ask user... if OpenDialog.Execute then begin Dir:= ExtractFilePath(OpenDialog.FileName); result:= true; end else begin result:= false; end; finally //Clean up... OpenDir.Free; OpenDialog.Free; end; end;
#4
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,
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,
#5
Escrito 20 septiembre 2013 - 09:47
TiammatMX siendo desautorizarte...









Delphius sí me entiende. Mi autoestima subió dos puntos......en realidad Felipe no está del todo errado...



#6
Escrito 20 septiembre 2013 - 10:41
Delphius sí me entiende. Mi autoestima subió dos puntos...
![]()
![]()
Ustedes la que no ganan la empatan .... continúan invictos.



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.