如何记住以前打开过的文本文件的位置,并在再次打开时定位到上次关闭时的位置? (180分)

  • 主题发起人 主题发起人 huhui
  • 开始时间 开始时间
H

huhui

Unregistered / Unconfirmed
GUEST, unregistred user!
我是一个初学者,这两天正在写一个看书的程序(类似于ReadBook的)。
可是碰到一个问题始终无法解决:
就是如何保存当前打开文件的名字和位置,
使下次再打开该程序时,程序自动打开上次关闭时的文件,
并定位到上次打开的位置。
也就是说好比有本书,不看时在书中放一个书签,
下次就能接着书签的位置看书了
我想用ini文件来实现,但是不知道如何确定位置?

我看了ReadBook的ini文件,
发现他是用在ini文件里记录了当前字符的位置的方法来确定的:
[F:/Delphi/Delphi之程序设计篇.txt]
DiskVolume=教程
DiskSN=3fbc1e9c
Address=6240 //就是用句来确定位置的
OpenMode=0
DelEnterSize=6
Date=20020519
Time=031004
可是我不知道如何确定当前位置的字符是第几个?
也不知道在打开文件时如何定位
请问各位大侠这个如何实现?谢谢了。
 
简单点:
直接记录关闭前光标所在位置XXX(可记录之前有多少个字符)
下次打开时直接定位到该行 memo1.SelStart:=XXX
 
READBOOK好像没有用MEMO或RICHEDIT控件,它是自己画的。
你如果是使用控件的话,就是设置SelStart就可以了,如果是自己画的话,那就自己处理
一下,显示当前位置所在的那一屏。
 
请问如何记录关闭前光标所在位置XXX?
 
var
Row,Col:Integer;
.....
//关机时调用,将Row,Col值存入Info.Ini文件中
procedure TForm1.GetCursorPos;
var
CharPos: TPoint;
begin
CharPos.Y := SendMessage(Richedit1.Handle, EM_EXLINEFROMCHAR, 0, Richedit1.SelStart);
CharPos.X := (Richedit1.SelStart - SendMessage(Richedit1.Handle, EM_LINEINDEX, CharPos.Y, 0));
Inc(CharPos.Y);
Inc(CharPos.X);
row:=CharPos.Y;
Col:=CharPos.x;
end;

//开机时调用,读Info.Ini文件,赋值给Row,Col
procedure TForm1.SetCursorPos;
var
j,n: Integer;
str: string;
begin
Richedit1.SetFocus;
str := Richedit1.Lines[Row - 1];
j := Richedit1.FindText(str, 0, length(richedit1.text), [stMatchCase]);
n := length(str);
if Col < n then n := Col;
Richedit1.selstart := j+n;
PostMessage(Richedit1.Handle, EM_SCROLLCARET, 0, 0);
end;
 
To linsb:
我按照你的方法,可是在编译时不能通过,
  显示:[Error] Unit1.pas(42): Undeclared identifier: 'EM_EXLINEFROMCHAR'
  请问该如何解决?
 
使用前先要定义,例如:
CONST EM_EXLINEFROMCHAR=WM_USER+123;
其它的一样;
它还传递了参数,建议参考一下SendMessage和PostMessage的帮助吧!
 
关闭的时候
With TiniFile.Create(inifilename)) do
begin
WriteInteger('TxtFileName','Address',Memo1.Selstart);
free;
end;
打开之后
With TiniFile.Create(inifilename)) do
begin
Memo1.Selstart := ReadInteger('TxtFileName','Address',0);
free;
end;
 
加上:
uses RichEdit, ShellAPI;
 
To linsb:
加上:uses RichEdit, ShellAPI; 后的确可以,
但是我又发现了一个新问题:
如果程序在关闭文本文件后窗体的大小发生了变化,
则再次打开刚才关闭的文本文件时,会发生定位错误的情况。
请问该如何解决?

To bigroute:
我按照你所说的方法去做,发现在打开文件时,
只能把光标定位在上次关闭文件时所处的位置,
而显示的文本却还是从第一行开始,
并不能直接显示光标所处位置的文本。
如我有一个文本文件,内容是数字1到200,每个数字一行,
关闭程序时,光标所处的位置是100,
可再打开时,只是光标的位置在100处,而显示的却还是从1开始。
请问如何才能从100处开始显示?

有些问题可能在各位高手眼里十分简单,
但因是新手,还请各位多多指教。
 
再次提前,希望高手指点一二。
 

Similar threads

回复
0
查看
804
不得闲
D
回复
0
查看
911
DelphiTeacher的专栏
D
D
回复
0
查看
868
DelphiTeacher的专栏
D
后退
顶部