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

Вниз

Как удалить в тексте из 3-х строк первые 2 строки?   Найти похожие ветки 

 
azl ©   (2006-12-01 00:40) [0]

Доброго времени суток.
Подскажите, пожалуйста, как можно в тексте из 3-х  строк (2-я пустая)удалить первую и пустую строки?
Например, такой текст:

Эту строку нужно уалить

А вот эту строку оставить


Принцип удаления понятен. Можно использовать, например, Delete.

Delete("строка", 0, "А здесь нужно указать, что удалять нужно все до начала 3-й строки");

Как можно определить начало нужной мне строки?

Спасибо.


 
Джо ©   (2006-12-01 00:46) [1]

Чем разделяются строки?


 
azl ©   (2006-12-01 00:59) [2]

Все, спасибо. Сам допетрал. Вот код, может кому пригодится:

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
begin
 i := 0;
 while (i <> Length(Label1.Caption)) do begin
   if Copy(Label1.Caption, i,1) = #13 then
     Memo1.Text := Copy(Label1.Caption, i+2, Length(Label1.Caption));
     i:=i+1;
 end;
end;

Джо, как чем? А что из примера не видно? После 1-й строки нажат 2 раза Enter.


 
Джо ©   (2006-12-01 01:01) [3]

> Джо, как чем? А что из примера не видно?

Было бы видно, не спрашивал бы, наверное.


 
Джо ©   (2006-12-01 01:02) [4]

П.С.
Код в [2] — плох.


 
azl ©   (2006-12-01 01:09) [5]

Чем плох? Как можно сделать лучше?


 
Германн ©   (2006-12-01 02:11) [6]


> azl ©   (01.12.06 01:09) [5]
>
> Чем плох? Как можно сделать лучше?
>

И чем от только не плох?
Первое, навскидку. В первой итерации проверяется "нулевой! символ строки!


 
azl ©   (2006-12-01 10:56) [7]

Германн, и что здесь страшного? Ну, можно i := 1, уж в этом точно ничего плохого нет.
Буду только рад, если кто-то предложит лучший вариант чем этот.


 
Сергей М. ©   (2006-12-01 11:03) [8]


> Буду только рад, если кто-то предложит лучший вариант чем
> этот.


StringList.Text := Label1.Caption;
Memo1.Text := StringList[2];


 
azl ©   (2006-12-01 11:32) [9]

Сергей М., пример хороший, спасибо. Только с использованием StringList.
А если используется только текстовая переменная и Memo?
Например:
S :="Эту строку нужно уалить"+#13#13+"А вот эту строку оставить";

#13#13 - я вставил для примера, чтобы показать, в каком виде на самом деле переменной присваивается текст.

Эту строку нужно уалить

А вот эту строку оставить


 
Anatoly Podgoretsky ©   (2006-12-01 15:42) [10]

> azl  (01.12.2006 10:56:07)  [7]

Delete(S, 1, N);


 
Сергей М. ©   (2006-12-01 15:44) [11]


> Только с использованием StringList.


А чем оное не устраивает тебя ?

Зачем дублировать код уже рреализованного в классе TStringList аналогичного по функциональности алгоритма ?


 
azl ©   (2006-12-01 18:16) [12]


> Anatoly Podgoretsky ©

Дело в том, что N, как раз и не известно. N каждый раз будет, в моем случае, разное.


> Сергей М. ©

Попытался использовать вариант, который ты предложил:
procedure TForm1.Button1Click(Sender: TObject);
var
StringList: TStringList;
begin
 StringList.Text := Label1.Caption;
 Memo1.Text := StringList[2];
end;


Выдается сообщение об ошибке Access Violation at Address ....
У меня bds 2006. Что я не так делаю? Надеюсь, что ошибка не в ДНК.


 
Джо ©   (2006-12-01 18:20) [13]

> [12] azl ©   (01.12.06 18:16)
> Выдается сообщение об ошибке Access Violation at Address
> ....
> У меня bds 2006. Что я не так делаю? Надеюсь, что ошибка
> не в ДНК.

Нет, не в ДНК, а в отсутствии базовых знаний. Перед использованием экз. объекта, его нужно создать, т.е:
StringList := TStringList.Create;
try
 // тут используем
finally
 StringList.Free;
end;


 
azl ©   (2006-12-01 18:36) [14]

Ага, нашел ошибку. Сначала нужно создать TStringList.
StringList := TStringList.Create;


 
azl ©   (2006-12-01 18:38) [15]


> Джо ©

Не увидел ответа. Спасибо.


 
Джо ©   (2006-12-01 18:38) [16]

> [14] azl ©   (01.12.06 18:36)
> Ага, нашел ошибку. Сначала нужно создать TStringList.

Не только создать. Но создать, использовать и уничтожить правильно :) См. схему в [13].


 
azl ©   (2006-12-01 18:39) [17]

Джо ©, только не надо обвинять, я и сам разобрался.


 
Джо ©   (2006-12-01 18:42) [18]

>
>
> [17] azl ©   (01.12.06 18:39)
> Джо ©, только не надо обвинять, я и сам разобрался.

Где ты увидел какие-то "обвинения"? Я стандартную схему работу с объектами показал, чтобы не было потом вопросов по утечке памяти и прочим прелестям.


 
azl ©   (2006-12-01 18:43) [19]

Все равно, мне мой вариант нравится больше, т.к. все сделано руками, а не тупо взято уже готовое. Может быть и плохо, но свое.

Спасибо всем.


 
azl ©   (2006-12-01 18:46) [20]

Джо ©, пардон если обидел, не хотел.
Просто задело слегка:

> а в отсутствии базовых знаний

Все это я знаю, просто не сориентировался сразу.


 
Джо ©   (2006-12-01 19:12) [21]

>
>
> [20] azl ©   (01.12.06 18:46)
> Джо ©, пардон если обидел, не хотел.
> Просто задело слегка:
>
> > а в отсутствии базовых знаний
>
> Все это я знаю, просто не сориентировался сразу.

Ничего предосудительного в отсутствии некоторых, пусть даже "базовых", знаний — нет. Предосудительным может быть только нежелание их воспринять, но это уже как раз из области "ДНК", которой я касаться не намерен.
А отсутствие "базовых знаний" совершенно очевидно. Смотрим [2] azl ©, даже не разбирая алгоритм.
1. Элементы строки нумеруются с 0, а не с еденицы.
2. Доступ к символам строки целесообразней оформлять по индексу, т.е., S[I], а не городить целую функцию Copy (для копирования одного символа!).
3. На платформе Windows строки разделяются парой символов #13#10, а не только #13, как в Юникс.
4. Неоправдан цикл while вместо for.
и т.д. и т.п.


 
azl ©   (2006-12-01 20:25) [22]

ОК, значит объясню суть всего этого. И разберем мои знания.
Зачем мне это нужно и что я хочу?
Я пишу програмку для отправки/приема сообщений по сети. Следовательно, при приеме сообщений приходит сообщение от NET SEND в виде:

Сообщение от ОТПРАВИТЕЛЬ для ПОЛУЧАТЕЛЬ на 01.12.2006 18:45:56

Тест
Проветка
связи


Я хочу, чтобы первая строка отсекалась. Вроде бы сделал (пример, который я привел). Но тут появились еще грабли, текст сообщения может состоять из нескольких строк, а не из одной, поэтому первый приведенный мною код и код предложенный Сергей М. отпадают, как неправильные. При вышеприведенных кодах выдавалась бы только одна строка из 3-х (связи).

Далее следует ответ на 4-й пункт твоего разбора. Цикл с предусловием while я заменил на цикл for
...
     
var
 p: PAnsiChar;
