Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизРедактирование надписей в компоненте едит Найти похожие ветки
← →
Глеб (2012-05-05 16:58) [0]Добрый день!
Почти разобрался со своей проблемой, но есть одна просьба. Сейчас мой программный код добавляет/удаляет символы, но эти действия происходят в конце компонента, как сделать так что бы можно было в любой позиции это делать? Вот код
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;
← →
Cobalt © (2012-05-05 17:02) [1]Ты, мил человек, сначала опиши, что ты хочешь получить,
а то код активно скрывает смысл :-)
← →
Глеб (2012-05-05 17:23) [2]Все предельно просто. Мой программный код делает редактирование в конце строки едита, а мне нужно везде. т.е. если ты написал 1245 в моем едите и вспомнил, что пропустил 3 ты не сможешь вставить 3 туда куда нужно так как едет запихнет в конец 12453.
Вот мне и нужна помощь, что бы высчитывать позицию под курсором и проводить редактирование там где и положенно
← →
Медвежонок Пятачок © (2012-05-05 17:34) [3]это, я так понимаю, программа для пользователей с ампутированными пальцами рук?
← →
Юрий Зотов © (2012-05-05 17:37) [4]
> Глеб (05.05.12 17:23) [2]
См. свойства SelStart, SelLength, SelText.
Но возникает вопрос - а зачем нужен такой компонент? Не лучше ли использовать стандартный? Он такими закидонами не страдает.
← →
KilkennyCat © (2012-05-05 18:01) [5]
> 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;
достаточно
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;
end;
и тогда не будет только в конец строки
← →
глеб (2012-05-05 18:25) [6]KilkennyCat так то понятно, что ты избавишь меня от проблемы частичного редактирования, но мне важна строка > Edit1.Text:=Edit1.Text + " ,"; Поэтому если у тебя есть дополнительные идеи прошу их озвучить.
← →
Медвежонок Пятачок © (2012-05-05 18:29) [7]лучше сосредоточится на обработке введенного, а не на введении символов за юзера. полезнее будет в сто раз.
← →
Медвежонок Пятачок © (2012-05-05 18:31) [8]if not (Key in mask) then Key:=#0;
бакспейс, дел, стрелки .....
← →
KilkennyCat © (2012-05-05 18:46) [9]
> важна строка > Edit1.Text:=Edit1.Text + " ,";
в процессе ввода строки, или потом, при обработке строки?
← →
Cobalt © (2012-05-05 19:01) [10]Глеб, абсолютносовершенно непонятно, как именно ты хочешь обрабатывать строку в конмпоненте.
Т.е. Ты говоришь "Я делать хочу"
ответ - дык, делай, никто не мешает.
Ты: я не только тут делать хочу, но и там делать хочу.
А что именно ты хочешь - дом строить, руду плавить, тачать сапоги или печь хлеб - ты упорно скрываешь.
Исходно какая задача?
← →
глеб (2012-05-05 19:32) [11]KilkennyCat и при вводе символов и при удалении.
Cobalt мне надо сделать так чтобы в эдит вводились только анг. буквы и цифры. При вводе буквы программу должна сама поставить пробел и запятую.
вот так с ,
При удалении нужно чтобы удалилась буква пробел и запятая.
Я смог этого достичь, но нужно проводить редактирование в позиции под курсором, а у меня только последние элементы редактируются
← →
Медвежонок Пятачок © (2012-05-05 19:35) [12]тебе же уже сказали. позиция курсора - это селстарт
← →
глеб (2012-05-05 19:42) [13]Медвежонок Пятачок так я не знаю, как его использовать чтобы он мне помог в решении проблемы
← →
Юрий Зотов © (2012-05-05 20:08) [14]
> глеб (05.05.12 19:42) [13]
А справки у Вас разве нет? Там по поводу SelStart все сказано.
← →
Медвежонок Пятачок © (2012-05-05 20:15) [15]кстати, позиция курсора ему в общем случае не поможет.
например введено:
a ,b ,23c ,
выделяем часть строки и нажимаем букву d
получаем:
d ,23c ,
что здесь надо удалить?
← →
Медвежонок Пятачок © (2012-05-05 20:21) [16]второй хитрый вопрос:
как вообще в предыдущем сценарии понять, что я что-то удалил?
я не нажимал ни дел, ни бэкспейс. Если бы выделение было не столь удачным, то постобработка потребовалась бы.
а ни дела ни бекспейса не было
← →
KilkennyCat © (2012-05-05 20:57) [17]ну, пока четкой формулировки задачи не видно - решения нет.
← →
Глеб (2012-05-05 21:20) [18]KilkennyCat я вам рассказал, что мне надо если что то не понятно давайте подробно объясню
Медвежонок Пятачок сожалею, но я не понял, что ты написал.
Давайте я вам повторю. Мне надо чтобы при вводе с клавиатуры анг. символа скажем "g" программа вела в эдит "g ," при удалении пользователь наживает один раз на бэкспейс ("key = 8" - код операции удаления), а программа удалит символ + пробел + запятую.
Я смог добиться этого, НО все эти действия происходят на конце записи эдита т.е. нельзя сфокусироваться на середине и удалить/добавить символ в центре. Весть процесс редактирования происходит на конце.
Поэтому я прошу мне помочь с редактором записи, что бы можно было
проводить операции под курсором мыши, а не в самой правой части.
вод код удаления:
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;
← →
KilkennyCat © (2012-05-05 21:39) [19]то есть у тебя любой алфавитно-цифровой символ должен заменяться комбинацией этот символ-пробел-запятая? и вся обработка таким макаром?
отследить все перемещения курсора, разрешая попадать лишь в места x * 3. удаление, выделение так же тройное.
← →
Глеб (2012-05-05 21:42) [20]если я тебе правильно понял, Константин, то ДА
← →
Глеб (2012-05-05 21:45) [21]KilkennyCat ты лучше в дельфи скопирую мой код, поставь эдит и два события
KeyPress и KeyDown все сразу станет понятнее.
← →
KilkennyCat © (2012-05-05 21:48) [22]ну дык напиши проверку selstart и sellength чтобы всегда выполнялось условие позиционирования. от стрелок и от мыши. и на удаление чтоб три символа сразу. и проверку буфера, если вставка разрешена.
← →
Глеб (2012-05-05 21:52) [23]KilkennyCat ох ёё я на дельфи 5 день работаю еще не очень грамотный в этом плане если мог бы сделать сам на форум не писал бы. Мне желательно получить переделанный код
← →
KilkennyCat © (2012-05-05 21:53) [24]в примитивном варианте ввод клавиши:
edit1.text := Insert(key + " ,", edit1.text, edit1.selstart);
← →
Глеб (2012-05-05 21:55) [25]KilkennyCat это на ввод клавиши, сейчас посмотрю в проекте, как оно работает
← →
Глеб (2012-05-05 22:01) [26][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 из другой процедуры и они локальные
← →
KilkennyCat © (2012-05-05 22:03) [27]а... ошибся я, подводит память.
примерно так надо:
var
s : string;
begin
s := edit1.text;
insert(key + " ,", s, edit1.text);
edit1.text := s;
key := #0;
end;
и скорее всего понадобится возвращать selstart в новую позицию.
← →
KilkennyCat © (2012-05-05 22:04) [28]тьфу, опять ошибся.
insert(key + " ,", s, edit1.selstart);
← →
Глеб (2012-05-05 22:09) [29]попытался ввести 1234567890, а вышло 0 , 9 , 8 , 7 , и т.д. все наоборот, но есть редактирование, а можно сделать так чтобы было как у меня только + редактирование)
← →
Глеб (2012-05-05 22:16) [30]KilkennyCat insert(key + " ,", s, edit1.selstart - Length(Edit1.Text)+ 1); так работает более корректно, но опять если с позиционироваться на центе записи 1 , 3, 4, и поставить 2 то получиться 1 , 3 , 4 , 2 , то уходит в право(
Как же еня это уже достало
← →
KilkennyCat © (2012-05-05 22:16) [31]можно, надо только разобраться, когда вообще изменяется selstart... и возможно, на onKeyUp придется вешать обработку. экспериментируй, и вообще, insert - это лишь вариант, возможны и другие решения. я бы, скорее всего, послал бы вдогонку эмуляцию нажатия клавиш пробела и запятую.
← →
Глеб (2012-05-05 22:17) [32]KilkennyCat да и я хочу послать, но мне нужно это условия заказа
← →
KilkennyCat © (2012-05-05 22:29) [33]частичное решение:
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:39) [34]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.
процедура удаления символа + пробел + запятая из любой позиции под курсором мыши
Фух с этим справился
← →
Глеб (2012-05-05 22:40) [35]KilkennyCat сейчас посмотрю твой код на добавление
← →
Глеб (2012-05-05 22:52) [36]KilkennyCat хм твой код действительно помогает, но есть нюанс. если скажем набрать 1245, то программа ответит 1 ,2 ,4 ,5 , вроде хорошо и даже можно вставить 3 между 2 и 4 программа ответит 1 ,2 ,3 ,4 ,5 , редактирование есть в любой позиции, НО если поставить курсор мыши в компоненте эдит сразу после цифры 2 то получиться 1 , 22, ,3 ,4 ,5 , надо сделать проверку на область добавления
Сам не знаю как
← →
MBo © (2012-05-05 23:01) [37]Простой способ не подойдет?
В едит вводишь только нужные символы, а обработанный текст отображается отдельно
← →
KilkennyCat © (2012-05-05 23:04) [38]я же говорил, необходим контроль selstart. как только он захочет поменяться, проверяй и разрешай изменение если только в правильное место хочет.
и еще есть проблема мультиповтора при долгом нажатии.
← →
Глеб (2012-05-05 23:06) [39]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.
А вот с добавлением пока косяки идут
← →
Глеб (2012-05-05 23:12) [40]KilkennyCat спасибо за совет буду думать, если сам не додумаю, можно к тебе обратиться
Страницы: 1 2 3 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.09 c