![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Редактирование надписей в компоненте едит [D7]
Глеб © (2012-05-05 16:58:00)Добрый день!
Почти разобрался со своей проблемой, но есть одна просьба. Сейчас мой программный код добавляет/удаляет символы, но эти действия происходят в конце компонента, как сделать так что бы можно было в любой позиции это делать? Вот код
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var n : integer;
s : string;
begin
if Key=8 then begin
Edit1.Text:=copy(Edit1.Text,1, Length(Edit1.Text)-3);
Edit1.SelStart:=Length(Edit1.Text);
end;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
const
mask : set of char =['0'..'9' , 'a'..'z' , 'A'..'Z'];
begin
if not (Key in mask) then Key:=#0
else begin
Edit1.Text:=Edit1.Text + ' ,';
Edit1.SelStart:=Length(Edit1.Text) - 2;
end;
end;
Inovet (2012-05-06 08:24:00) [41]> [29] Глеб (05.05.12 22:09)
> попытался ввести 1234567890, а вышло 0 , 9 , 8 , 7 ,
Ты это и просил, после уточнения ещё и подтвердил.
Глеб (2012-05-05 23:51:00) [42]Медвежонок Пятачок Все отлично, рекомендую протестировать самому
Медвежонок Пятачок (2012-05-05 23:48:00) [43]выдели кусок текста в своем эдите.
затем не снимая выделения нажми букву "x"
Глеб (2012-05-05 23:42:00) [44]Медвежонок Пятачок не совсем понял что ты хотел сказать в этом сообщении и в сообщении на которые ссылаешь,но удаление работает у меня корректно, происходит только по дел и бэкспей. Если ты смог удалить символ в моей программе как то иначе прошу сказать. Код программы есть (39сообщение) - прошу протестирую
Медвежонок Пятачок (2012-05-05 23:36:00) [45]if Key=8 or 46 then begin
а теперь снова:
будут случаи, когда кей не равен ни тому ни другому, но символы из едита будут удаляться. Как в моем примере выше.
Глеб (2012-05-05 23:12:00) [46]KilkennyCat спасибо за совет буду думать, если сам не додумаю, можно к тебе обратиться
Глеб (2012-05-05 23:06:00) [47]MBo нет, мне надо именно так как я описывал выше. Хорошо, что сделал удаление работает классно, сам доволен. Посмотри, как работает может, где ошибся и не вижу.
procedure TForm3.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var n : integer;
s : string;
begin
if (Key=8) or (Key=46) then begin
S:=Edit1.Text;
n:=Edit1.SelStart;
Edit1.Text:=copy(S, 1, n-3)+copy(S, n+1, Length(S)-n);
Edit1.SetFocus;
Edit1.SelStart:=n-1;
end;
end;
end.
А вот с добавлением пока косяки идут
KilkennyCat (2012-05-05 23:04:00) [48]я же говорил, необходим контроль selstart. как только он захочет поменяться, проверяй и разрешай изменение если только в правильное место хочет.
и еще есть проблема мультиповтора при долгом нажатии.
MBo (2012-05-05 23:01:00) [49]Простой способ не подойдет?
В едит вводишь только нужные символы, а обработанный текст отображается отдельно
Глеб (2012-05-05 22:52:00) [50]KilkennyCat хм твой код действительно помогает, но есть нюанс. если скажем набрать 1245, то программа ответит 1 ,2 ,4 ,5 , вроде хорошо и даже можно вставить 3 между 2 и 4 программа ответит 1 ,2 ,3 ,4 ,5 , редактирование есть в любой позиции, НО если поставить курсор мыши в компоненте эдит сразу после цифры 2 то получиться 1 , 22, ,3 ,4 ,5 , надо сделать проверку на область добавления
Сам не знаю как
Глеб (2012-05-05 22:40:00) [51]KilkennyCat сейчас посмотрю твой код на добавление
Глеб (2012-05-05 22:39:00) [52]procedure TForm3.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var n : integer;
s : string;
begin
if Key=8 or 46 then begin
S:=Edit1.Text;
n:=Edit1.SelStart;
Edit1.Text:=copy(S, 1, n-3)+copy(S, n+1, Length(S)-n);
Edit1.SetFocus;
Edit1.SelStart:=n-1;
end;
end;
end.
процедура удаления символа + пробел + запятая из любой позиции под курсором мыши
Фух с этим справился
KilkennyCat (2012-05-05 22:29:00) [53]частичное решение:
procedure TForm1.edit1KeyPress(Sender: TObject; var Key: Char);
begin
edit1.Tag := edit1.SelStart;
end;
procedure TForm1.edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
s : string;
begin
s := edit1.Text;
Insert(' ,', s, edit1.Tag + 2);
edit1.Text := s;
edit1.selstart := edit1.Tag + 3;
edit1.SelLength := 0;
end;
Глеб (2012-05-05 22:17:00) [54]KilkennyCat да и я хочу послать, но мне нужно это условия заказа
KilkennyCat (2012-05-05 22:16:00) [55]можно, надо только разобраться, когда вообще изменяется selstart... и возможно, на onKeyUp придется вешать обработку. экспериментируй, и вообще, insert - это лишь вариант, возможны и другие решения. я бы, скорее всего, послал бы вдогонку эмуляцию нажатия клавиш пробела и запятую.
Глеб (2012-05-05 22:16:00) [56]KilkennyCat insert(key + ' ,', s, edit1.selstart - Length(Edit1.Text)+ 1); так работает более корректно, но опять если с позиционироваться на центе записи 1 , 3, 4, и поставить 2 то получиться 1 , 3 , 4 , 2 , то уходит в право(
Как же еня это уже достало
Глеб (2012-05-05 22:09:00) [57]попытался ввести 1234567890, а вышло 0 , 9 , 8 , 7 , и т.д. все наоборот, но есть редактирование, а можно сделать так чтобы было как у меня только + редактирование)
KilkennyCat (2012-05-05 22:04:00) [58]тьфу, опять ошибся.
insert(key + ' ,', s, edit1. selstart);
KilkennyCat (2012-05-05 22:03:00) [59]а... ошибся я, подводит память.
примерно так надо:
var
s : string;
begin
s := edit1.text;
insert(key + ' ,', s, edit1.text);
edit1.text := s;
key := #0;
end;
и скорее всего понадобится возвращать selstart в новую позицию.
Глеб (2012-05-05 22:01:00) [60][Hint] Unit3NactroikaCkanera.pas(276): Variable 's' is declared but never used in 'TForm3.Edit1KeyDown'
[Hint] Unit3NactroikaCkanera.pas(275): Variable 'n' is declared but never used in 'TForm3.Edit1KeyDown'
теперь выводит такую ошибку, но понять не могу, как эта надпись edit1.text := Insert(key + ' ,', edit1.text, edit1.selstart); притащила эти ошибки. Переменные n и s из другой процедуры и они локальные