Avatar billede jgthb Nybegynder
03. september 2006 - 22:35 Der er 23 kommentarer og
1 løsning

tab color fane farve

Hej

Jeg har en tabcontrol. Det meste af den har samme farve som min form, men fanerne er grå. Hvordan ændrer man farven på dem?
Avatar billede stone Forsker
03. september 2006 - 22:59 #1
Jeg bruger en der hedder "winxp.res"  som simulere xp look kan ikke lige´huske hvor jeg fik den fra men jeg kan lægge den til download. Et andet problem der kommer med brug af winxp er at den tomme del af tabcontrol forbliver grå - her plejer jeg at lægge et panel over med farven som form.
Avatar billede stone Forsker
03. september 2006 - 23:02 #2
Avatar billede jgthb Nybegynder
03. september 2006 - 23:42 #3
Hvad skal jeg stille op med den res-fil?

Jeg er ikke vant til at tilføre andre filer til delphi. Jeg har netop i dag fundet ud af, hvordan man tilfører en pas-fil til delphi.
Avatar billede stone Forsker
04. september 2006 - 01:28 #4
under implementation skriver du

{$R WinXP.RES}
Avatar billede jgthb Nybegynder
04. september 2006 - 04:49 #5
Nu er hverken fanebladene eller fanerne farvede. Nu er de hvide, uanset formens farve. Meningen var, at jeg skulle kunne indstille på farven, eller at fanerne i det mindste havde samme farve som formen.
Avatar billede stone Forsker
04. september 2006 - 08:37 #6
enten er du nød til at lave dit egen component med de funktioner eller du kan prøve at kigge på det her component...

pages v.1.2

http://www.torry.net/pages.php?id=164
Avatar billede jgthb Nybegynder
04. september 2006 - 09:40 #7
lave mit eget komponent. det lyder spændende. du kender vel ikke en god vejledning til det? og hvor svært er det?
Avatar billede jgthb Nybegynder
04. september 2006 - 09:52 #8
Jeg har nu prøvet at installere pages v.1.2. Der er tre pas-filer, og de første to kan jeg også godt installere, men når jeg når til pages.pas, går det galt. Der står, at filen 'DsgnIntf.dcu' ikke blev fundet.

Nå, men jeg vil kigge nærmere på sagerne senere i dag.
Avatar billede stone Forsker
04. september 2006 - 10:56 #9
yep det er fordi du ikke har lavet en reference i tools\environment options gå til fanebladet library og skriv i library path stien ned til dit component hvor *.dcu filen ligger f.eks

c:\programmer\borland\delphixx\component\page_1.2\
Avatar billede jgthb Nybegynder
04. september 2006 - 11:37 #10
jeg har ikke en fil der hedder sådan. den fulgte ikke med Pages v.1.2 og eksisterede hellere ikke i Borland-mappen i forvejen.
Avatar billede stone Forsker
04. september 2006 - 11:55 #11
hvilken delphi version har du?
Avatar billede jgthb Nybegynder
04. september 2006 - 20:29 #12
Jeg har version 7.0
Avatar billede stone Forsker
04. september 2006 - 21:25 #13
du skal nok ændre i pas filen for det component - kig på nedenstående 

RE: dsgnintf.dcu

    Ok, I had the same problem my self before. If you have the source code for that component and you try to install it in Delphi 6 or 7, but it is made for Delphi 5 or lower, you have to replace "DsgnIntf" in the uses clause with "DesignIntf, DesignEditors".
Avatar billede stone Forsker
04. september 2006 - 21:31 #14
åbn pages.pas og ændre slet "DsgnIntf"

erstat den med DesignIntf, DesignEditors

som jeg har gjort i nedenstående:

interface
uses SysUtils, Forms, comctrls, Windows, Messages, Controls, Classes, Graphics, ExtCtrls,
    Grafxes, BitmapHolder, CommCtrl, DesignIntf, DesignEditors;
Avatar billede jgthb Nybegynder
04. september 2006 - 23:21 #15
meget mærkeligt. jeg havde ordnet det hele og afprøvede det så i et projekt. jeg trykkede F9, og projektet gik i gang. jeg lukkede og trykkede igen F9. Og så virker det ikke!! Den påstår, den ikke kan finde DesignIntf.dcu.

