AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PageControl ohne Rahmen

Ein Thema von Sidi61 · begonnen am 18. Mai 2017 · letzter Beitrag vom 21. Mai 2017
Antwort Antwort
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#1

PageControl ohne Rahmen

  Alt 18. Mai 2017, 23:29
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
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#2

AW: PageControl ohne Rahmen

  Alt 18. Mai 2017, 23:55
Zitat:
PageControl1.BevelInner := bvNone
PageControl hat dieses Property doch gar nicht.
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#3

AW: PageControl ohne Rahmen

  Alt 19. Mai 2017, 00:06
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.

Geändert von t.roller (19. Mai 2017 um 00:18 Uhr)
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#4

AW: PageControl ohne Rahmen

  Alt 19. Mai 2017, 22:09
Zitat:
PageControl1.BevelInner := bvNone
PageControl hat dieses Property doch gar nicht.
nein, aber TWinControl, ein Vorfahre von TPageControl.
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#5

AW: PageControl ohne Rahmen

  Alt 19. Mai 2017, 22:11
Hallo t.roller,

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

Gruß
Sidi61
  Mit Zitat antworten Zitat
SneakyBagels
(Gast)

n/a Beiträge
 
#6

AW: PageControl ohne Rahmen

  Alt 19. Mai 2017, 23:07
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.
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#7

AW: PageControl ohne Rahmen

  Alt 21. Mai 2017, 00:05
Hallo zusammen,

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

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

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

Gruß
Sidi61
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#8

AW: PageControl ohne Rahmen

  Alt 21. Mai 2017, 02:15
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 case PageControl1.TabPosition of an und rate mal warum.


PS: Wenn das verwendete Delphi schon VCL-Skins kann, dann einfach einen rahmenlosen Skin für sein PageControl basteln
oder entsprechende Fremdkomponenten verwenden.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (21. Mai 2017 um 02:23 Uhr)
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#9

AW: PageControl ohne Rahmen

  Alt 21. Mai 2017, 13:35
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.

Wieso es nur für Tabs oben oder unten funktioniert ... schau dir case PageControl1.TabPosition of an und rate mal warum.
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

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ß
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz