Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.05;
Скачать: CL | DM;

Вниз

Подсветка параметров функции   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.029 c
2-1184070026
AZIZE
2007-07-10 16:20
2007.08.05
HELP ME!!!


2-1183923865
nali
2007-07-08 23:44
2007.08.05
virtual или dynamic metods


2-1183789996
Riply
2007-07-07 10:33
2007.08.05
Длинное и короткое имя файла в одном флаконе. :)


15-1183856874
Куб
2007-07-08 05:07
2007.08.05
История Demos: Мы все были программистами, а не бизнесменами.


15-1183808983
Cyrax
2007-07-07 15:49
2007.08.05
Как установить словари к Promt Expert 7 Giant...