Nu nåede jeg jo så ikke at afprøve komponentet fuldt ud, men umiddelbart kunne det ikke farve fanerne, men kun fanebladene ligesom det almindelige komponent kan. Iøvrigt var det noget besværligt at tilføje en fane. Man skulle ikke gør det som i Delphis komponent, men derimod højreklikke på selve komponentet og så vælge et punkt, som hed noget på tysk.

Men tak for hjælpen. hvis du ikke har et løsningsforslag, så må vi bare glemme det. Jeg må indrømme, at jeg ikke havde forestillet mig, det ville blive så besværligt.
Avatar billede stone Forsker
05. september 2006 - 00:17 #16
nej jeg har ikke lige pt. en løsning uden du skal ud i nogle componenter der koster penge.
Avatar billede stone Forsker
05. september 2006 - 00:38 #17
fandt lige den her:

http://www.rhostyle.com/Files/xpStyle.zip

der medfølger en demo som hedder xppagedmo
Avatar billede nop Nybegynder
12. september 2006 - 14:20 #18
Sæt ownerDraw til true og link onDrawTab eventet til det her.
Bemærk at jeg har nogle typer tabPosTop osv. som du nok ikke har.
Sørg iøvrigt for at du sætter bold-style på fonten på pageControlen, så passer breden på caption til min stil på aktiv-fane-caption, ellers skulle det være let at tilpasse det hele!

procedure TfrmPositionDlg.pcPositionDetailsDrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
    pc:        TcustomTabControl;
    s:          string;
    r:          Trect;
    lf:        TLogFont;
    OldFont:    hFont;
    NewFont:    hFont;
begin
    pc:=control as TcustomTabControl;
    pc.Canvas.MoveTo(0,0);
    if not active then
        pc.Canvas.Brush.Color:=rgb(181,199,230)
    else
        pc.Canvas.Brush.Color:=clWhite;
    r:=rect;
    if not active then
        r.Bottom:=r.Bottom+2;
    pc.Canvas.FillRect(r);
    r:=rect;
    s:=pcPositionDetails.Pages[TabIndex].Caption;
    case tabPosTop of
        tabPosTop:      begin
                            r.Left:=r.Left+2;
                            r.Top:=r.Top+3;
                            if Active then begin
                                r.Top:=r.Top+2;
                            end;
                        end;
        tabPosBottom:  begin
                            r.Left:=r.Left+2;
                            r.Top:=r.Top;
                            if Active then begin
                                r.Top:=r.Top+4;
                            end;
                        end;
        tabPosLeft:    begin
                            r.Left:=r.Left+2;
                            r.Top:=r.Bottom-4;
                            if Active then begin
                                r.Left:=r.Left+1;
                                r.Top:=r.Top-1;
                            end;
                        end;
        tabPosRight:    begin
                            r.Left:=r.Left+14;
                            r.Top:=r.Top+2;
                            if Active then begin
                                r.left:=r.left+4;
                                r.Top:=r.Top+3;
                            end;
                        end;
    end;
    if tabPosTop in [tabPosLeft,tabPosRight] then begin
        GetObject(pc.Canvas.Font.Handle, sizeof(lf), @lf);
        if tabPosTop=tabPosLeft then
            lf.lfEscapement := 900
        else
            lf.lfEscapement:= -900;
        lf.lfOrientation := lf.lfEscapement;
        if Active then
            lf.lfWeight:=700;

        NewFont := CreateFontIndirect(lf);
        OldFont := SelectObject(pc.Canvas.Handle, NewFont);
        Windows.TextOut(pc.Canvas.Handle,r.Left,r.Top,pchar(s),length(s));
        SelectObject(pc.Canvas.Handle,OldFont);
        DeleteObject(NewFont);
    end else begin
        if Active then begin
            pc.Canvas.Font.Style:=[fsBold];
            r.Left:=r.Left+2;
        end else
            pc.Canvas.Font.Style:=[];
        pc.Canvas.TextOut(r.Left,r.Top,s);
    end;
end;
Avatar billede nop Nybegynder
12. september 2006 - 14:23 #19
Lige en lille tilføjelse, så hver tab har sin farve.

