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

Вниз

Вытащить часть текста из Memo   Найти похожие ветки 

 
Демерго   (2010-12-01 13:54) [0]

Всем привет!

Я хочу вытащить часть текста из Memo. Например:

Тест "Сегодня_хорошая_погода" и надо вытащить слово между "Сегодня_" и "_погода" и вставить в Edit. то есть чтобы текст в Edit = "хорошая".

Заранее большое спасибо!


 
Palladin ©   (2010-12-01 14:01) [1]

функция Pos обычно изучается еще в школе...


 
Palladin ©   (2010-12-01 14:02) [2]

... и функция Copy вместе с ней


 
Ega23 ©   (2010-12-01 14:04) [3]

1. Определиться, что такое "слово".
Набор символов, разделённых пробелом?
Набор символов, разделённых пробелом или спец.символами?
Набор символов, разделённых пробелом, спец.символами и знаками препинания?
Какой именно набор символов? "12пп45" - это слово или нет?

Ну а дальше разбить текст (Memo.Text) на массив "слов" и найти в нём разницу.
Второе - элементарная задачка для первого курса.
А вот с первым блоком - сложнее.


 
Медвежонок Пятачок ©   (2010-12-01 14:10) [4]

Можно проще.

Edit1.Text := "фиговая";
Memo1.Lines.text:= "Сегодня_" + Edit1.Text + "_погода";


 
Демерго   (2010-12-01 14:11) [5]

Дело в том что я никакие курсы не посещал, самоучка. Надеюсь на пример кода.

Ситуация такая что я знаю слово А и слово Б и мне надо вытянуть текст который находится между этими словами.


 
Медвежонок Пятачок ©   (2010-12-01 14:12) [6]

Дело в том что я никакие курсы не посещал, самоучка.

А чего ты самоучка?
Что именно успел самовыучить?


 
Демерго   (2010-12-01 14:13) [7]

я умею писать простенькие программы по примерам. не просто "скопировать код", а понять как оно работает и приспособить под свои нужды.


 
Ega23 ©   (2010-12-01 14:14) [8]


> Ситуация такая что я знаю слово А и слово Б и мне надо вытянуть
> текст который находится между этими словами.


Тебе весь текст нужен?
А если у тебя 2 раза такое сочетание встречается?
А если эти сочетания вложенные?

Например, слово А и Б:

123 А ппп Б лтвыалт А А А олдтлыфвтмапшрт Б Б Б вввв   АААБББ


 
Медвежонок Пятачок ©   (2010-12-01 14:14) [9]

ну замечательно.
выучи еще пару функций (что выше) и все будешь знать.


 
Медвежонок Пятачок ©   (2010-12-01 14:16) [10]

я умею писать простенькие программы по примерам. не просто "скопировать код"

В том смысле что не пользуешься (не умеешь?) буфером обмена, а переписываешь примеры?


 
Демерго   (2010-12-01 14:18) [11]

To Ega23:

Вот конкретный пример:

Привет</td><td style="width:40%; text-align:left;">1</td>

Мне нужно вытащить текст между Привет</td><td style="width:40%; text-align:left;"> и </td>


 
Демерго   (2010-12-01 14:20) [12]

то есть вырезанный текст должен быть = 1


 
Ega23 ©   (2010-12-01 14:23) [13]

Вот строка.

Привет</td><td style="width:40%; text-align:left;">2222 Привет</td><td style="width:40%; text-align:left;">1</td> </td>

Что у тебя должно получиться?


 
Демерго   (2010-12-01 14:24) [14]

В моем тексте только один раз встречается Привет</td><td style="width:40%; text-align:left;">

Проще говоря я могу задать уникальные А и Б между которыми надо вырезать текст


 
Демерго   (2010-12-01 14:26) [15]

а в твоем примере должно получится 2222 Привет


 
Ega23 ©   (2010-12-01 14:27) [16]


> Проще говоря я могу задать уникальные А и Б между которыми
> надо вырезать текст


два раза Pos, один раз Copy. Справку по обеим функциям можно вызвать по F1


 
Демерго   (2010-12-01 14:27) [17]

