anchor.diff:    ReloadColumns;
   end;
   
  +procedure TCustomVisualGrid.PageIndexEditChange(Sender: TObject);
  +var
  +  LPageIndex: Integer;
  +begin
  +  if FPageIndexUpdate then
  +    Exit;
  +  // value in edit has increased value by 1 (more readable for end user)
  +  LPageIndex := Pred(StrToIntDef(FPageIndexEdit.Text, Succ(FPageIndex)));
  +  if (LPageIndex < 0) then
  +  begin
  +    LPageIndex := 0;
  +    SetPageIndexEditText('1');
  +  end;
  +  if (LPageIndex > FPageCount-1) then
  +  begin
  +    LPageIndex := FPageCount-1;
  +    SetPageIndexEditText(IntToStr(FPageCount));
  +  end;
  +
  +  PageIndex := LPageIndex;
  +end;
  +
  +procedure TCustomVisualGrid.PageNavigationClick(Sender: TObject);
  +begin
  +  if FPageCount = 0 then
  +    Exit;
  +  case TButton(Sender).Tag of
  +    PAGE_NAVIGATION_FIRST: PageIndex := 0;
  +    PAGE_NAVIGATION_PREVIOUS: PageIndex := PageIndex - 1;
  +    PAGE_NAVIGATION_NEXT: PageIndex := PageIndex + 1;
  +    PAGE_NAVIGATION_LAST: PageIndex := FPageCount - 1;
  +  end;
  +end;
  +
   procedure TCustomVisualGrid.RefreshGrid;
   begin
   
  +end;
  +
  +procedure TCustomVisualGrid.RefreshPageIndexData(ARefreshColumns: boolean);
  +var
  +  LFilter: TFilterCriteria;
  +  i: Integer;
  +begin
  +  if Assigned(FDataSource) then
  +  begin
  +    if FPageIndex >= FPageCount then
  +      FPageIndex := FPageCount - 1;
  +
  +    FDataTable := FDataSource.FetchPage(FPageIndex, FPageSize, FPageCount, LFilter);
  +
  +    if (FPageIndex = -1) and (Length(FDataTable.Rows) > 0) then
  +      FPageIndex := 0;
  +
  +    if ARefreshColumns then
  +    begin
  +      FColumns.Clear;
  +      for i := 0 to High(FDataTable.Columns) do
  +        FColumns.Add(FDataTable.Columns[i]);
  +      ReloadColumns;
  +    end;
  +    FDrawGrid.RowCount := Length(FDataTable.Rows) + 1;
  +  end;
  +  RefreshPageIndexInterface;
  +  FDrawGrid.Refresh;
  +end;
  +
  +procedure TCustomVisualGrid.RefreshPageIndexInterface;
  +begin
  +  SetPageIndexEditText(IntToStr(Succ(FPageIndex)));
  +  FPageCountLabel.Caption := Format('/%d',[FPageCount]);
   end;
   
   procedure TCustomVisualGrid.ReloadColumns;
  
positive.code:       Height := 40;
        Align := alRight;
        BevelOuter := bvNone;
        FCurrentPageEdit := TEdit.Create(Self);
        FCurrentPageEdit.Parent := FBottomRightPanel;
        with FCurrentPageEdit do
        begin
          Left := 61;
          Top := 10;
          Width := 56;
          Height := 21;
        end;
        FAllPagesLabel := TLabel.Create(Self);
        FAllPagesLabel.Parent := FBottomRightPanel;
        with FAllPagesLabel do
        begin
          Left := 118;
          Top := 13;
  
negative.code: end;
  
  procedure TCustomVisualGrid.SetDataSource(ADataSource: IDataSource);
  begin
    if FDataSource = ADataSource then
      Exit;
  
    FDataSource := ADataSource;
  
    RefreshPageIndexData(true);
  end;
  
  procedure TCustomVisualGrid.SetPageIndex(const Value: Integer);
  begin
    if FPageIndex = Value then
      Exit;
  
  
    FPageIndex := Value;
    RefreshPageIndexData(false)
  end;
  
  procedure TCustomVisualGrid.SetPageIndexEditText(const AStr: utf8string);
  begin
    FPageIndexUpdate := True;
    FPageIndexEdit.Text := AStr;
    FPageIndexUpdate := false;
  end;
  
  procedure TCustomVisualGrid.SetPageSize(const Value: Integer);
  begin
    FPageSize := Value;
  end;
  
  procedure TCustomVisualGrid.StandardDrawCell(Sender: TObject; ACol,
  