....
    procedure fillColor;
    begin
        c[0]:=rgb(198,200,224);
        c[1]:=rgb(76,129,160);
        c[2]:=rgb(141,165,208);
        c[3]:=rgb(194,206,224);
        c[4]:=rgb(130,137,144);
        c[5]:=rgb(196,197,192);
        c[6]:=rgb(228,231,224);
        c[7]:=rgb(107,165,144);
        c[8]:=rgb(164,195,176);
        c[9]:=rgb(201,233,208);
        c[10]:=rgb(239,170,0);
        c[11]:=rgb(234,232,128);
        c[12]:=rgb(231,234,176);
        c[13]:=rgb(201,140,96);
        c[14]:=rgb(228,173,144);
        c[15]:=rgb(234,227,192);
    end; //fill color

begin //PageControlDrawTab
    pc:=control as TcustomTabControl;
    pc.Canvas.MoveTo(0,0);
    pc.Canvas.Brush.Color:=rgb(237,240,242);
    fillColor;
    pc.Canvas.Brush.Color:=c[15-tabIndex];
...
Avatar billede jgthb Nybegynder
18. oktober 2006 - 15:44 #20
Undskyld mig, at jeg ikke har fået kigget på det i lang tid.

nop, jeg har nogle problemer med at få det til at virke. Altså:

- jeg laver et nyt projekt.
- jeg laver en TabControl, som vi kalder TabControl1, og to tilhørende faner (tabs).
- Herefter kopierer jeg din procedure
"TfrmPositionDlg.pcPositionDetailsDrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);" ind. Men hvordan skal toppen af koden se ud så? Dette virker i hvert fald ikke rigtigt.

type
  TForm1 = class(TForm)
    TabControl1: TTabControl;
    procedure TabControl1DrawTab(Control: TCustomTabControl;      TabIndex: Integer; const Rect: TRect; Active: Boolean);

    procedure TfrmPositionDlg.pcPositionDetailsDrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);

  private
    { Private declarations }
  public
    { Public declarations }
  end;



Og så lige nogle spørgsmål til parameterne.
- 'Control' skal være min TabControl1.
- 'TabIndex' skal være mit fanebladnummer.
- 'const Rect' skal være hvad?
- 'Active' skal være aktiv?

Og skal fillColor stå inde i den anden procedure før begin??? det vidste jeg ikke man kunne
Avatar billede nop Nybegynder
19. oktober 2006 - 13:09 #21
Toppen skal rigtig nok ikke se sådan ud.
Lav din tab control og dobbelt klik på eventet onDrawTab og paste min koden ind, på den måde så laver Delphi toppen osv. for dig.
Og ja, fillColor skal kaldes inden i event-proceduren før man begynder at hente farver fra den selvfølgelig.
Procedure kan altid kalde procedure der kan kalde procedure der kan...Og en procedure kan enda kalde sig selv det kaldes rekursivt kald.

Alle de nævnte parametere er nogen at Delphi folkene har lavet - det er dem der beskriver status/opsæt på tab-controlen, de giver næsten sig selv.....
Rect er det område man har at tegne på (rectangle) i canvas'et, med lige netop det faneblad (tabIndex), active er om fanebladet er det der er valgt på tabben.
Avatar billede nop Nybegynder
19. oktober 2006 - 13:11 #22
Paste fra "var" og ned til sidste "end;" og erstat den begin/end; Delphi selv sætter på.
Avatar billede jgthb Nybegynder
19. oktober 2006 - 19:32 #23
Det virker igen ikke. Øv. jeg må gøre et eller andet helt forkert.
Jeg har nu følgende kode:

"
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls;

