[fpc-pascal] Question on type helpers

Bart bartjunk64 at gmail.com
Sat Dec 31 22:41:15 CET 2016


On 12/31/16, Sven Barth <pascaldragon at googlemail.com> wrote:

> You did put the helper declaration before the implementation of X, right?

Oops!

> If you still have a problem, please open a bug report with an example
> (cause that should definitely work).

This is from my oiginal code.
I stripped away anything that did not influence this (lots of methods,
uses clause for sysutils,class,lazutf8).

======================================
unit thtest;

{$mode objfpc}{$H+}
{$modeswitch typehelpers}

interface

type
  TStringArray = array of String;

  { TStringTable }

  TStringTable = class
  private
    FRows: array of TStringArray;
  protected
  public
    procedure DeleteCol(Index: Integer);
    function InsertCol(Index: Integer; Values: array of String): Integer;
  end;

implementation

  { TStringArrayHelper }
type
  TStringArrayHelper = type helper for TStringArray
    constructor Create(AValue: TStringArray); overload;
    function Insert(Index: Integer; const S: String): Integer;
    procedure Delete(Index: Integer);
  end;

{ TStringArrayHelper }

constructor TStringArrayHelper.Create(AValue: TStringArray);
begin
  Self := AValue;
end;

function TStringArrayHelper.Insert(Index: Integer; const S: String): Integer;
var
  i: Integer;
begin
  SetLength(Self, Length(Self)+1);
  for i := High(Self) downto (Index + 1) do
    Self[i] := Self[i-1];
  Self[Index] := S;
  Result := Index;
end;

procedure TStringArrayHelper.Delete(Index: Integer);
var
  i: Integer;
begin
  for i := Index to (High(Self) - 1) do
    Self[i] := Self[i+1];
  SetLength(Self, Length(Self) - 1);
end;

{ TStringTable }

function TStringTable.InsertCol(Index: Integer; Values: array of
String): Integer;
var
  i: Integer;
begin
  FRows[0].Insert(Index, '');
  //for i := Low(FRows) to High(FRows) do
  begin
    //if (i <= High(Values)) then
      FRows[i].Insert(Index, Values[i])
    //else
    //  FRows[i].Insert(Index, '');
  end;
  Result := Index;
end;

procedure TStringTable.DeleteCol(Index: Integer);
var
  i: Integer;
begin
  FRows[0].Delete(Index);
end;

end.
======================================

The declaration of the helper is before any location is is used as far
as I can see.

thtest.pp(80,12) Fatal: Syntax error, "CREATE" expected but "DELETE" found
Line 80 is:
  FRows[0].Delete(Index);

Why does the compile NOT like FRows[0].Delete(), but does not care
about the earlier
(line 69) FRows[i].Insert(Index, Values[i]) ??

Even stranger (to me):

If you uncomment
  //FRows[0].Insert(Index, '');
at line 65, the compiler will see the error at the above mentioned line 69:

thtest.pp(69,16) Fatal: Syntax error, "CREATE" expected but "INSERT" found

But why does it not fail then at the uncommented line that also calls
the Insert method?

NB. These are my compiler options:
-MObjFPC -Scghi -Cirot -g -gl -gh -l -vewnhibq -Filib\i386-win32 -Fu.
-FUlib\i386-win32 -FcUTF8

Bart


More information about the fpc-pascal mailing list