....
....
 a := 0;
 for i := 1 to Length(string(pstr)) do begin
   if (string(pstr)[i] = #13) and (a = 0) then
    begin
       MainForm.RxRichEdit1.Text := Copy(string(pstr), i + 4, Length(string(pstr)));
      a := a + 1;
 end;
...

Думаю, что ввод переменной "а" не нужно объяснять.

Отвечу на 1-й пункт. Нас так учили в институте. Честно говоря, разницы не вижу. В чем разница? Дольше? Ну, извините меня, слава богу не на 186 машинах работаем. Думаю, что это не тяжкий грех.

2. Согласен, замечание правильное. Но тоже сразу не пришло на ум. Здесь ведь как, что первое на ум пришло, то и пишешь, а потом уже исправляешь. Хотя убрав Copy, выражение стало не намного меньше. Если подставить вместо переменной string(pstr) - Label1.Caption то получится практически то же самое (Label1.Caption)[i] = #13.
И что оно намного проще чем Copy(Label1.Caption, i,1) = #13?

3. А ты попробуй подставить вместо #13 - #13#10 будет ли работать? Не будет.
Для сведения, #10 - перевод каретки вначало строки. Так на какой ляд это нужно в моем случае? (Это на тот случай, чтобы приобрести самому "базовые знания")

Вот тебе и отсутствие "базовых знаний". А не ошибается только тот, кто не работает.


 
Virgo_Style ©   (2006-12-01 23:36) [23]

azl ©   (01.12.06 20:25) [22]
Нас так учили в институте.


Значит, неправильно учили. В данном случае - не тяжкий, в общем случае - более чем. А разнца - в том, что неправильно.


> И что оно намного проще

Да.


> А ты попробуй подставить вместо #13 - #13#10 будет ли
> работать? Не будет.

Значит, надо исправлять программу, однако.


 
Gydvin ©   (2006-12-02 08:13) [24]


>  Так на какой ляд это нужно в моем случае? (Это на тот случай,
>  чтобы приобрести самому "базовые знания")

Угу #13 вырезаем, а #10 некуда не исчезает, он остается в тексте, и тупо его замусоривает.


 
Loginov Dmitry ©   (2006-12-02 12:31) [25]

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

Совет: слушай все-таки, что говорят профи и не упрямствуй.


 
azl ©   (2006-12-02 16:31) [26]

Всем спасибо за советы.
Virgo_Style ©
1. Ну, меня общий случай мало интересует сейчас. Но к сведению принял.
А зачем, если работает.
2. Ну, пусть будет, если проще. Я так и написал, как проще.
3. Зачем что-то исправлять если работает? Если скажешь почему не рабоает (приведи рабочий пример), с удовольствием исправлю.

Loginov Dmitry © Ну, к начинающим можно отнести любого в той или иной сфере программирования. Хотя я уже программирую лет 10, но слушаю с удовольствием. А если люди просто говорят, что плохо, неправильно, без всяких обоснований, я такое не люблю.
Если говоришь, почему нужно начинать с единицы, а не с нуля напиши почему, приведи пример. А просто говорить, что не правильно - не серьезно.


 
azl ©   (2006-12-02 16:42) [27]

Вопрос ко всем, кто утверждает, что надо начинать с единицы сканировать строку с 1, а не с 0. А с какой цифры все индексы начинаются в Паскале? С 0 или с 1? Вот и ответ на ваш вопрос.
Считаю, что данная тема решена и дальнейшее ее обсуждение не имеет смысла.
Модераторы, закройте, пожалуйста, эту тему ибо дальнейшее обсуждение не касается темы.


 
Palladin ©   (2006-12-02 16:51) [28]


> [27] azl ©

Строки в паскале с испокон веков начинались с 1, а не с 0, о чем и сказано в справке. Однако с 0 начинаются динамические массивы, вновь прибывшиве в Делфи.

P.S. Спесь поубавь, коли опыта не имеешь и к справке не привычен.


 
Anatoly Podgoretsky ©   (2006-12-02 20:09) [29]

> azl  (02.12.2006 16:31:26)  [26]

> Если говоришь, почему нужно начинать с единицы, а не с нуля напиши почему, приведи пример. А просто говорить, что не правильно - не серьезно.

Не серьезно, чего то требовать, а если не дали, то игнорировать.


 
Anatoly Podgoretsky ©   (2006-12-02 20:09) [30]

> azl  (02.12.2006 16:42:27)  [27]

> А с какой цифры все индексы начинаются в Паскале? С 0 или с 1?

Ну и с какой по твоему?


 
Anatoly Podgoretsky ©   (2006-12-02 20:10) [31]

> Palladin  (02.12.2006 16:51:28)  [28]

Еще один озабоченый, который считает, что ему все должны.


 
Loginov Dmitry ©   (2006-12-02 21:58) [32]

> Хотя я уже программирую лет 10


И что это меняет?


 
azl ©   (2006-12-02 23:40) [33]

Anatoly Podgoretsky © c 0.

Строка — это последовательность символов. При использовании в выражениях строка обязательно заключается в апострофы. Количество символов в строке (длина строки) может динамически изменяться от 0 до 255. Определение строкового типа устанавливает максимальное количество символов, которое может содержать строка.


 
sniknik ©   (2006-12-03 00:07) [34]

azl ©   (02.12.06 23:40) [33]
сожги книгу откуда это копируешь... а если это то, что как говоришь "знаеш"... то забудь все, и учиться, учиться и учиться.


 
koha ©   (2006-12-03 00:26) [35]

str1:="123456";
ord(str1[0]) - В паскале turbo7 это означало длину строки

А Delphi:
str1:="123456";
str2:=str[0]; // так не работает
Ord(str[0]) - и так тоже не работает и что  означает не поятно


 
Anatoly Podgoretsky ©   (2006-12-03 00:37) [36]

> azl  (02.12.2006 23:40:33)  [33]

Где ты такую глупость прочитал, строка (string) никогда с индекса 0 не начиналась.


 
sniknik ©   (2006-12-03 00:46) [37]

> ord(str1[0]) - В паскале turbo7 это означало длину строки
оно и сейчас это означает, но только в одном частном случае - типе короткая строка.

вот так
var
 str1: string[20];
begin
 str1:="123456";
 ord(str1[0]);


 
koha ©   (2006-12-03 01:05) [38]

> sniknik ©   (03.12.06 00:46) [37]
> оно и сейчас это означает, но только в одном частном случае - типе короткая строка.

- Исчерпывающе.


 
Anatoly Podgoretsky ©   (2006-12-03 01:07) [39]

Сообственно и для длинных строк тоже, только не совместимо по типу и надо обращаться через структуру строки. В данный момент это уже документировано.



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

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

Наверх




Память: 0.57 MB
Время: 0.046 c
2-1165223382
gdaujk
2006-12-04 12:09
2006.12.24
Как программно открыть "Мой компьютер"?


15-1165346981
Kerk
2006-12-05 22:29
2006.12.24
Google оцифрует российские библиотеки


2-1165376580
Desk
2006-12-06 06:43
2006.12.24
Подскажите алгоритм доски?


1-1163277189
PHPDeveloper
2006-11-11 23:33
2006.12.24
выделение области изображения


2-1165498288
Roman_ln
2006-12-07 16:31
2006.12.24
Есть функция преобразования даты в числовой эквивалент?