![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подсветка параметров функции [D7, XP]
Ivolg © (2007-07-03 12:41:00)Например, есть RichEdit, в нем например пишу слово "copy(" и при открытии скобки должна выплывать подсказка с параметрами функции, как в Delphi. Как это можно реализовать ? Может имеются специальные компоненты ?
Gydvin (2007-07-08 12:58:00) [1]А проверять кординаты, типа?
if panel1.top+panel1.height>richedit1.top+richedit1.height then panel1.top:=y-panel1.height else panel1.top:=y;
Ivolg (2007-07-07 13:18:00) [2]Вроде бы сделал то, что мне нужно: Parent Panel1 на форме
...
if S2=Symbols[I] then
begin
Panel1.Caption:=Parameters[I];
Panel1.Left:=28+(8*RichEdit1.CaretPos.X);
Panel1.Top:=(16*RichEdit1.CaretPos.Y)-5;
Panel1.Visible:=True;
end;
...
Но возикла проблема: Например, когда каретка по Y > 17, то получается что Top у Panel1 увеличивается и она выходит за рамки RichEdit'a. Тоже самое происходит с Panel1.Left. Left у Panel1 увиличивается и панель уходит за рамки. Как можно запретить панели не выходить за рамки RichEdit'a, при условии что ее Top и Left увеличиваются ?
Gydvin (2007-07-05 18:39:00) [3]А подумать?
Ivolg (2007-07-05 17:26:00) [4]Почти то же самый код:
const
Symbols: Array[0..2] of String = ('copy', 'deletefile', 'save'); // слова
функций.
Parameters: Array[0..2] of String = ('copy (Input: String, Output: String)',
'deletefile (FileName: String)', 'save (FileName: String)'); //Описание
параметров функции.
...
procedure TForm1.RichEdit1Change(Sender: TObject);
var
S, S2: String;
I: Integer;
begin
S:=RichEdit1.Lines.Text; //Записываем текст в переменную.
if Pos('(', S) > 0 then //Если в строке найден символ "(", то выполняем цыкл.
begin
for I:=0 to 2 do
begin
S2:=Copy(S, Pos('(', S)-Length(Symbols[I]), Length(Symbols[I])); //Копируем текст с позиции "(" - длинну слов функции I, по длинну слов функции I.
if S2=Symbols[I] then //Если слово совпало со словом функции, то
begin
Panel1.Caption:=Parameters[I]; //Выводим параметры функции I
Panel1.Left:=RichEdit1.CaretPos.X; Как оределить координаты, чтобы показать панель рядом с "(" ?
Panel1.Top:=RichEdit1.CaretPos.Y;
Panel1.Visible:=True;
end;
end;
end
else
begin
S2:='';
Panel1.Visible:=False; // Скрыть Panel1
end;
end;
Ivolg (2007-07-05 12:27:00) [5]@!!ex © (04.07.07 23:17) [10]
TSynEdit
Подсветка синтаксиса, Autocomplete. Вещь.
Мне подсветка синтаксиса не нужна, нужно чтобы выплывала подсказка с параметрами функции !
@!!ex (2007-07-04 23:17:00) [6]TSynEdit
Подсветка синтаксиса, Autocomplete. Вещь.
Gydvin (2007-07-04 22:56:00) [7]Получение координат внутри клиентской области ричедита.Относительно формы пересчитаешь сам. Ку?
procedure TForm1.RichEdit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
function IndexByPos(handl:hwnd;num: Integer): tpoint;
var
pos: DWord;
begin
pos := sendmessage(handl, EM_POSFROMCHAR, WPARAM(num), 0);
Result.x := LoWord(pos);
Result.y := HiWord(pos);
end;
var
LineNum,ColNum : Word;
t:tpoint;
begin
t:=IndexByPos(RichEdit1.Handle,RichEdit1.SelStart);
end;
Ivolg (2007-07-04 15:10:00) [8]Gydvin © (04.07.07 06:50) [7]
Спасибо, но это не подходит, например я спользую вместо всплывающей подсказки TPanel, так вот, она не появляется в нужном мне месте, т.е после написания символа "(".
Gydvin (2007-07-04 06:50:00) [9]Ку?
function starpos(fmemo1: TCustomMemo): tpoint;
var
iX, iY: Integer;
begin
iX := 0;
iY := 0;
iY := SendMessage(fmemo1.Handle, EM_LINEFROMCHAR, fmemo1.SelStart, 0);
iX := fmemo1.SelStart - SendMessage(fmemo1.Handle, EM_LINEINDEX, iY, 0);
result.y := iY; //№ строки
result.x := iX; //№ символа в строке
end;
Ivolg (2007-07-03 22:47:00) [10]Трудности с определением координат мигающего курсора (не коретки) и показом подсказки на этих координатах !
palva (2007-07-03 22:44:00) [11]> //Тут надо показать саму подсказку, только как ? )
Можно показать модальную форму. У вас трудности с определением координат этой формы?
Ivolg (2007-07-03 22:10:00) [12]Вот набросал тут алгоритм, правдо пока он плохо работает... Возникла проблема: 1. Как можно показать подсказку в том месте, где стоит указатель ? Вот код:
...
const
Symbols: Array[0..2] of String = ('copy', 'deletefile', 'save'); // слова
функций.
Parameters: Array[0..2] of String = ('copy (Input: String, Output: String)',
'deletefile (FileName: String)', 'save (FileName: String)'); //Описание
параметров функции.
...
procedure TForm1.RichEdit1Change(Sender: TObject);
var
S, S2: String;
I: Integer;
begin
S:=RichEdit1.Lines.Text; //Записываем текст в переменную.
if Pos('(', S) > 0 then //Если в строке найден символ "(", то выполняем цыкл.
begin
for I:=0 to 2 do
begin
S2:=Copy(S, Pos('(', S)-Length(Symbols[I]), Length(Symbols[I])); //Копируем текст с позиции "(" - длинну слов функции I, по длинну слов функции I.
if S2=Symbols[I] then //Если слово совпало со словом функции, то
begin
Panel1.Caption:=Parameters[I]; //Выводим параметры функции I
//Тут надо показать саму подсказку, только как ? )
end;
end;
end
else
S2:='';
end;
Ivolg (2007-07-03 14:58:00) [13]SynEdit правда много чего умеет, но именно этого, к сожелению, в нем нет (
Loginov Dmitry (2007-07-03 13:31:00) [14]Смотри в сторону SynEdit. Оно много чего умеет.
Gydvin (2007-07-03 12:47:00) [15]Синтаксический анализ строки