2014-10-07 63 views
0

我想製作一個簡單的程序來讀取lazarus中的文件。但是,當我嘗試讀取TXT文件的編譯器的線給我這個錯誤:「不能拿常量表達式的地址」Lazarus錯誤:無法獲取常量表達式的地址

有是有問題的一部分 -

system.Assign(MyFile, label1.caption + '.txt'); 
    reset(MyFile); 
    Readln(MyFile,name); - this give that error 

任何建議來解決這個?

+4

您需要向我們展示更多代碼。你的變量'name'是如何定義的?它應該是'var name:String;'。如果你還沒有定義它,也許你的表單的名稱屬性被採用。最好定義另一個(更具描述性的)變量。 – Rik 2014-10-07 21:24:46

+0

這是一種風格,但嚴重的是我們在2014年,爲什麼地獄不使用TStringList/LoadFromFile,TMemoryStream/LoadFromFile或TFileStream。 – 2014-10-08 10:53:50

+0

我們在2014年,文件仍然可能不適合內存:-) – 2014-10-09 06:41:25

回答

0

我測試了它,得出如下結論: 1)它是一個編譯器消息 - 不是運行時錯誤! 2.)你還沒有聲明「名字」。 因此,您所在表單的屬性「名稱」已被採納 - 並導致確切的錯誤。

解決方法:聲明一個字符串放線到

var sTextLine:string; 
begin 
    //... 
    Readln(Myfile,,sTextLine); 
    //... 
end; 
1

從您發佈的內容(尤其是label1.caption),看來這是從窗體上的事件處理程序。在這種情況下,name最可能的範圍是Form1.Name,它不是變量,而是表單本身的屬性。

聲明一個正確類型的變量,然後讀入它。例如,讀取文本行(例如,在控制檯應用程序進行測試):

program Test; 

uses 
    SysUtils; 

var 
    Buffer: array[0..255] of Char;  // Reads up to 256 characters in a line 
    LineData: string; 
begin 
    System.Assign(MyFile, 'C:\Temp\Test.txt'); 
    Reset(MyFile); 
    ReadLn(MyFile, Buffer); 
    LineData := Buffer; 
    // Do something with LineData 
    WriteLn(LineData); 
    ReadLn; 
end. 

一個更好的替代方法是移動從舊的IO功能,而是進入現代世界。例如,您可以使用「Classes.TStreamReader」代替:

program Test; 

uses 
    SysUtils, Classes; 

var 
    LineData: string; 
    Reader: TStreamReader; 
begin 
    Reader := TStreamReader.Create('C:\Temp\Test.txt'); 
    try 
    LineData := Reader.ReadLine; 
    WriteLn(LineData); 
    ReadLn; 
    finally 
    Reader.Free; 
    end; 
end. 
+0

問題在於變量「name」是保留的 - 它的值爲「form1」。所以當我將變量「名稱」更改爲「產品名稱」時,它可以工作。感謝您的時間:) – 2014-10-09 19:17:57

+0

@MartinBrláž:我說我的第一句話 - 它不是'保留'的,它是表格本身的屬性。 – 2014-10-09 19:20:08

+0

據我所知,在拉撒路沒有TStreamReader。 – 2014-10-23 12:39:50

相關問題