Search code examples
ooppascallazarusfreepascal

Lazarus Pascal -- Class methods can't acces to private members


I am having an issue with Pascal-Lazarus (Linux):

The class methods can't acces the members. It isn't a compiler mistake, but a runtime error. (SIGSEV)

For more informations: i am using Linux with the newest version (16_4) and Lazarus Pascal (16.0). My system type is x86_64

the code:

    unit compiler_code;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

    TLine = class
         public          //public methods
               procedure setLine(i: string);  //setter for the line.
               procedure compileLine();       //just runs the different methods of the class
         private         //private members
               var m_string       : string;
               var m_stringLength : integer;
         private         //private methods
               function  deleteBlanks (i: string) : string;
               procedure getStringLength();
    end;

var Form1: TForm1;
var Zeile: TLine;

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  Zeile.setLine ('Hallo');
  Zeile.compileLine ();
end;

/////////////////////////Implementation of the Methods of TLine

procedure TLine.setLine(i: string);  //Setter --> no getter needed.
begin
  showmessage (i);
  showmessage (m_string); //here is where the issue comes up
  //m_string:= i;
end;

procedure TLine.compileLine();   //runs all of the Methods.
begin
   getStringLength ();                  // gets the length of the String-input
   m_string := deleteBLanks(m_string); //deletes all of the blank space inside the String.
end;

function TLine.deleteBlanks (i: string) : string;  //blankSpace-Deleter
var isText : boolean = false; //switch, to check, if the momentary Character is text or not.
var counter: integer = 0; //counts the number of cycles of the loop
begin
     while ((counter < m_stringLength) and (not (m_stringLength = 0))) do //the 'Loop'
     begin
       if ((m_string[counter] = ' ') and (not(isText))) then
       begin
           delete (m_string, counter, 1); //deletes the blank position
           dec (counter);                 //because there is a position less in the string now.
           getStringLength();             //regenerates the length of the String;
       end;
     end;
end;

procedure TLine.getStringLength ();
begin
    m_stringLength:= length (m_string);          //gets the Length of the String input.
end;

{$R *.lfm}

end.

Solution

  • The explanation is, presumably, that you simply have not created an instance of the class TLine. Nowhere do you assign to Zeile and so it remains at its default value of nil.

    You need to instantiate an instance

    Zeile := TLine.Create;
    

    You must do this before you attempt to reference Zeile. When you are done with the instance, destroy it:

    Zeile.Free;