For Window ONLY! This code will mirror most TWinControls including TForm and make them function RightToLeft. It solves many problems, but not all of them. You should leave BiDiMode:= bdLeftToRight. You should call RtlCtrl for each TWinControl. You need to include 'Windows' in the Uses statement.
A few of the known issues:
TMenu/TPopupMenu Images, TBitBtn, TSpeedButton Images, TSynEdit, TButtonPanel...
Edit: I forgot to say that you MUST disable Themes for this to work. Go to 'Project\Project Options' and UNCHECK 'Use manifest...' If you do not then TWinControls that are RightToLeft will be Black and not usable.
uses Windows;
const
RightToLeftLayout = $400000;
NoInheritLayout = $00100000;
{===== RtlCtrl =====}
procedure RtlCtrl(ACtrl: TObject);
{ Make TWinControl RightToLeft - Windows ONLY! }
begin
{$IfDef Windows}
if ACtrl is TWinControl then
with TWinControl(ACtrl) do begin
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE)
or RightToLeftLayout or NoInheritLayout);
end;
{$EndIf}
end;
{===== LtrCtrl =====}
procedure LtrCtrl(ACtrl: TObject);
{ Make TWinControl LeftToRight - Windows ONLY! }
begin
{$IfDef Windows}
if ACtrl is TWinControl then
with ACtrl as TWinControl do begin
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE)
and RightToLeftLayout and NoInheritLayout);
end;
{$EndIf}
end;