Программа находит текст А, после этого она копирует все символы в Edit пока не дойдет до текста Б


 
Медвежонок Пятачок ©   (2010-12-01 14:27) [18]

а можно небольшой пример?


 
stas ©   (2010-12-01 14:28) [19]

задаешь начало строки, конец, результат середина, если начало не найдено вернет начиная с 1-го символа.

Function StrCut (SourceString,StartStr,EndStr:String):String;
Var I,K:Integer; Strn:String;
begin
Result:="";
strn:=SourceString;
i:=Pos(StartStr,Strn);
   Strn:=Copy (Strn,i+Length(StartStr),Length(Strn)-Length(StartStr));
   i:=Pos(EndStr,Strn);
   if i=0 then
    begin
     i:=Length(Strn);
     K:=0;
    end else k:=Length(EndStr);
   Strn:=Copy (Strn,1,i-1);
 Result:=Strn;
end;


 
Ega23 ©   (2010-12-01 14:29) [20]


> Программа находит текст А, после этого она копирует все
> символы в Edit пока не дойдет до текста Б


Это не сочетается с

> а в твоем примере должно получится 2222 Привет


 
Ega23 ©   (2010-12-01 14:34) [21]


> stas ©   (01.12.10 14:28) [19]


1. В твоём коде ошибка.
2. Вычислять каждый раз Length(StartStr), Length(EndStr) - моветон.

Задача в целом, судя по всему, рекурсивная. Но не надо забывать, что строка неправильной может быть, типа A 111 A 222 B ddd A   fff B


 
Palladin ©   (2010-12-01 14:37) [22]

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


 
stas ©   (2010-12-01 14:41) [23]

1. В каком месте?
2. Согласен.


 
Ega23 ©   (2010-12-01 14:42) [24]


> Palladin ©   (01.12.10 14:37) [22]


У нас подобные задачки на первом курсе давали. Практика показала, что те, кто решил сам - стали программистами. Те, кто не решил - стали манагерами.


 
stas ©   (2010-12-01 14:43) [25]

Вообще для таких целей надо юзать RegExpr"ы. А вырезать уже предварительно обработанную строку.
RegExpr - регулярные выражения. Для Delphi есть бесплатная библиотека.


 
Демерго   (2010-12-01 14:45) [26]

Всем огромнейшее спасибо! особенно stas. Код уже присобачен и работает :)

Выглядит на примере так:

procedure TForm1.Button1Click(Sender: TObject);
var I5,K:Integer; Strn:String;
begin
strn:=form1.Memo1.Lines[0];
i5:=Pos("Me",Strn);
  Strn:=Copy (Strn,i5+Length("Me"),Length(Strn)-Length("Me"));
  i5:=Pos("o1",Strn);
  if i5=0 then
   begin
    i5:=Length(Strn);
    K:=0;
   end else k:=Length("o1");
  Strn:=Copy (Strn,1,i5-1);
Edit1.Text:=Strn;
end;

После выполнения выдает букву m


 
Ega23 ©   (2010-12-01 14:45) [27]


> stas ©   (01.12.10 14:41) [23]
>
> 1. В каком месте?


представь, что Pos(StartStr,Strn) равно 0.


 
stas ©   (2010-12-01 14:46) [28]

Демерго   (01.12.10 14:45) [26]
его надо было как функцию использовать ).


 
Ega23 ©   (2010-12-01 14:47) [29]


>  Код уже присобачен и работает :)


Теперь возьми и вместо "Me" задай стартовую строку "jsahbfjuhsafdyu"
И насладись.


 
Демерго   (2010-12-01 14:48) [30]

мне проще 10 раз этот код прописать и получить результат чем разбираться как эти функции потом вызывать правильно :)  Главное я получил что хотел и тебе спасибо что сразу дал пример


 
Демерго   (2010-12-01 14:49) [31]

то Ega23:

надеюсь это был не сарказм и все будет работать даже с такой строкой как "jsahbfjuhsafdyu" :)


 
Ega23 ©   (2010-12-01 14:49) [32]


> Демерго   (01.12.10 14:13) [7]
>
> я умею писать простенькие программы по примерам. не просто
> "скопировать код", а понять как оно работает и приспособить
> под свои нужды.



