No'am Newman
No'am Newman

Reputation: 6477

TTabControl: tabs displayed right to left

I am programming in a Hebrew environment and so I want the tabs on the top of a TTabControl to be displayed from right to left. The BiDiMode property doesn't affect the tabs, but rather text contained within the control.

I have tried the following code

SetWindowLong (tc.Handle, GWL_EXSTYLE,
               GetWindowLong(tc.Handle, GWL_EXSTYLE)  or
               WS_EX_LAYOUTRTL or WS_EX_NOINHERITLAYOUT);

which gets the tabs displayed correctly, but prevents the controls held within the ttabcontrol from appearing, and so its use is somewhat limited.

Any ideas? BTW, I'm using Delphi 7.

TIA, No'am

Upvotes: 3

Views: 2672

Answers (4)

Core
Core

Reputation: 620

I used the following code and just worked fine

procedure TfrmCustomer.FormCreate(Sender: TObject);
const
  LVM_FIRST = $1000;
  LVM_GETHEADER = LVM_FIRST + 31;
var
  header: thandle;
begin
  header := SendMessage(pgTypes.Handle, LVM_GETHEADER, 0, 0);
  SetWindowLong(header, GWL_EXSTYLE, GetWindowLong(header, GWL_EXSTYLE) or
    WS_EX_LAYOUTRTL or WS_EX_NOINHERITLAYOUT);

  SetWindowLong(pgTypes.Handle, GWL_EXSTYLE, GetWindowLong(pgTypes.Handle,
    GWL_EXSTYLE) or WS_EX_LAYOUTRTL or WS_EX_NOINHERITLAYOUT);
  pgTypes.Invalidate;
end;

pgTypes is name of the TPageControl

Upvotes: 0

Avishai
Avishai

Reputation: 31

This isn't my code. Something I found, but it seems to work.

procedure TForm1.FormCreate(Sender: TObject);
const
  LVM_FIRST = $1000;
  LVM_GETHEADER = LVM_FIRST + 31;
var
  header: thandle;
begin
  header:= SendMessage (TabControl1.Handle, LVM_GETHEADER, 0, 0);
  SetWindowLong (header, GWL_EXSTYLE,
                 GetWindowLong (header, GWL_EXSTYLE)  or
                 WS_EX_LAYOUTRTL or WS_EX_NOINHERITLAYOUT);

  SetWindowLong (TabControl1.Handle, GWL_EXSTYLE,
                 GetWindowLong (lv.Handle, GWL_EXSTYLE)  or
                 WS_EX_LAYOUTRTL or WS_EX_NOINHERITLAYOUT);
  lv.invalidate;  
end;

Upvotes: 3

No'am Newman
No'am Newman

Reputation: 6477

I've found a solution, which while not ideal, is better than nothing. I'm using TabAlign = tbRight, and owner drawing the tabs so that their text appears on the screen as horizontal. Here's a link to the screen shot of the tab control as it is at the moment: http://4.bp.blogspot.com/_rdlpltE1gDQ/SyNFvVNNe5I/AAAAAAAAAEQ/2DNVlKqRlWE/s1600-h/screen5.JPG)

I would still be appreciative of an answer which has the tabs on the top of the control, but aligned to the right of the control instead of to the left.

Upvotes: 0

Mohammed Nasman
Mohammed Nasman

Reputation: 11070

I tried the code with D2007 and it's working fine on windows7.

But you could use Raize controls, their PageControl and TabControl could be showed from RightToLeft without any code.

Upvotes: 1

Related Questions