O
Onegin
Здравствуйте.
У меня три вопроса:
1. Я сделал подсветку тригонометрических функций обычным методом: процедуру подсветки поместил в OnChange rePole(TRichEdit), стало тормозить перерисовываясь. Попробовал использовать Паралельный процесс(LexPole), тормоза не прикратились. Вызов LexPole я делал также в OnChange.
2. Я сохраняю настройки программы в файл, который находится в той же директории, что и исполняемый файл программы (Например 'c:\myprog\config.txt') . Да но пользователь может установить программу в другое место(Например: 'c:\programfiles\myprog' ) но у меня написано LoadFromFile('c:\myprog\config.txt'). Я исползовал InstallShield там упоминается свойство InstallDir, как из программи получить доступ к этому свойству.
3. Я сначала запоминаю положение каретки, а после подсветки возвращаю ее обратно.Но,
** y:=fmCalc.rePole.Perform(EM_LINEFROMCHAR, fmCalc.rePole.SelStart, 0);
x:=fmCalc.rePole.Perform(EM_LINEINDEX, Y, 0);**
Возвращает X как позицию каретки от начала нулевой строки, а
**fmCalc.rePole.Selstart := fmCalc.rePole.perform(em_lineindex, y, 0) + x;**
Устанавливает в координатах Y-номер строки, X- количество символов от начала етой же строки. Можно как то решить эту проблему? Может возможно вообще без нее обойтись?
Вот процедура подсветки:
Заранее спасибо.
P.S.
Извините за столь громоздкий вопрос.
У меня три вопроса:
1. Я сделал подсветку тригонометрических функций обычным методом: процедуру подсветки поместил в OnChange rePole(TRichEdit), стало тормозить перерисовываясь. Попробовал использовать Паралельный процесс(LexPole), тормоза не прикратились. Вызов LexPole я делал также в OnChange.
2. Я сохраняю настройки программы в файл, который находится в той же директории, что и исполняемый файл программы (Например 'c:\myprog\config.txt') . Да но пользователь может установить программу в другое место(Например: 'c:\programfiles\myprog' ) но у меня написано LoadFromFile('c:\myprog\config.txt'). Я исползовал InstallShield там упоминается свойство InstallDir, как из программи получить доступ к этому свойству.
3. Я сначала запоминаю положение каретки, а после подсветки возвращаю ее обратно.Но,
** y:=fmCalc.rePole.Perform(EM_LINEFROMCHAR, fmCalc.rePole.SelStart, 0);
x:=fmCalc.rePole.Perform(EM_LINEINDEX, Y, 0);**
Возвращает X как позицию каретки от начала нулевой строки, а
**fmCalc.rePole.Selstart := fmCalc.rePole.perform(em_lineindex, y, 0) + x;**
Устанавливает в координатах Y-номер строки, X- количество символов от начала етой же строки. Можно как то решить эту проблему? Может возможно вообще без нее обойтись?
Вот процедура подсветки:
Код:
procedure TLexPole.Execute;
Var
x,y,i,j,h : integer;
Funcs : array [0..25] of string;
begin
Funcs[0]:='sin';
Funcs[1]:='cos';
Funcs[2]:='tg';
Funcs[3]:='ctg';
Funcs[4]:='sec';
Funcs[5]:='cosec';
Funcs[6]:='sinh';
Funcs[7]:='cosh';
Funcs[8]:='tgh';
Funcs[9]:='ctgh';
Funcs[10]:='sech';
Funcs[11]:='cosech';
Funcs[12]:='arcsin';
Funcs[13]:='arccos';
Funcs[14]:='arctg';
Funcs[15]:='arcctg';
Funcs[16]:='arcsec';
Funcs[17]:='arccosec';
Funcs[18]:='arcsinh';
Funcs[19]:='arccosh';
Funcs[20]:='arctgh';
Funcs[21]:='arcctgh';
Funcs[22]:='arcsech';
Funcs[23]:='arccosech';
Funcs[24]:='ln';
Funcs[25]:='lg';
x:=0;
y:=0;
y:=fmCalc.rePole.Perform(EM_LINEFROMCHAR, fmCalc.rePole.SelStart, 0);
x:=fmCalc.rePole.Perform(EM_LINEINDEX, Y, 0);
inc(y);
x:=fmCalc.rePole.SelStart-X+1;
for i:=fmCalc.rePole.Lines.Count-1 downto 0 do
for j:=Length(fmCalc.rePole.Lines[i]) downto 1 do
for h:=25 downto 0 do
if Copy(fmCalc.rePole.Lines[i],j,Length(Funcs[h]))=Funcs[h] then
begin
fmCalc.rePole.Font.Color:=clBlack;
fmCalc.rePole.SelStart:=j-1;
fmCalc.rePole.SelLength:=Length(Funcs[h]);
Color:=clBlue;
Synchronize(UpPole);
fmCalc.rePole.SelLength:=0;
fmCalc.rePole.SelStart:=0;
fmCalc.rePole.Selstart := fmCalc.rePole.perform(em_lineindex, y, 0) + x;
end;
end;
Procedure TLexPole.UpPole;
begin
fmCalc.rePole.SelAttributes.Color:=Color;
end;
Заранее спасибо.
P.S.
Извините за столь громоздкий вопрос.