Форум: "Начинающим";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
ВнизПодсветка параметров функции Найти похожие ветки
← →
Ivolg © (2007-07-03 12:41) [0]Например, есть RichEdit, в нем например пишу слово "copy(" и при открытии скобки должна выплывать подсказка с параметрами функции, как в Delphi. Как это можно реализовать ? Может имеются специальные компоненты ?
← →
Gydvin © (2007-07-03 12:47) [1]Синтаксический анализ строки
← →
Loginov Dmitry © (2007-07-03 13:31) [2]Смотри в сторону SynEdit. Оно много чего умеет.
← →
Ivolg © (2007-07-03 14:58) [3]SynEdit правда много чего умеет, но именно этого, к сожелению, в нем нет (
← →
Ivolg © (2007-07-03 22:10) [4]Вот набросал тут алгоритм, правдо пока он плохо работает... Возникла проблема: 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;
← →
palva © (2007-07-03 22:44) [5]> //Тут надо показать саму подсказку, только как ? )
Можно показать модальную форму. У вас трудности с определением координат этой формы?
← →
Ivolg © (2007-07-03 22:47) [6]Трудности с определением координат мигающего курсора (не коретки) и показом подсказки на этих координатах !
← →
Gydvin © (2007-07-04 06:50) [7]Ку?
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-04 15:10) [8]Gydvin © (04.07.07 06:50) [7]
Спасибо, но это не подходит, например я спользую вместо всплывающей подсказки TPanel, так вот, она не появляется в нужном мне месте, т.е после написания символа "(".
← →
Gydvin © (2007-07-04 22:56) [9]Получение координат внутри клиентской области ричедита.Относительно формы пересчитаешь сам. Ку?
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;
← →
@!!ex © (2007-07-04 23:17) [10]TSynEdit
Подсветка синтаксиса, Autocomplete. Вещь.
← →
Ivolg © (2007-07-05 12:27) [11]@!!ex © (04.07.07 23:17) [10]
TSynEdit
Подсветка синтаксиса, Autocomplete. Вещь.
Мне подсветка синтаксиса не нужна, нужно чтобы выплывала подсказка с параметрами функции !
← →
Ivolg © (2007-07-05 17:26) [12]Почти то же самый код:
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;
← →
Gydvin © (2007-07-05 18:39) [13]А подумать?
← →
Ivolg © (2007-07-07 13:18) [14]Вроде бы сделал то, что мне нужно: 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-08 12:58) [15]А проверять кординаты, типа?
if panel1.top+panel1.height>richedit1.top+richedit1.height then panel1.top:=y-panel1.height else panel1.top:=y;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.049 c