Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.02.20;
Скачать: [xml.tar.bz2];

Вниз

Вытащить часть текста из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.004 c
2-1290689216
FIL-23
2010-11-25 15:46
2011.02.20
Передача edita в собственную процеду.


2-1290766482
cross
2010-11-26 13:14
2011.02.20
AccessViolation


9-1188473601
@!!ex
2007-08-30 15:33
2011.02.20
Загрузочный экран.


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


2-1290774813
Scott Storch
2010-11-26 15:33
2011.02.20
интерфейсы и осбождение памяти





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский