Question

I am using Delphi 7 (Yes, I hear the guffaws). I have a tabbed notebook that I want certain controls to appear only in a sequence where the prior control is finished correctly. For each page in the notebook, I have a named sheet. And for the controls on that sheet, I use the tag property to determine whether they are visible at each step. Some steps result in one new control showing, some steps have as many as five controls popping into view. I thought to simply iterate through the controls on any tab sheet that's in view and turn off anything with a tag greater than the current step value. On the page in question, there appear to be 23 controls in all, some labels that are always in view, some edit fields that pop up into view and some arrow-shaped buttons for advancing when a newly popped up field gets changed. Seemed simple enough, except I kept generating Index out of range errors. The sequence would shut down with out a detailed error message for EurekaLog, not anything opened up that should have been. I finally 'resolved' the issue by plugging in a check for the NAME of the control I knew was last in the list and quitting the loop at that point. I also added the extra test for Kounter.tag <> zero to avoid leaving the Submit and Cancel buttons on in some routes. Ideas why the Kounter just kept on past 23?

procedure TFrmMain.VizToggleWTP;
var
  kounter: Integer;
  kontrol: TControl;
  Kontrolz: Integer;
begin
  Kontrolz := sheetPrintouts.ControlCount;
  for Kounter := 1 to Kontrolz
  do begin
    // To avoid index error, check for the Cancel Button and exit at that point
    if sheetPrintouts.Controls[kounter].Name = 'BtnCancelwtp'
      then Break;
    if (sheetPrintouts.Controls[Kounter]) is TNXEdit
      then begin
        kontrol := TNXEdit(sheetPrintouts.Controls[Kounter]);
        kontrol.visible := (kontrol.Tag <= wtpStep);
        end;
    if (sheetPrintouts.Controls[Kounter]) is TJvShapedButton
      then begin
        kontrol := TJvShapedButton(sheetPrintouts.Controls[Kounter]);
        kontrol.visible := ((kontrol.Tag <= wtpStep) and (kontrol.Tag <> 0));
        end;
    end;
end;
Was it helpful?

Solution

You need to replace

for Kounter := 1 to Kontrolz do

with

for Kounter := 0 to Kontrolz-1 do

since the Controls array is zero-based.

For instance, if there are three controls, they are indexed 0, 1, 2 and not 1, 2, 3.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top