Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.063 c
15-1338371588
Dmitry87
2012-05-30 13:53
2013.03.22
Windows XP -> VirtualBox -> Windows 8


15-1338817030
tesseract
2012-06-04 17:37
2013.03.22
Узнай какой-ты реформатор. Вообще забавно.


2-1337101522
опшипка
2012-05-15 21:05
2013.03.22
опшипка


15-1333612123
Хаус
2012-04-05 11:48
2013.03.22
Нарисовать кнопку в XP-стиле


15-1339971700
Дмитрий С
2012-06-18 02:21
2013.03.22
Предлагаю плохих людей называть футболистами :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский