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

Вниз

Редактирование надписей в компоненте едит   Найти похожие ветки 

 
Глеб   (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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.082 c
1-1297343566
neversleep
2011-02-10 16:12
2013.03.22
TListView. Setfocus внутри OnSelectItem


2-1336658934
ignatich70
2012-05-10 18:08
2013.03.22
БД+Клиент/Сервер


15-1352372205
Scott Storch
2012-11-08 14:56
2013.03.22
как обозвать action


10-1178194054
Егоров А.Н.
2007-05-03 16:07
2013.03.22
Копирование формата ячейки в Excel из Delphi


15-1350235025
Inovet
2012-10-14 21:17
2013.03.22
Прыжок из стратосферы. Трансляция.