Delphi tab order

Thomas O picture Thomas O · Jan 16, 2012 · Viewed 16.9k times · Source

The tab order on my form in Delphi (Embarcadero® Delphi® 2010 Version 14.0) is incorrect, which means the tab key skips to seemingly random items in the form.

However, when I go and change it in Delphi, it rearranges them for me, in the same incorrect order!

So, I decided to programmatically assign them:

procedure FixDelphiTabOrder;
begin
  Form2.ButtonClear.TabOrder := 2000;
  Form2.ButtonExport.TabOrder := 1900;
  Form2.ButtonNew.TabOrder := 1800;
  Form2.MaxFreq.TabOrder := 1700;
  Form2.MinFreq.TabOrder := 1600;
  Form2.Summary.TabOrder := 1500;
  Form2.Plot6dB.TabOrder := 1400;
  Form2.Plot3dB.TabOrder := 1300;
  Form2.Use_dBs.TabOrder := 1200;
  Form2.PlotPoints.TabOrder := 1100;
  Form2.PlotPhase.TabOrder := 1000;
  Form2.Prop8Value.TabOrder := 900;
  Form2.Prop7Value.TabOrder := 800;
  Form2.Prop6Value.TabOrder := 700;
  Form2.Prop5Value.TabOrder := 600;
  Form2.Prop4Value.TabOrder := 500;
  Form2.Prop3Value.TabOrder := 400;
  Form2.Prop2Value.TabOrder := 300;
  Form2.Prop1Value.TabOrder := 200;
  Form2.FilterType.TabOrder := 100;
  ShowMessage(IntToStr(Form2.Prop1Value.TabOrder));
end;

(I tried assigning it both backwards and forwards; it does the same thing.)

But this still doesn't work. The message box pops up with 7 instead of 100, every time. Something is consistently changing the order, but it's not my code.

Why is this, and is it possible to fix it?

This is for my A2 Computing Project

Answer

David Heffernan picture David Heffernan · Jan 16, 2012

TabOrder is contiguous. The first control has TabOrder of 0. The next has TabOrder of 1 and so on. You cannot leave any gaps.

Whilst you can assign TabOrder programmatically, I personally find it easiest to use the GUI to do so. Right click on the form, or indeed on a container control, and select the Tab Order menu item. Then you will see a dialog like this:

enter image description here

You can use the arrow buttons to re-order, or you can simply drag items to re-order. It works reasonably well in my view but you must remember that controls which contain other controls (e.g. panels, tabsheets etc.) have their own tab order. For such a control you need to select that control, right-click and then modify the tab order for the children of that container.