Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TabVisible -> Bei selber zeichnen (https://www.delphipraxis.net/111260-tabvisible-bei-selber-zeichnen.html)

HolgerCW 1. Apr 2008 11:32


TabVisible -> Bei selber zeichnen
 
Hallo zusammen,

ich starte hier noch einmal einen Versuch ...

Hier schonmal mein Code: (Diese Procedure wird mit dem OnDrawTab-Ereignis von einem TPageControl aufgerufen)

Delphi-Quellcode:
procedure Berechtigung_Tab_zeichnen(PageControl: TPageControl; Berechtigt: Boolean;Control: TCustomTabControl; Der_TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
 Beschriftung: String;
begin

 with Control as TPageControl do
 begin
   
   Beschriftung := Pages[Der_Tabindex].Caption;

   If Berechtigt = TRUE then
   begin

    //Wenn Berechtigt wird normal gezeichnet
    Canvas.Brush.Style := bssolid;
    If Alarm_rot_zeichnen(Pages[Der_TabIndex].Name) = TRUE then Canvas.Brush.Color := clRed;
    Canvas.Font.Color := clbtntext;
    Canvas.TextOut(rect.left,rect.top,Beschriftung);
   
   end
   else
   begin

    //Wenn nicht berechtigt wird enabled gezeichnet
    Canvas.Brush.Style := bssolid;
    Canvas.Font.Color := clbtntext;
    DrawState(Canvas.Handle, Canvas.Brush.Handle, nil, Integer(Beschriftung), 0,
            rect.left,rect.top,0,0,DST_TEXT or DSS_DISABLED);
 
   end;

  end;

end;
Wie bekomme ich es nun hin, wenn ein Tab von dem PageControl TabVisible = FALSE ist, dass die Tabgrössen (Rect) und die Beschriftungen für die restlichen Tabs richtig bzw. an der richtigen Stelle gezeichnet werden ?

Gruss

Holger

mkinzler 1. Apr 2008 11:35

Re: TabVisible -> Bei selber zeichnen
 
man sollte so weit wie möglich auf globale Variablen verzichten.
Wie berechnest du X1, Y1?

HolgerCW 1. Apr 2008 11:40

Re: TabVisible -> Bei selber zeichnen
 
X1, Y1 war nur zur Anpassung der Postition fest vorgegeben.

Ich denke es geht genau um diese Berechnung, oder ? Aber wie mache ich die ?

Oder kann ich auch über den TabIndex irgendwie gehen ?

mkinzler 1. Apr 2008 11:52

Re: TabVisible -> Bei selber zeichnen
 
Brauchst su so gar nicht, denn Rect liefert dir die Eck-Koordinaten des Tabs

HolgerCW 1. Apr 2008 11:55

Re: TabVisible -> Bei selber zeichnen
 
Ja, aber wie mache ich das denn nun ?

Komme da nicht weiter ...

HolgerCW 1. Apr 2008 12:12

Re: TabVisible -> Bei selber zeichnen
 
Wenn ich dieses am Anfang der Procedure mache:

Delphi-Quellcode:
//Unsichtbare Tabs übergehen
Unsichtbar := 0;

for I := 0 to Der_TabIndex do
begin

 If PageControl.Pages[I].TabVisible = FALSE then
 begin

  Unsichtbar := Unsichtbar + 1;
   
 end;

end;

Der_TabIndex := Der_TabIndex + Unsichtbar;
... funktioniert das auch wenn ich ein Tab Visible = FALSE setze. Bei zwei oder mehr Tabs aber nicht. Da ist es wieder durcheinander ...

Vielleicht kann jemand das Konstrukt dort oben dementsprechend anpassen ...

HolgerCW 1. Apr 2008 13:12

Re: TabVisible -> Bei selber zeichnen
 
Hat da keiner eine Lösung ???

HolgerCW 1. Apr 2008 16:25

Re: TabVisible -> Bei selber zeichnen
 
Für diese Lösung habe ich nun 2 Tage gebraucht :(

Diese kommt an den Anfnag der Procedure, welche am Anfang dieses Themas dargestellt wurde.
Delphi-Quellcode:
var
 I, Unsichtbar, Ende, Anpassung: Integer;

//Unsichtbare Tabs übergehen
 Unsichtbar := 0;
 Ende := 0;
 Anpassung := 0;

 //Bis zum aktuellen TabIndex, die unsichtbaren finden
 for I := 0 to Der_TabIndex do
 begin

  if PageControl.Pages[I].TabVisible = FALSE then
  begin

   Anpassung := Anpassung + 1;

  end;

 end;

 //Nächsten sichtbaren nach aktuellem Tab (mit Anpassung der unsichtbaren) ermitteln
 for I := (Der_TabIndex + Anpassung) to PageControl.PageCount - 1 do
 begin

  if PageControl.Pages[I].TabVisible = TRUE then
  begin
   Ende := I;
   break;
  end;

 end;

 //Alle unsichtbare in dem Bereich bis zum nächsten sichtbaren ermitteln (Verschiebung nach links)
 for I := 0 to (Ende - 1) do
 begin

  if PageControl.Pages[I].TabVisible = FALSE then
  begin

   Unsichtbar := Unsichtbar + 1;

  end;

 end;

 If Unsichtbar > 0 then Der_TabIndex := Der_TabIndex + Unsichtbar;

end;
Bessere Lösungen gibt es bestimmt. Vielleicht gibt es hier ja welche die Lust am optimieren haben.

Die Lösung dort oben setzt den TabIndex immer an die richtige Stelle, egal welche Tabs ausgeblendet wurden.

Gruss

Holger

Sharky 1. Apr 2008 16:29

Re: TabVisible -> Bei selber zeichnen
 
Hai Holger,

bitte unterlasse es doch deine Beiträge ständig "zu pushen". Du bist lange genug in der Delphi-PRAXiS um unsere Regeln zu kennen und müsstest auch wissen wie Du einen eigenen Beitrag editieren kannst.

HolgerCW 1. Apr 2008 16:35

Re: TabVisible -> Bei selber zeichnen
 
OK, wusste ich jetzt noch nicht. Mein Fehler. Hätte genauer die Regeln lesen sollen.

Wird denn auch ein nacheditierter Beitrag wieder als aktuell in die Liste gestellt ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:54 Uhr.
Seite 1 von 2  1 2      

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