Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PageControl ohne Rahmen (https://www.delphipraxis.net/192789-pagecontrol-ohne-rahmen.html)

Sidi61 18. Mai 2017 22:29

PageControl ohne Rahmen
 
Hallo zusammen,

ich möchte gern den Rahmen bei PageControl ausblenden. Hierzu gibt es einige Beiträge die aber letztendlich in die Richtung gehen den Style auf tsButton oder tsFlatButton zu stellen. Diese Lösung funktioniert bei mir allerdings nicht - liegt es an der Delphi-Verison, ich weiß es nicht.

Ein Versuch mit PageControl1.BevelInner := bvNone führt zu einer Fehlermeldung da das proberty offensichtlich geschützt ist.

Was kann ich machen - hat jemand eine Idee oder eine Lösung??

Liebe Grüße
Sidi61

SneakyBagels 18. Mai 2017 22:55

AW: PageControl ohne Rahmen
 
Zitat:

PageControl1.BevelInner := bvNone
PageControl hat dieses Property doch gar nicht.

t.roller 18. Mai 2017 23:06

AW: PageControl ohne Rahmen
 
Style:= tsFlatButtons; // mit XE7 geht's
Oder:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Winapi.CommCtrl, Vcl.ComCtrls;

type
  TPageControl = class(Vcl.ComCtrls.TPageControl)
  private
    procedure TCMAdjustRect(var Msg: TMessage); message TCM_ADJUSTRECT;
  end;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TPageControl.TCMAdjustRect(var Msg: TMessage);
begin
  inherited;
  if Msg.WParam = 0 then
    InflateRect(PRect(Msg.LParam)^, 4, 4)
  else
    InflateRect(PRect(Msg.LParam)^, -4, -4);
end;

end.

Sidi61 19. Mai 2017 21:09

AW: PageControl ohne Rahmen
 
Zitat:

Zitat von SneakyBagels (Beitrag 1371999)
Zitat:

PageControl1.BevelInner := bvNone
PageControl hat dieses Property doch gar nicht.

nein, aber TWinControl, ein Vorfahre von TPageControl.

Sidi61 19. Mai 2017 21:11

AW: PageControl ohne Rahmen
 
Hallo t.roller,

beides habe ich schon versucht, kann es daran liegen das ich Benutzerdefinierte Stile aktiviert habe??

Gruß
Sidi61

SneakyBagels 19. Mai 2017 22:07

AW: PageControl ohne Rahmen
 
Zitat:

beides habe ich schon versucht, kann es daran liegen das ich Benutzerdefinierte Stile aktiviert habe??
Schalte die Stile mal aus. Wenn es dann funktioniert, sind die Stile schuld.

Sidi61 20. Mai 2017 23:05

AW: PageControl ohne Rahmen
 
Hallo zusammen,

habe nun eine Lösung gefunden - allerdings nicht richtig verstanden :oops:

Im From die procedure TabWndProc deklarieren
Delphi-Quellcode:
private
    { Private-Deklarationen }
    procedure TabWndProc(var Msg: TMessage); //PageControl
Variable FOldTabProc deklarieren

Delphi-Quellcode:
var
  Form_Auftrag: TForm_Auftrag;
  FOldTabProc : TWndMethod;  //PageControl
Implementation
In FormActivate die Tabs verstecken

Delphi-Quellcode:
procedure TForm_Auftrag.FormActivate(Sender: TObject);
var P : integer;
begin
  //Tabs verstecken
  for P := 0 to PageControl1.PageCount -1 do
  begin
    PageControl1.Pages[P].TabVisible := false;
  end;
end;
In FormCreate TabWndProc aufrufen

Delphi-Quellcode:
procedure TForm_Auftrag.FormCreate(Sender: TObject);
begin
  FOldTabProc := PageControl1.WindowProc;   //PageControl
  PageControl1.WindowProc := TabWndProc;    //PageControl
end;
um den Rahmen auszublenden

Delphi-Quellcode:
procedure TForm_Auftrag.TabWndProc(var Msg: TMessage);
begin
  FOldTabProc(Msg);
  if Msg.Msg = tcm_AdjustRect then begin
    case PageControl1.TabPosition of
      tpTop: begin
        PRect(Msg.LParam)^.Left := 4;
        PRect(Msg.LParam)^.Right := PageControl1.ClientWidth;
        Dec(PRect(Msg.LParam)^.Top, 8);
        PRect(Msg.LParam)^.Bottom := PageControl1.ClientHeight;
      end;
      tpBottom: begin
        PRect(Msg.LParam)^.Left := 8;
        PRect(Msg.LParam)^.Right := PageControl1.ClientWidth;
        Dec(PRect(Msg.LParam)^.Top, 4);
        PRect(Msg.LParam)^.Bottom := PageControl1.ClientHeight;
      end;
    end;
  end;
end;
Das Blöde ist, es funktioniert nur mit Tabposition tpTop, für tpBottom habe ich keine funktionierende Einstellung gefunden. Bei Einstellung tpTop zur Entwurfszeit muß ich zur Laufzeit das PageControl ausrichten da es nach oben schnappt:shock:

Was da in TabWndProc genau passiert habe ich nicht verstanden, vielleicht kann das einer erklären und findet auch eine Lösung für Einstellung tpBottom :gruebel:

Gruß
Sidi61

himitsu 21. Mai 2017 01:15

AW: PageControl ohne Rahmen
 
Warum die Tabs nicht schon zu Designtime ausblenden?


TCM_ADJUSTRECT begrezt den Bereich, in welchem das PageControl seinen Inhalt zeichnen kann.
Tja, und hier wird einfach der Bereich verboten, wo der Rahmen liegt, womit er nicht gezeichnet werden kann.

Wieso es nur für Tabs oben oder unten funktioniert ... schau dir
Delphi-Quellcode:
case PageControl1.TabPosition of
an und rate mal warum. :zwinker:


PS: Wenn das verwendete Delphi schon VCL-Skins kann, dann einfach einen rahmenlosen Skin für sein PageControl basteln
oder entsprechende Fremdkomponenten verwenden.

Sidi61 21. Mai 2017 12:35

AW: PageControl ohne Rahmen
 
Zitat:

Zitat von himitsu (Beitrag 1372195)
Warum die Tabs nicht schon zu Designtime ausblenden?

Wenn ich die Tabs schon zur Entwurfszeit ausblende ist das Teil nur noch sehr umständlich zu bearbeiten und die Ausrichtung stimmt am Ende erst nicht. Keine Probleme mit der Ausrichtung habe ich wenn zur Entwurfszeit die Tabs unten sind.

Zitat:

Zitat von himitsu (Beitrag 1372195)
Wieso es nur für Tabs oben oder unten funktioniert ... schau dir
Delphi-Quellcode:
case PageControl1.TabPosition of
an und rate mal warum. :zwinker:

Für Tabs unten funktioniert es eben nicht, die beste Einstellung die ich gefunden habe brachte auf der linken Seite noch einen Rahmen. Das ist ja das Dilemma:shock:

Mit der gefundenen Lösung kann ich leben, da die Einstellungen jedoch von den im Netz zu findenden Beispielen abweicht habe ich die Befürchtung dass das Erscheinungsbild auf anderen Rechnern ggf. unterschiedlich sein kann.

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz