我想製作一個簡單的程序來讀取lazarus中的文件。但是,當我嘗試讀取TXT文件的編譯器的線給我這個錯誤:「不能拿常量表達式的地址」Lazarus錯誤:無法獲取常量表達式的地址
有是有問題的一部分 -
system.Assign(MyFile, label1.caption + '.txt');
reset(MyFile);
Readln(MyFile,name); - this give that error
任何建議來解決這個?
我想製作一個簡單的程序來讀取lazarus中的文件。但是,當我嘗試讀取TXT文件的編譯器的線給我這個錯誤:「不能拿常量表達式的地址」Lazarus錯誤:無法獲取常量表達式的地址
有是有問題的一部分 -
system.Assign(MyFile, label1.caption + '.txt');
reset(MyFile);
Readln(MyFile,name); - this give that error
任何建議來解決這個?
我測試了它,得出如下結論: 1)它是一個編譯器消息 - 不是運行時錯誤! 2.)你還沒有聲明「名字」。 因此,您所在表單的屬性「名稱」已被採納 - 並導致確切的錯誤。
解決方法:聲明一個字符串放線到
var sTextLine:string;
begin
//...
Readln(Myfile,,sTextLine);
//...
end;
從您發佈的內容(尤其是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.
問題在於變量「name」是保留的 - 它的值爲「form1」。所以當我將變量「名稱」更改爲「產品名稱」時,它可以工作。感謝您的時間:) – 2014-10-09 19:17:57
@MartinBrláž:我說我的第一句話 - 它不是'保留'的,它是表格本身的屬性。 – 2014-10-09 19:20:08
據我所知,在拉撒路沒有TStreamReader。 – 2014-10-23 12:39:50
您需要向我們展示更多代碼。你的變量'name'是如何定義的?它應該是'var name:String;'。如果你還沒有定義它,也許你的表單的名稱屬性被採用。最好定義另一個(更具描述性的)變量。 – Rik 2014-10-07 21:24:46
這是一種風格,但嚴重的是我們在2014年,爲什麼地獄不使用TStringList/LoadFromFile,TMemoryStream/LoadFromFile或TFileStream。 – 2014-10-08 10:53:50
我們在2014年,文件仍然可能不適合內存:-) – 2014-10-09 06:41:25