Buttonbar en una posición fija
Posted: Mon Jan 11, 2010 4:33 am
Llevo 3 días peleando con el código, por poner una Buttonbar en una posición fija, dentro de un dialogo con un control RichEdit, la buttonbar se carga desde la clausula ON INIT; el código de la función que carga la ButtonBar es este:
Como veran son 14 elementos, pero no se porque causa se crea una buttonbar solo con los 12 primeros y deja afuera al Combobox y al Get del final. Esto luego provoca un error al cargar los controles de la ButtonBar al abrirse el dialogo.
Pero usando el mismo código con una Buttonbar fija, todo funciona bien (se crea una buttonbar con 14 elementos); pero necesito que la ButtonBar no este en las posiciones convencionales, sino en una posición fija en medio del dialogo.
Revisando el código de creación de la clase, cuando la ButtonBar es fija, se usa el metodo constructor New() y cuando va en una posición fija es NewAt(); pero no encuentro porque no funcionan de la misma forma.
Saludos
Fernando Espinoza
Code: Select all | Expand
STATIC FUNCTION CargaBarra(oDlg)
LOCAL oBar, oCursor, hDC, aFonts, oClp, oBold, oItalic, oUnderline, oItem, cFont, oSize, nSize:=10
hDC := GetDC( oDlg:hWnd )
aFonts := ASort( GetFontNames( hDC ) )
ReleaseDC( oDlg:hWnd, hDC )
DEFINE CURSOR oCursor HAND
DEFINE CLIPBOARD oClp OF oDlg FORMAT TEXT
* Controles de la ButtonBar
@ 150,260 BUTTONBAR oBar OF oDlg 3DLOOK SIZE 480,27 BUTTONSIZE 24,24 FLOAT
// 1
DEFINE BUTTON RESOURCE "Cut" OF oBar MESSAGE "Cortar" NOBORDER ;
WHEN ( ! Empty( oRtf:GetSel() ) .and. ! oRtf:lReadOnly ) ACTION ( oRtf:Cut(), oRtf:SetFocus() ) ;
TOOLTIP "Cierra archivo abierto" TRANSPARENT CENTER
// 2
DEFINE BUTTON RESOURCE "Copy" OF oBar MESSAGE "Copiar" NOBORDER ;
WHEN ( ! Empty( oRtf:GetSel() ) ) ACTION ( oRtf:Copy(), oRtf:SetFocus() ) ;
TOOLTIP "Copiar" TRANSPARENT CENTER
// 3
DEFINE BUTTON RESOURCE "Paste" OF oBar MESSAGE "Pegar" NOBORDER ;
WHEN ( ! Empty( oClp:GetText() ) .and. ! oRtf:lReadOnly ) ACTION ( oRtf:Paste(), oRtf:SetFocus() ) ;
TOOLTIP "Pegar" TRANSPARENT CENTER
// 4
DEFINE BUTTON RESOURCE "Undo" OF oBar MESSAGE "Deshacer" NOBORDER ;
WHEN ( oRtf:SendMsg( EM_CANUNDO ) != 0 ) ACTION ( oRtf:Undo(), oRtf:SetFocus() ) ;
TOOLTIP "Deshacer" TRANSPARENT CENTER
// 5
DEFINE BUTTON RESOURCE "Redo" OF oBar MESSAGE "Rehacer" NOBORDER ;
WHEN ( oRtf:SendMsg( EM_CANREDO ) != 0 ) ACTION ( oRtf:Redo(), oRtf:SetFocus() ) ;
TOOLTIP "Rehacer" TRANSPARENT CENTER
// 6
DEFINE BUTTON oBold RESOURCE "Bold" OF oBar MESSAGE "Negrita" NOBORDER ;
ACTION ( lBold := !lBold, oBold:lPressed := lBold, oBold:Refresh(), ;
oRtf:SetBold( lBold ), oRtf:SetFocus() ) ;
TOOLTIP "Negrita" TRANSPARENT CENTER
// 7
DEFINE BUTTON oItalic RESOURCE "Italic" OF oBar MESSAGE "Italica" NOBORDER ;
ACTION ( lItalic := !lItalic, oItalic:lPressed := lItalic, oItalic:Refresh(), ;
oRtf:SetItalic( lItalic ), oRtf:SetFocus() ) ;
TOOLTIP "Italica" TRANSPARENT CENTER
// 8
DEFINE BUTTON oUnderline RESOURCE "Underline" OF oBar MESSAGE "Subrayado" NOBORDER ;
ACTION ( lUnderline := !lUnderline, oUnderline:lPressed := lUnderline, oUnderline:Refresh(), ;
oRtf:SetUnderline( lUnderline ), oRtf:SetFocus() ) ;
TOOLTIP "Subrayado" TRANSPARENT CENTER
// 9
DEFINE BUTTON RESOURCE "Left" OF oBar MESSAGE "Alinea a la izquierda" NOBORDER ;
ACTION ( oRtf:SetAlign( PFA_LEFT ), oRtf:SetFocus() ) ;
TOOLTIP "Alinea a la izquierda" TRANSPARENT CENTER
// 10
DEFINE BUTTON RESOURCE "Center" OF oBar MESSAGE "Alinea al centro" NOBORDER ;
ACTION ( oRtf:SetAlign( PFA_CENTER ), oRtf:SetFocus() ) ;
TOOLTIP "Alinea al centro" TRANSPARENT CENTER
// 11
DEFINE BUTTON RESOURCE "Right" OF oBar MESSAGE "Alinea a la derecha" NOBORDER ;
ACTION ( oRtf:SetAlign( PFA_RIGHT ), oRtf:SetFocus() ) ;
TOOLTIP "Alinea a la derecha" TRANSPARENT CENTER
// 12
DEFINE BUTTON RESOURCE "Justify" OF oBar MESSAGE "Justifica a ambos lados" NOBORDER ;
ACTION ( oRtf:SetAlign( PFA_JUSTIFY ), oRtf:SetFocus() ) ;
TOOLTIP "Justifica a ambos lados" TRANSPARENT CENTER
// 13
@ 153,561 COMBOBOX oItem VAR cFont ITEMS aFonts OF oDlg:oBar PIXEL SIZE 133,120 FONT oFont3 ;
ON CHANGE ( oRtf:SetFontName( oItem:VarGet() ), oRtf:SetFocus() )
oItem:cToolTip := "Nombre de fuente"
// 14
@ 153,695 GET oSize VAR nSize OF oDlg:oBar FONT oFont3 PIXEL SIZE 21,21 PICTURE "99" SPINNER MIN 6 MAX 99 RIGHT ;
ON CHANGE ( oRtf:SetFontSize( oSize:VarGet() ), oRtf:SetFocus() )
oSize:Set3DLook()
oSize:cToolTip := "Tamaño de fuente"
AEval( oBar:aControls, { |x| x:nLeft += 226, x:nRight += 226 }, 14 )
oBar:bLClicked := { || nil }
oBar:bRClicked := { || nil }
AEval( oBar:aControls, { |x| x:oCursor := oCursor } )
RETU .T.
Como veran son 14 elementos, pero no se porque causa se crea una buttonbar solo con los 12 primeros y deja afuera al Combobox y al Get del final. Esto luego provoca un error al cargar los controles de la ButtonBar al abrirse el dialogo.
Pero usando el mismo código con una Buttonbar fija, todo funciona bien (se crea una buttonbar con 14 elementos); pero necesito que la ButtonBar no este en las posiciones convencionales, sino en una posición fija en medio del dialogo.
Revisando el código de creación de la clase, cuando la ButtonBar es fija, se usa el metodo constructor New() y cuando va en una posición fija es NewAt(); pero no encuentro porque no funcionan de la misma forma.
Saludos
Fernando Espinoza