type
  TForm1 = class(TForm)
    TabControl1: TTabControl;
    procedure TabControl1DrawTab(Control: TCustomTabControl;
      TabIndex: Integer; const Rect: TRect; Active: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure fillColor;
    begin
        c[0]:=rgb(198,200,224);
        c[1]:=rgb(76,129,160);
        c[2]:=rgb(141,165,208);
        c[3]:=rgb(194,206,224);
        c[4]:=rgb(130,137,144);
        c[5]:=rgb(196,197,192);
        c[6]:=rgb(228,231,224);
        c[7]:=rgb(107,165,144);
        c[8]:=rgb(164,195,176);
        c[9]:=rgb(201,233,208);
        c[10]:=rgb(239,170,0);
        c[11]:=rgb(234,232,128);
        c[12]:=rgb(231,234,176);
        c[13]:=rgb(201,140,96);
        c[14]:=rgb(228,173,144);
        c[15]:=rgb(234,227,192);
    end; //fill color

procedure TForm1.TabControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
    pc:        TcustomTabControl;
    s:          string;
    r:          Trect;
    lf:        TLogFont;
    OldFont:    hFont;
    NewFont:    hFont;
begin
pc:=control as TcustomTabControl;          //Se lige koden herfra igennem
pc.Canvas.MoveTo(0,0);
pc.Canvas.Brush.Color:=rgb(237,240,242);
fillColor;
pc.Canvas.Brush.Color:=c[15-tabIndex];
pc:=control as TcustomTabControl;          // Hertil.
    if not active then
        pc.Canvas.Brush.Color:=rgb(181,199,230)
    else
        pc.Canvas.Brush.Color:=clWhite;
    r:=rect;
    if not active then
        r.Bottom:=r.Bottom+2;
    pc.Canvas.FillRect(r);
    r:=rect;
    s:=pcPositionDetails.Pages[TabIndex].Caption;
    case tabPosTop of
        tabPosTop:      begin
                            r.Left:=r.Left+2;
                            r.Top:=r.Top+3;
                            if Active then begin
                                r.Top:=r.Top+2;
                            end;
                        end;
        tabPosBottom:  begin
                            r.Left:=r.Left+2;
                            r.Top:=r.Top;
                            if Active then begin
                                r.Top:=r.Top+4;
                            end;
                        end;
        tabPosLeft:    begin
                            r.Left:=r.Left+2;
                            r.Top:=r.Bottom-4;
                            if Active then begin
                                r.Left:=r.Left+1;
                                r.Top:=r.Top-1;
                            end;
                        end;
        tabPosRight:    begin
                            r.Left:=r.Left+14;
                            r.Top:=r.Top+2;
                            if Active then begin
                                r.left:=r.left+4;
                                r.Top:=r.Top+3;
                            end;
                        end;
    end;
    if tabPosTop in [tabPosLeft,tabPosRight] then begin
        GetObject(pc.Canvas.Font.Handle, sizeof(lf), @lf);
        if tabPosTop=tabPosLeft then
            lf.lfEscapement := 900
        else
            lf.lfEscapement:= -900;
        lf.lfOrientation := lf.lfEscapement;
        if Active then
            lf.lfWeight:=700;

        NewFont := CreateFontIndirect(lf);
        OldFont := SelectObject(pc.Canvas.Handle, NewFont);
        Windows.TextOut(pc.Canvas.Handle,r.Left,r.Top,pchar(s),length(s));
        SelectObject(pc.Canvas.Handle,OldFont);
        DeleteObject(NewFont);
    end else begin
        if Active then begin
            pc.Canvas.Font.Style:=[fsBold];
            r.Left:=r.Left+2;
        end else
            pc.Canvas.Font.Style:=[];
        pc.Canvas.TextOut(r.Left,r.Top,s);
    end;
end;

end.
"

og får fejlene:

"
[Error] Unit1.pas(29): Undeclared identifier: 'c'
[Error] Unit1.pas(61): Undeclared identifier: 'c'
[Error] Unit1.pas(72): Undeclared identifier: 'pcPositionDetails'
[Error] Unit1.pas(72): Missing operator or semicolon
[Error] Unit1.pas(72): Missing operator or semicolon
[Error] Unit1.pas(73): Undeclared identifier: 'tabPosTop'
[Error] Unit1.pas(81): Undeclared identifier: 'tabPosBottom'
[Error] Unit1.pas(81): Duplicate case label
[Error] Unit1.pas(88): Undeclared identifier: 'tabPosLeft'
[Error] Unit1.pas(96): Undeclared identifier: 'tabPosRight'
[Error] Unit1.pas(96): Duplicate case label
[Warning] Unit1.pas(107): Comparing signed and unsigned types - widened both operands
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
"
Avatar billede jgthb Nybegynder
13. december 2007 - 23:55 #24
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester