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

Вниз

Автозавершение строки при введении её в Memo   Найти похожие ветки 

 
download   (2003-09-01 00:05) [0]

Уважаемые мастера, подскажите пожалуйста, как при вводе в Memo тегов HTML сделать так, чтобы они автоматически завершались - то есть, ввожу <BODY>, а </BODY> вводится тут же сам.


 
Song ©   (2003-09-01 08:28) [1]

Руками.


 
pasha_golub ©   (2003-09-01 12:04) [2]

Создай такой вот список

<BODY>=</BODY>
...=...

А потом смотри Song


 
Sfagnum ©   (2003-09-01 12:25) [3]

по моему проще от формировать закрытый тэг от открытого вырезать всё от "<" до ">" или " " в переменную а потом вставить "</" + переменная ">" - преймущества не надо все тэги знать...


 
pasha_golub ©   (2003-09-01 12:50) [4]

2Sfagnum
А вот у некоторых тегов нет завершающих братьев, например <br> + <hr> etc


 
NAlexey ©   (2003-09-01 13:05) [5]

>А вот у некоторых тегов нет завершающих братьев, например <br> + <hr> etc
Ну почемуже, кажись они есть, просто ничего страшного не случится если их не указать...


 
download   (2003-09-02 22:22) [6]

А Вы не могли бы поподробнее про список <BODY>=</BODY>? Что Вы хотите этим сказать? Как это реализовать?


 
Palladin ©   (2003-09-03 08:44) [7]

Может тебе сначала научится составлять более простые алгоритмы?


 
download   (2003-09-03 22:30) [8]

Да более простые я умею, и алгоритм автозавершения я уже вчера написал сам (другим способом), но он прекрасно работает только в обычном Memo, а вот в SynEdit, где он мне нужен, не хочет.

Вот мой алгоритм:

var
Form1: TForm1;
words: TStringList;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
words := TStringList.Create;
words.Sorted := true;
words.LoadFromFile("tags.txt");
end;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
const
chars: set of char = ["A".."Z", "a".."z", "<", "/", ">", """];
var
w: string;
i: integer;
s: string;
full: string;
SelSt: integer;
begin
try
if Key = 13 then begin
Edit1.SelStart := Edit1.SelStart + Edit1.SelLength;
Edit1.SelLength := 0;
Exit;
end;
s := Edit1.Text;
SelSt := Edit1.SelStart;
i := SelSt;
if (length(s) > i) and (s[i+1] in chars) then Exit;
w := "";
while (i >= 1) and (s[i] in chars) do begin
w := s[i] + w;
dec(i);
end;
if length(w) <= 0 then Exit;
words.Find(w, i);
if (i >= 0) and (UpperCase(copy(words[i], 1, length(w))) = UpperCase(w)) then begin
full := words[i];
insert(copy(full, length(w) + 1, length(full)), s, SelSt + 1);
Edit1.Text := s;
Edit1.SelStart := SelSt;
Edit1.SelLength := length(full) - length(w);
end;
except exit;
end;
end;

Придётся мне, видимо, самому писать с нуля (т.е. с TObject) свой редактор, который справится с задачей подсветки и автозавершения тегов. Я думал, дело в том, что в SynEdit нет свойства SelLength, которое используется в этом алгоритме, я написал сам это свойство, оно работает в SynEdit, но алгоритм автозавершения почему-то всё равно не работает.

Вот как я добавил свойство SelLength:

type
THEdit = class(TSynEdit)
private
protected
function GetSelLength: Integer;
procedure SetSelLength(Value: Integer);
public
property SelLength: Integer read GetSelLength write SetSelLength;
published
end;

function THEdit.GetSelLength: Integer;
begin
SendMessage(Handle, EM_GETSEL, SelStart, SelEnd);
Result := SelEnd - SelStart;
end;

procedure THEdit.SetSelLength(Value: Integer);
begin
SendMessage(Handle, EM_GETSEL, SelStart, SelEnd);
SelEnd := SelStart + Value;
SendMessage(Handle, EM_SETSEL, SelStart, SelEnd);
SendMessage(Handle, EM_SCROLLCARET, 0,0);
end;

Ничего не пойму. А вот со списком я не совсем понял. Может, кто-нить объяснит, plzzzz?



Страницы: 1 вся ветка

Текущий архив: 2003.09.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
3-48469
Slaviq
2003-08-21 18:01
2003.09.15
SQL запрос для объединения 2 таблиц


1-48589
download
2003-09-01 00:05
2003.09.15
Автозавершение строки при введении её в Memo


1-48593
Теран
2003-09-03 17:21
2003.09.15
Форматирование ячеек Excel из Delphi


3-48454
AkaSaint
2003-08-21 00:05
2003.09.15
Проблемы DCOM при работе в сети без контроллера домена


6-48672
eK
2003-07-14 22:32
2003.09.15
Как мне переделать аутентификацию на веб-сервере