TheFrenchPlays Hd Micraftn TheFrenchPlays Hd Micraftn - 2 months ago 14
Pascal Question

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.

Answer

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;