Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   удалить все русские буквы из текста. как? (https://forum.antichat.xyz/showthread.php?t=168858)

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/...6fa7d38a45.jpg

Linkus 07.01.2010 19:45

0_o те не лень было все эти чекбоксы ставить??

Fata1ex 07.01.2010 21:40

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

1n0y 08.01.2010 00:14

Цитата:

Сообщение от Fata1ex
эээ на будущее - это решается одним текстовым полем, в которое юзер вбивает нужные символы для замены...
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
вот наилучшая реализация такой проги: скриншот
Код для 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

Цитата:

Сообщение от Markus_13
обычно у меня строка такойже длины как окно компилятора

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


Время: 23:10