Avatar billede kennethv Nybegynder
16. februar 2007 - 13:44 Der er 15 kommentarer og
2 løsninger

Ikoner på tabulator

Hej Eksperter.

Hvordan putter man et ikon på en tabulator, som skal står til højre for den tekst der er?
Avatar billede kennethv Nybegynder
16. februar 2007 - 13:45 #1
Ahh, til ventre for teksten? :)
Avatar billede vallemanden Nybegynder
16. februar 2007 - 13:47 #2
tabulator?
Avatar billede hrc Mester
16. februar 2007 - 14:22 #3
Jeg lytter med. Er det en "Tabbed notebook"? Der har jeg noget kode der tegner det i dens OwnerDraw-event.
Avatar billede kennethv Nybegynder
16. februar 2007 - 14:27 #4
Næ, det var nu ret dårligt forklaret. Det var på et faneblad.
Avatar billede hrc Mester
16. februar 2007 - 14:29 #5
Du får lige kodestumpen.

Proceduren tegner tabulatorerne på en TTabControl. Den der p.t. er valgt vil blive farvet grøn. Det udkommenterede er den stump kode der sætter et stykke grafik ind. Snuppet fra M.Cantu himself, men kan godt gøres pænere.

procedure TFormMain.TCKortDrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
  TabText: string;
  OutRect: TRect;
  OldColor : TColor;
begin
  TabText := TTabControl(Control).Tabs[TabIndex];
  OutRect := Rect;
  InflateRect (OutRect, -3, -3);
  OutRect.Left := OutRect.Left + {BmpSide} + 3;
  OldColor := Control.Canvas.Font.Color;
  try
    if Active then
      Control.Canvas.Font.Color := clGreen;
    DrawText(Control.Canvas.Handle, PChar(TabText), length(TabText),OutRect, dt_Left or dt_SingleLine or dt_VCenter);
  finally
    Control.Canvas.Font.Color := OldColor;
  end;
 
//  if TabText = 'Clipboard' then
//    if Clipboard.HasFormat (cf_Bitmap) then
//      TabBmp.Assign (Clipboard)
//    else
//      TabBmp.FreeImage
//  else
//    TabBmp.LoadFromFile (TabText);
//  OutRect.Left := OutRect.Left - {BmpSide} - 3;
//  OutRect.Right := OutRect.Left {+ BmpSide};
//  Control.Canvas.StretchDraw (OutRect, TabBmp);
end;
Avatar billede kennethv Nybegynder
16. februar 2007 - 14:59 #6
Jeg synes ikke rigtig helt at den vil som jeg vil.

Jeg har bare smidt en TabControl på en form. Og skrevet det her:


procedure TForm1.FormCreate(Sender: TObject);
begin
  TabControl1.Tabs.Add('Test');
end;

procedure TForm1.TabControl1DrawTab(Control: TCustomTabControl;
  TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
  TabText: string;
  OutRect: TRect;
  OldColor : TColor;
begin
  TabText := TTabControl(Control).Tabs[TabIndex];
  OutRect := Rect;
  InflateRect (OutRect, -3, -3);
  OutRect.Left := OutRect.Left + {BmpSide} + 3;
  OldColor := Control.Canvas.Font.Color;
  try
    if Active then
      Control.Canvas.Font.Color := clGreen;
    DrawText(Control.Canvas.Handle, PChar(TabText), length(TabText),OutRect, dt_Left or dt_SingleLine or dt_VCenter);
  finally
    Control.Canvas.Font.Color := OldColor;
  end;
 
//  if TabText = 'Clipboard' then
//    if Clipboard.HasFormat (cf_Bitmap) then
//      TabBmp.Assign (Clipboard)
//    else
//      TabBmp.FreeImage
//  else
//    TabBmp.LoadFromFile (TabText);
//  OutRect.Left := OutRect.Left - {BmpSide} - 3;
//  OutRect.Right := OutRect.Left {+ BmpSide};
//  Control.Canvas.StretchDraw (OutRect, TabBmp);
end;
Avatar billede kennethv Nybegynder
16. februar 2007 - 15:00 #7
Den får ingen farve.
Avatar billede kennethv Nybegynder
16. februar 2007 - 15:40 #8
Fik det til at virke. Manglede at sætte:

OwnerDraw := true;

Nu sker der det, at teksten bliver grøn på den aktive TAB. Jeg kunne godt tænke mig at et ikon var tilføjet og som får en anden farve hvis noget er ændret på fanebladet.

Hvordan kan det klares?
Avatar billede hrc Mester
17. februar 2007 - 09:47 #9
Jeg synes du er lidt hurtig og burde sætte dig ned og kigge på koden. Så havde du ikke spurgt vedr. den grønne farve. Hvis noget er ændret på fanebladet, sætter du en boolsk var. og tjekker på det i koden hvor du veksler mellem to bitmaps
Avatar billede kennethv Nybegynder
19. februar 2007 - 13:15 #10
Søde rare HRC. Jeg er ikke heeeeelt så stærk i det. :)

