2016-09-17 41 views
0

拉撒路帕斯卡尔 - 类方法无法存取权限我有帕斯卡 - 拉扎鲁斯(Linux)的问题私有成员

类方法不能存取权限的成员。这不是编译器错误,而是运行时错误。 (SIGSEV)

欲了解更多信息:我使用Linux与最新的版本(16_4)和Lazarus帕斯卡(16.0)。我的系统类型是x86_64的

代码:

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. 
+0

读者看不到你的屏幕。 **确切的**行会发生错误,**确切**错误消息是什么?那么为什么你在地球上使用一个程序来获得一个字符串的长度? – MartynA

+0

1)错误出现在 –

+0

procedure TLine.setLine(i:string); // Setter - >不需要getter。 (i); showmessage(m_string); //这里是问题出现的地方 // m_string:= i; 结束; –

回答

1

的解释是,据推测,你根本就没有创建类TLine的一个实例。你没有分配到Zeile,所以它保持默认值nil

您需要实例化一个实例

Zeile := TLine.Create; 

你必须这样做,尝试引用Zeile之前。当你完成实例时,销毁它:

Zeile.Free; 
+0

作品。谢谢。 :) –