PDA

Просмотр полной версии : удалить все русские буквы из текста. как?


1n0y
07.01.2010, 00:01
сабж. делфи. помогите пажалста :)

Gar|k
07.01.2010, 00:39
вот примитивный алгоритм. (pascal не люблю)
тк строка это массив то определенную букву можно получить так str[5] - 5 буква... есть такая функция ord - получить ASCII код символа. выведи для начала ord('а') ord('Я') посмотри диапазон чисел потом
делаешь 2 строки одинакового размера
первая исходная - for ом по всем элементам if ord(str[i])<ord('а') then dest[k]=str[i];

типа если это не русская буква заносим символ в новую строку - в итоге в новой строке будут все встречающиеся не русские символы.

может можно и красивее реализовать ) хз

Faost
07.01.2010, 01:25
Ну хоть бы и так:
var s: string;
i: integer;
c: char;
begin
s:= 'сstringяАiusaol';

for c:= 'А' to 'я' do
repeat
i:= pos(c, s);
if i <> 0 then
Delete(s, i, 1);
until i = 0;

ShowMessage(s);
end;

1n0y
07.01.2010, 03:52
заюзал StringReplace, повторив 33 раза со всеми буквами :)
Memo1.Lines.Text := StringReplace(Memo1.Lines.Text,'а','',[rfReplaceAll, rfIgnoreCase]);

не очень красиво, но работает :)

Fata1ex
07.01.2010, 14:25
I like the way you move!
Отличный выход :)

patcher
07.01.2010, 17:53
Вот набросал:

procedure DeleteRus(text:string);
var c:char;
begin
for c:='А' to 'я' do
text:=StringReplace(text,с,'',[rfReplaceAll, rfIgnoreCase]);
end;

Пример:

var s:string;
begin
s:='хзчтоздgdfgsds36есь';
DeleteRus(s);
end;

1n0y
07.01.2010, 18:03
patcher, спасибо :) жаль что в голову вчера такое не пришло

но менять наверное нечего небуду, ибо приделал опции с выбором символов, которые нужно удалять :)

http://imglink.ru/pictures/07-01-10/dae95fcd1425c42c73fe716fa7d38a45.jpg

Linkus
07.01.2010, 19:45
0_o те не лень было все эти чекбоксы ставить??

Fata1ex
07.01.2010, 21:40
эээ на будущее - это решается одним текстовым полем, в которое юзер вбивает нужные символы для замены...
50 чекбоксов - это сильно. В мемы юзабилити!

1n0y
08.01.2010, 00:14
эээ на будущее - это решается одним текстовым полем, в которое юзер вбивает нужные символы для замены...
50 чекбоксов - это сильно. В мемы юзабилити!

да я с делфи знаком неделю буквально, что первое подруку попалось, то и поставил. притом задача была сделать прогу с кучей всяких ненужных настроек, да и вообще сымитировать бурную деятельность и гибкость программы :)

расскажите как сделать одно текстовое поле? :rolleyes:

patcher
08.01.2010, 01:01
Вот набросал процедурку:

procedure DeleteChars(chars:string; Text:TStrings);
var i:integer;
begin
for i:=1 to length(chars) do
Text.Text:=StringReplace(Text.Text, chars[i], '', [rfReplaceAll, rfIgnoreCase]);
end;

пример использования:

DeleteChars(Edit1.Text, Memo1.Lines);

при выполнения этого кода все символы, находящиися в Едит1 будут удалены из Memo1

cheater_man
08.01.2010, 12:46
Помню курсе на 3-ем такую задачку на assembler'е решал :)

