Форум: "Основная";
Текущий архив: 2003.09.15;
Скачать: [xml.tar.bz2];
ВнизАвтозавершение строки при введении её в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c