[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