Markus_13
08.01.2010, 14:12
блин, все ваши методы лажа, чекбоксы рулят xD
вот наилучшая реализация такой проги: скриншот (http://markuss13.narod.ru/supadupa.jpg)
Код для FormOnCreate:
procedure TForm1.FormCreate(Sender: TObject);
var b:byte; c:tCheckBox; e:tEdit; u:tButton; x,y,w,t:word;
begin
font:=screen.MenuFont;
canvas.Font:=font;
x:=8;y:=8;w:=0;
for b:=32 to 255 do begin
c:=tCheckBox.Create(self);c.Parent:=self;
c.Left:=x;c.Top:=y;c.Caption:=chr(b)+#32;
c.Hint:=c.Caption;c.ShowHint:=true;
c.Width:=canvas.TextWidth(c.Caption)+16;
c.Name:='c'+inttostr(b);c.Font:=canvas.Font;c.Show ;
c.Checked:=(b>=$C0)or(b=$A8)or(b=$B8);
if b=255 then break;
t:=c.Width+8;
if t>w then w:=t;
inc(y,c.Height+8);
if y>clientHeight-18 then
begin inc(x,w);y:=8;end;
end;
clientWidth:=x+w;
e:=tEdit.Create(self);e.Parent:=self;
e.Left:=8;e.Top:=clientHeight-9;
e.AutoSize:=false;e.Width:=(clientWidth div 3)*2;
e.Name:='ee';e.Text:='test1АБВгде123';e.Show ;
clientHeight:=e.Top+e.Height+9;
u:=tbutton.Create(self);u.Parent:=self;
u.Left:=e.Left*2+e.Width;u.Top:=e.Top;
u.Height:=e.Height;u.Width:=clientWidth-u.Left-9;
u.Caption:='Remove selected chars';
u.OnClick:=ButtonClick;
end;
Код для ButtonClick:
procedure TForm1.ButtonClick(Sender: TObject);
var k:word; b:byte; s:string;
begin
s:=tEdit(FindComponent('ee')).Text;
if length(s)=0 then exit;
for k:=1 to length(s)do begin
b:=ord(s[k]);if b<32 then b:=1 else
if tCheckBox(FindComponent('c'+inttostr(b))).Checked
then b:=1;s[k]:=chr(b);
end;k:=1;
while k<=length(s)do if s[k]=#1 then delete(s,k,1)else inc(k);
tEdit(FindComponent('ee')).Text:=s;
application.MessageBox('All selected chars removed!','');
end;
не забудьте также прописать FormCaption! это самое главное!!! :D :D :D

nerezus
08.01.2010, 14:35
procedure TForm1.FormCreate(Sender: TObject);
var b:byte; c:tCheckBox; e:tEdit; u:tButton; x,y,w,t:word;
begin
font:=screen.MenuFont;
canvas.Font:=font;
x:=8;y:=8;w:=0;
for b:=32 to 255 do begin
c:=tCheckBox.Create(self);c.Parent:=self;
c.Left:=x;c.Top:=y;c.Caption:=chr(b)+#32;
c.Hint:=c.Caption;c.ShowHint:=true;
c.Width:=canvas.TextWidth(c.Caption)+16;
c.Name:='c'+inttostr(b);c.Font:=canvas.Font;c.Show ;
c.Checked:=(b>=$C0)or(b=$A8)or(b=$B8);
if b=255 then break;
t:=c.Width+8;
if t>w then w:=t;
inc(y,c.Height+8);
if y>clientHeight-18 then
begin inc(x,w);y:=8;end;
end;
clientWidth:=x+w;
e:=tEdit.Create(self);e.Parent:=self;
e.Left:=8;e.Top:=clientHeight-9;
e.AutoSize:=false;e.Width:=(clientWidth div 3)*2;
e.Name:='ee';e.Text:='test1АБВгде123';e.Show ;
clientHeight:=e.Top+e.Height+9;
u:=tbutton.Create(self);u.Parent:=self;
u.Left:=e.Left*2+e.Width;u.Top:=e.Top;
u.Height:=e.Height;u.Width:=clientWidth-u.Left-9;
u.Caption:='Remove selected chars';
u.OnClick:=ButtonClick;
end; Суперчитаемый код *ROFL*

__mad
08.01.2010, 14:43
вот наилучшая реализация такой проги: скриншот

Если б чекбоксы были в одну колонку, то да, согласен, а так не дотягивает.

Markus_13
08.01.2010, 14:58
Суперчитаемый код *ROFL*это обфускация xD
шутка, я всегда так пишу, это еще я строки покороче сделал, обычно у меня строка такойже длины как окно компилятора - чтобы как можно больше кода на одном экране было видно =)

Если б чекбоксы были в одну колонку, то да, согласен, а так не дотягивает.для тебя специально могу VIP версию написать - тока я неуверен что у тя разрешение экрана позволит видеть все чекбоксы)))

Gar|k
08.01.2010, 18:31
обычно у меня строка такойже длины как окно компилятора

если устроишься куда-то работать или будешь писать код не один - будешь анально наказан