2016-09-17 68 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

作品。謝謝。 :) –