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

Вниз

Люди!!!!!!! Срочно помогите, быстрейййййй!!!!   Найти похожие ветки 

 
fff   (2002-08-05 18:18) [0]

Ааааааааааааааа, как из строки S: String, удалить последние три символа???
Помогите, нужно пря сейчасссссс!
Заранее благодарен!


 
Skier   (2002-08-05 18:19) [1]

>fff
Delete(...)


 
Ghost.   (2002-08-05 18:30) [2]

Delete(s,Length(s)-3,Length(s))


 
PVOzerski   (2002-08-05 18:35) [3]

l:=Length(s)-3;
if l<0 then
l:=0;
SetLength(s,l);


 
fff   (2002-08-05 18:37) [4]

Спасли!!!


 
kull   (2002-08-05 18:41) [5]

2VOzerski
А еще длиннее можно, а то что-то маловато - 3 строки кода всего?


 
PVOzerski   (2002-08-05 18:48) [6]

2kull - ну не люблю испытывать я на прочность RTL без надобности.
>Delete(s,Length(s)-3,Length(s))
А если Length(s)<=3, получится нулевая или отрицательная позиция в строке, с которой надо будет резать 3 символа. Я вот проверил на D6 - так при таком значении Delete вообще не работает.


 
kull   (2002-08-05 18:53) [7]

2PVOzerski
Так в Help-e про Delete все доходчиво написано.
И про выходы индексов из диапазона.


 
-=Prior=-   (2002-08-05 19:04) [8]

Пацаны, ну вы даете!
В Делфи есть функция SetLenght(); С ней можно свободно удалить последние символы RealLenght-3;


 
PVOzerski   (2002-08-05 19:26) [9]

2-=Prior=- :
см. мой пример (05.08.02 18:35) - там именно SetLenght и использован :^).


 
Anatoly Podgoretsky   (2002-08-05 20:15) [10]

kull © (05.08.02 18:53)
Программы надо писать без ошибок, не опираться на внутреннюю текущую организацию компилятора.
А ссылка не хелп у тебя не оправдана, у меня хелп от Д5, так нет указаний на индексы с отрицательной длиной, поэтому все равно требуется проверка на отрицательный индекс, как и для случая с SetLength, тоже отнолится и количеству - отрицательные длины не документированы, кроме того SetLength поддерживает целостнось строк, обеспечивая уникальную строку, как и при других манипуляциях.
Для варианта с Delete надежная программа должна выглядеть так:

Оригинал: Delete(s,Length(s)-3,Length(s))

L := Length(S) - 3;
if L < 0 then L := 0;
Delete(S,L,Length(S))

Кроме того тут не расмотрен случай с пустой строкой!
И ошибки связанные не с уникальностью строки.
В варианте от PVOzerski © (05.08.02 18:35) этих проблем нет.
Ты как предпочитаешь писать программы с ошибками или без?
Я без и видимо PVOzerski тоже.


 
ION T   (2002-08-06 00:39) [11]

В общем-то просмотр CPU View покажет, что Delete сама вызывает LStrSetLength, но также она проверят строку на ненулевую длинну....для обрезания строки лучше юзать SetLength(), а для вырезания какой-то части лучше будет Delete().......


 
kull   (2002-08-06 01:31) [12]

2Anatoly Podgoretsky

> Программы надо писать без ошибок, не опираться на внутреннюю
>текущую организацию компилятора.

Не вижу связи. Причем здесь организация компилятора?

Вот Help:
Delete removes a substring of Count characters from string S starting with S[Index]. S is a string-type variable. Index and Count are integer-type expressions.

If index is larger than the length of the S or less than 1, no characters are deleted.
If count specifies more characters than remain starting at the index, Delete removes the rest of the string. If count is less than 0, no characters are deleted.

А если уж очень надо проверить, то вот одна строка:
Delete(S,IfThen(Length(S)-3<0,0,Length(S)-3),Length(S))

А если в D5 нет функции IfThen, то так:
Delete(S,Integer(Length(S)-3>=0)*(Length(S)-3),Length(S))

Но исходя из help-a этого и не требуется. И никаких ошибок. :)


 
Song   (2002-08-06 08:37) [13]

TrimRight()


 
Anatoly Podgoretsky   (2002-08-06 09:04) [14]

kull © (06.08.02 01:31)

Очень хорошо, что продолжил тему, я со свое стороны тоде привожу вырезку из хелпа по процедуре Delete

If Index is larger than the length of S, no characters are
deleted. I


Как видишь, никакого or less than 1, нет!
Не знаю, из какой версии Дельфи у тебя взята вырезка, у меня из 5, отсюда делаем вывод "Не вижу связи. Причем здесь организация компилятора?" - связь есть и еще какая!

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


 
cool_boy   (2002-08-06 09:20) [15]

Можно ввобще в одну строку:
SetLength(s,Length(s)-3);


 
Anatoly Podgoretsky   (2002-08-06 09:32) [16]

kull © (06.08.02 01:31)
И вот еще два замечания, первое мол Д6 проверяет индексы сама, смотрим

PVOzerski © (05.08.02 18:48)
Я вот проверил на D6 - так при таком значении Delete вообще не работает.

Второе, опять же по твоему коду
Delete(S,IfThen(Length(S)-3<0,0,Length(S)-3),Length(S))
Согласно этому ты предлагаешь к строке применить индекс 0 :-)


 
Просто Доброжелатель   (2002-08-06 10:56) [17]

2Anatoly Podgoretsky
Вырезка взята из D6, но в D4 написано тоже самое.
Не знаю почему в D5 по другому (хотя сомневаюсь что в D5 как-то меняли эту функцию, просто ребята в хелпе налажали).


> kull © (06.08.02 01:31)
> И вот еще два замечания, первое мол Д6 проверяет индексы
> сама, смотрим
>
> PVOzerski © (05.08.02 18:48)
> Я вот проверил на D6 - так при таком значении Delete вообще
> не работает.

При каким таком значении? Если L<0, то в хелпе про это и написано - отсюда и кажется что функция не работает (холостой ход - это не значит "неработает")

А насчет организации компилятора, то я не на нее завязываюсь, а на help. Об организации компилятора я не имею никакого понятия, также как и вы. Более того ее, эту организацию, знают не многие програмеры из борланда. Да это здесь и ни к чему.

> Второе, опять же по твоему коду
> Delete(S,IfThen(Length(S)-3<0,0,Length(S)-3),Length(S))
> Согласно этому ты предлагаешь к строке применить индекс
> 0 :-)

Это не я предлагаю - это вы предлагаете. Просто здесь все записано в одну строку.

И насчет ошибок. Так вот к ним как раз ведет избыточность кода.
Система тем более ненадежна, чем она сложнее и чем больше в ней связей и разных составных частей.

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

Я конечно согласен что отбойный молоток эффективнее. Здесь я конечно утрирую. Просто излишество до добра не доводит.


 
kull   (2002-08-06 10:57) [18]

Это был я...


 
SergeSV   (2002-08-06 11:24) [19]

Вам что нечем заняться ?


 
kull   (2002-08-06 11:32) [20]

Ага....



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

Форум: "Основная";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.006 c
6-60768
budhha
2002-06-04 09:04
2002.08.19
PacketX


4-60910
MARcoDEN
2002-06-10 20:28
2002.08.19
Как узнать хэндл другой программы?


1-60557
HitMan
2002-08-07 15:03
2002.08.19
ANSI


1-60737
Smok_er
2002-08-07 11:18
2002.08.19
XP and TToolBar


4-60901
kidman
2002-06-12 16:12
2002.08.19
screensaver





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