2009-06-26 8 views
8

No sé si esta pregunta se puede responder aquí, pero espero que sí. Escribí un editor de texto simple en Delphi 7 que sirve como mi IDE principal para escribir código C en Windows. Ejecuto Windows en una máquina virtual y necesitaba algo ligero. En cualquier caso, usa TpageControl que obtiene una nueva pestaña cada vez que abre o crea un archivo nuevo. Bastante estándar. Ahora, el TPageControl en Delphi no tiene una propiedad plana.Haciendo un TPageControl plano en Delphi 7

No, no me refiero a seleccionar el estilo de ficha para tsButtons o tsFlatButtons

las fronteras no pueden ser ajustados a "None" y se ve bastante mal cuando se agrega un editor de texto en el control de ficha.

¿Hay alguna manera de hacer un plano de TpageControl?

EDITAR:

En una PageControl código abierto que soporta plana esto es lo que encontré:

procedure TCustomTabExtControl.WndProc(var Message: TMessage); 
begin 
    if(Message.Msg=TCM_ADJUSTRECT) and (FFlat) then 
    begin 
    Inherited WndProc(Message); 
    Case TAbPosition of 
    tpTop : begin 
    PRect(Message.LParam)^.Left:=0; 
    PRect(Message.LParam)^.Right:=ClientWidth; 
    PRect(Message.LParam)^.Top:=PRect(Message.LParam)^.Top-4; 
    PRect(Message.LParam)^.Bottom:=ClientHeight; 
    end; 
    tpLeft : begin 
    PRect(Message.LParam)^.Top:=0; 
    PRect(Message.LParam)^.Right:=ClientWidth; 
    PRect(Message.LParam)^.Left:=PRect(Message.LParam)^.Left-4; 
    PRect(Message.LParam)^.Bottom:=ClientHeight; 
    end; 
    tpBottom : begin 
    PRect(Message.LParam)^.Left:=0; 
    PRect(Message.LParam)^.Right:=ClientWidth; 
    PRect(Message.LParam)^.Bottom:=PRect(Message.LParam)^.Bottom-4; 
    PRect(Message.LParam)^.Top:=0; 
    end; 
    tpRight : begin 
    PRect(Message.LParam)^.Top:=0; 
    PRect(Message.LParam)^.Left:=0; 
    PRect(Message.LParam)^.Right:=PRect(Message.LParam)^.Right-4; 
    PRect(Message.LParam)^.Bottom:=ClientHeight; 
    end; 
    end; 
end else Inherited WndProc(Message); 

end; 

La cosa es que cuando he intentado algo similar en la aplicación principal no va a funcionar. Ni siquiera compilará.

Respuesta

11

Cuando las pestañas se dibujan como botones, no se dibuja ningún borde alrededor del área de visualización, por lo tanto, establezca la propiedad Style eno tsFlatButtons. (Para programadores sin VCL, esto es equivalente a incluir el estilo de ventana tcs_Buttons en el control de tabulación)

Una alternativa es usar un TNotebook. Tiene páginas, pero no hace ninguna pintura en absoluto. Tendría que proporcionar las pestañas usted mismo, como establecer la altura del control de pestañas igual al alto de las pestañas, o usando un TTabSet. (TTabSet está disponible en Delphi 2005; no estoy seguro acerca de Delphi 7.)

Con respecto al código que encontraste, sería útil que indicaras por qué no compila, o si le diste un enlace a donde lo encontraste, ya que supongo que el error de compilación fue porque se refiere a campos o propiedades de la clase personalizada en lugar de la de stock. Esto es lo que puede intentar poner en su propio código, sin tener que escribir un control personalizado.

Hacer dos nuevas declaraciones en su formacomo este:

FOldTabProc: TWndMethod; 
procedure TabWndProc(var Msg: TMessage); 

En controlador de eventos del formulario OnCreate, asigne ese método a la propiedad del control de la página WindowProc:

FOldTabProc := PageControl1.WindowProc; 
PageControl1.WindowProc := TabWndProc; 

Ahora implemento que método y manejar el mensaje tcm_AdjustRect:

procedure TForm1.TabWndProc(var Msg: TMessage); 
begin 
    FOldTabProc(Msg); 
    if Msg.Msg = tcm_AdjustRect then begin 
    case PageControl1.TabPosition of 
     tpTop: begin 
     PRect(Msg.LParam)^.Left := 0; 
     PRect(Msg.LParam)^.Right := PageControl1.ClientWidth; 
     Dec(PRect(Msg.LParam)^.Top, 4); 
     PRect(Msg.LParam)^.Bottom := PageControl1.ClientHeight; 
     end; 
    end; 
    end; 
end; 

Puede completar los otros tres casos si los necesita. Tcm_AdjustRect es un identificador de mensaje declarado en la unidad CommCtrl. Si no tiene ese mensaje en esa unidad, declarelo usted mismo; su valor es 4904.

Sospecho que esto no impide que el control dibuje sus bordes.Por el contrario, hace que el contenido TTabSheet crezca un poco más y cubra los bordes.

+1

usando botones planos debe hacer el truco. Lo uso a menudo – Hemant

+0

Gracias, pero como mencioné en mi pregunta, no quiero tsFlatButtons. – wonderer

+0

Luego use botones no planos. El punto es que el control de la página se desinfla cuando las pestañas son botones, independientemente del tipo de botones que sean. –

2

Siempre puede usar una solución comercial. Recomiendo encarecidamente Raize components, que admiten TPageControls planos con pestañas. El conjunto de componentes es muy fácil de usar y admite numerosas mejoras visuales que, en mi opinión, le dan una mejor sensación a cualquier aplicación.

screen shot of tTPageControl with flat borders

+0

Gracias. Pero 1) Ya encontré una solución y 2) ya que este es un programa personal, no veo la necesidad de pagar por un compéntent – wonderer

1

gota dos TPageControl s, una con pestañas como Tab s, con una altura global de igual a las pestañas, y uno con flatbuttons y Tabvisible propiedades establecidas en false, que serían alineadas bajo la primera. Luego, asegúrese de que el cambio de tabulación en el primer TPagecontrol hace que las pestañas también cambien en el segundo.

0

estoy usando Delphi XE8 y la siguiente parece hacer el truco:

ATabControl.Tabs.Clear; 
ATabControl.Style := TTabStyle.tsFlatButtons; 
ATabControl.Brush.Color := clWhite; 
+0

Sería bueno si la gente explicara sus votos bajos. – uberlaufer

+1

Hice clic abajo durante la revisión, porque la pregunta es sobre 'Delphi 7' no' Delphi XE8'. No sabía, que los votos agregados durante la revisión, no se eliminan después de finalizar el proceso de revisión (respuesta publicada o eliminada). Desafortunadamente no puedo dejar de votar ahora. – agabrys

+2

No hay problema. Tenía curiosidad y diría que si esto ayuda a alguien que tropieza con esto, siempre y cuando esté claramente marcado como qué versión esto concierne, personalmente preferiría que se alentaran esas respuestas relacionadas. Pero soy nuevo aquí y todavía no estoy familiarizado con toda la estructura del sitio y las convenciones sobre cómo lidiar con él. Gracias por los comentarios de todos modos! – uberlaufer

Cuestiones relacionadas