Da, jeg prøvede at at fjerne // for de liner. Fortalte den mig at Clipboard var Undeclared identifier.

Så gik jeg lidt i stå.

En anden ting. Som jeg ser det, læser den fra en fil. Kan man bruge en Imagelist?

Men hvordan skal jeg bruge det som du har sendt?
Avatar billede hrc Mester
20. februar 2007 - 08:25 #11
Dette lille program tegner et image (fra TImageList der indeholder 3 16x16 bitmaps) og placerer teksten ved siden af. Jeg har ikke lige tid til at finde ud af hvordan man gør fanebladet breddere - men det må være muligt.

  TfrmMain = class(TForm)
    pcMain: TPageControl;
    tcPage1: TTabSheet;
    tcPage2: TTabSheet;
    tcPage3: TTabSheet;
    ilMain: TImageList;
    procedure pcMainDrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    fBmp : TBitmap;
  public
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  fBmp := TBitmap.Create;
  fBmp.Width := 16;
  fBmp.Height := 16;
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
  fBmp.Free;
end;

procedure TfrmMain.pcMainDrawTab(Control: TCustomTabControl; TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
  TabText: string;
  OutRect: TRect;
  OldColor : TColor;
begin
  TabText := TTabControl(Control).Tabs[TabIndex];
  OutRect := Rect;
  InflateRect (OutRect, -3, -3);
  OutRect.Left := OutRect.Left + 3;

  OldColor := Control.Canvas.Font.Color;
  try
    if Active then
    begin
      ilMain.GetBitmap(TabIndex, fBmp);

      OutRect.Right := OutRect.Left + fBmp.Width;
      Control.Canvas.StretchDraw(OutRect, fBmp);

      OutRect.Left := OutRect.Right + 3;
      OutRect.Right := Rect.Right;

      Control.Canvas.Font.Color := clGreen;
    end
    else
      fBmp.FreeImage;

    DrawText(Control.Canvas.Handle, PChar(TabText), length(TabText), OutRect, dt_Left or dt_SingleLine or dt_VCenter);
  finally
    Control.Canvas.Font.Color := OldColor;
  end;
end;
Avatar billede kennethv Nybegynder
20. februar 2007 - 12:07 #12
Jeg synes ikke helt at der sker noget.

Skal jeg bruge en TPageControl eller TTabControl?
Avatar billede hrc Mester
21. februar 2007 - 09:06 #13
Kig dog i koden! Du har fået hele pas-filen og mangler kun at putte komponenterne på en form før tingene kan oversættes.

Af koden fremgår det at det er en TPageControl. Der er også en TImageList som jeg har fyldt 3 knap-billeder i (se c:\programmer\fælles filer\borland shared\images\buttons). Med højreklik på TPageControl'en har jeg oprettet ditto 3 TTabSheet's. Endelig har jeg sat OwnerDraw = true.

Prøv det. Det er en vigtig forudsætning for at blive klogere, at man kigger på den hjælp man får og det kan godt være smiger bringer dig langt (:-) men prøv at studere det jeg har lagt op.

På rutinens navn (pcMainDrawTab) fremgår det ligeledes, at den er koblet på TPageControl'lens OnDrawTab-event.
Avatar billede hrc Mester
21. februar 2007 - 09:09 #14
... der er nogle gange hvor det kunne være rart at uploade filer til eksperten - men uden ekstra kontrol vil siden sikkert mættes af billeder af hjernedøde Britney S. uden hår. Det og andre useriøsheder.
Avatar billede kennethv Nybegynder
21. februar 2007 - 16:17 #15
Jeg fatter det ikke. Det var præcis det jeg gjorde INDEN jeg skrev, men nu spiller det.
Avatar billede kennethv Nybegynder
21. februar 2007 - 16:22 #16
Hvis jeg må lige tilsidst lige nævne. Det du har givet mig putter et ikon og gør teksten grøn når fanebladet bliver aktivt. Det jeg egentlig havde forstillet mig  var, at som udgangspunkt var der et ikon på fanebladet. Når så noget på det aktive faneblad bliver ændret så skulle et andet ikon vises istedet.

Jeg vil gerne lave en ny opgave på det.
Avatar billede kennethv Nybegynder
21. februar 2007 - 20:39 #17
Det behøves ikke. Har klaret det.
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