> Демерго   (01.12.10 14:48) [30]
>
> мне проще 10 раз этот код прописать и получить результат
> чем разбираться как эти функции потом вызывать правильно
> :)  Главное я получил что хотел и тебе спасибо что сразу
> дал пример


Быдлокодер детектед.


 
stas ©   (2010-12-01 14:50) [33]

Ega23 ©   (01.12.10 14:45) [27]
точно спасибо. )


 
Демерго   (2010-12-01 14:51) [34]

то Ega23:

я пишу ТОЛЬКО для себя и ни для кого более. Мне важен результат а не размер и скорость выполнения программы в миллисекундах. Но все равно спасибо на добром слове


 
Leonid Troyanovsky ©   (2010-12-01 22:51) [35]


> Демерго   (01.12.10 13:54)

RTFM: SelText.

--
Regards, LVT.


 
Inovet ©   (2010-12-02 00:41) [36]

> [34] Демерго   (01.12.10 14:51)
> я пишу ТОЛЬКО для себя и ни для кого более. Мне важен результат
> а не размер и скорость выполнения программы

Так не сколрость и размер, а сам же потом и наступишь в этот код десять раз.


 
Демерго   (2010-12-02 14:59) [37]


> stas ©


Надеюсь еще на одну твою подсказку по следующему вовпросу:

procedure TForm1.Button1Click(Sender: TObject);
var I5,K:Integer; Strn:String;
begin
strn:=form1.Memo1.text;
i5:=Pos("Me",Strn);
 Strn:=Copy (Strn,i5+Length("Me"),Length(Strn)-Length("Me"));
 i5:=Pos("o1",Strn);
 if i5=0 then
  begin
   i5:=Length(Strn);
   K:=0;
  end else k:=Length("o1");
 Strn:=Copy (Strn,1,i5-1);
Edit1.Text:=Strn;
end;

Код выдает то что находится между "Me" и "o1" только в том случае если "Me" или "o1" находятся в одной строке. То есть если в случае "Me" буква М будет в строке(1) а буква е в строке(2) то код не воспринимает это как одно целое.

Пример.

есть слово memo.line[0]="Метаболизм".

В коде прописываем вырезать между "Ме" и "изм". Получаем "табол".

Но если слово записано в в двух строках:

memo.line[0]="М".
memo.line[1]="етаболизм".

то код уже не дает нужного результата.

Можно как-то слить все memo.line в одну строку, чтобы небыло этих разрывов? или возможно есть какое-то другое решение


 
Ega23 ©   (2010-12-02 15:04) [38]


> Демерго


Чукча не читатель. Я тебе на этот вопрос уже отвечал.
Но ты его проигнорировал, выпрашивая код.

На месте stas я бы не отвечал.


 
stas ©   (2010-12-02 15:05) [39]

да т.к. между "М" и "e" есть непечатаемые символы их можно помоему #13#10 точно незнаю. Их можно исключить с помощью
Text:=StrUtils.AnsiReplaceStr(memo1.text,#13#10,"");
Типа такого что-то.


 
stas ©   (2010-12-02 15:10) [40]

Демерго   (02.12.10 14:59) [37]
Честно говоря Ega23 прав нужно разобраться т.к. одно дело работать с простой строкой, другое дело парсить html. У тебя будут возникать все новые и новые проблемы, твой код начнет обрастать подпорками, потом ты в нем не разберешься.



Страницы: 1 2 вся ветка

Текущий архив: 2011.02.20;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.013 c
2-1291178663
Василич
2010-12-01 07:44
2011.02.20
Обработчик ошибок TWordApplication


15-1289338193
Юрий
2010-11-10 00:29
2011.02.20
С днем рождения ! 10 ноября 2010 среда


15-1289683791
Юрий
2010-11-14 00:29
2011.02.20
С днем рождения ! 14 ноября 2010 воскресенье


15-1289651203
Медвежонок Пятачок
2010-11-13 15:26
2011.02.20
вопрос ембеддерщикам (ардуино)


15-1289199247
Лесенок
2010-11-08 09:54
2011.02.20
Получить IP клиента с Interbase v.6.5