C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
индексация AnsiString Text, непонятки с индексацией AnsiString
Benish
Отправлено: 04.10.2004, 17:02


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Господа, подскажите пожалуйста!

Есть AnsiString Pstea->Text в котором записано "4.6" надо изправить на "4,6".

Делаем:

int i = Pstea->Text.Length();
char ch = Pstea->Text[i-1];
ch = ',';
Pstea->Text[i-1] = ch;

НИЧЕГО НЕ МЕНЯЕТСЯ! А как же обещанная индексация?????

Делаем:

Pstea->Text = Pstea->Text.SubString(1,i-2) + "," + Pstea->Text.SubString(i,1);

Все работает.

Подскажите пожалуйста, почему не работает 1-ый вариант?!

Спасибо!
AVC
Отправлено: 05.10.2004, 09:17


Ветеран

Группа: Модератор
Сообщений: 1583



Все работает
CODE

AnsiString PText = "4.6";

int i = PText.Length();
char ch = PText[i-1];
ch = ',';
PText[i-1] = ch;
ShowMessage(PText); // 4,6


А так проще
CODE

int idx = PText.LastDelimiter(",");
if (idx) PText[idx] = '-';
ShowMessage(PText); // 4-6

Gedeon
Отправлено: 05.10.2004, 12:01


Ветеран

Группа: Модератор
Сообщений: 1742



Вот еще так текст можно заменять
CODE

extern PACKAGE AnsiString__fastcall AnsiReplaceText(const AnsiString
AText, const AnsiString AFromText, const AnsiString AToText);

QUOTE

Description

Call AnsiReplaceText to scan the string specified by AText and replace all occurrences of the string specified by AFromText with the string specified by AToText. Occurrences of AFromText are identify by a case-insensitive comparison that uses the current Windows locale. The identification of substrings is not recursive: if the substitution of AToText results in a new match for AFromText, that match is not replaced.
Guest
Отправлено: 05.10.2004, 14:17


Не зарегистрирован







QUOTE (AVC @ 05/10/2004, 10:19)
Все работает
[CODE]
AnsiString PText = "4.6";

-skip-
PText[i-1] = ch;
-skip

if (idx) PText[idx] = ',';
-skip-

У меня не работает ни первый, ни второй вариант.

После этого идет:
byte k = byte ((StrToFloat(Pstea->Text))*10)

приложение падает с криками, что "4.5" is not a valid floating point value
Konstantine
Отправлено: 05.10.2004, 14:37


Мастер участка

Группа: Модератор
Сообщений: 545



а просто:
CODE
AnsiString PText = "4.6";

int i = PText.Length();
PText[i-1]=',';
ShowMessage(PText);
чё выдаёт?
Benish
Отправлено: 05.10.2004, 14:56


Дежурный стрелочник

Группа: Участник
Сообщений: 67



УРА! Заработало. В любых вариантах.
Нужно было только во временную переменную AnsiString скопировать.
Видимо связано с тем, что приложение 3-х поточное. Но странно, эту строку никто в это время трогать не должен был.

Спасибо всем.
Gedeon
Отправлено: 05.10.2004, 16:08


Ветеран

Группа: Модератор
Сообщений: 1742



Вот тут все ваши вопросы кроются

Pstea->Text

Что такое Pstea? Это 100% какой-то класс, у которого
CODE

__property AnsiString Text = {read=GetText, write=SetText};

вообще поакуратнее надо обращаться со свойствами, доступ к которым осуществлен через функцию. Например даже у простого TEdit следующий код не отработает
CODE

Edit1->Text += "Nu i chto takoe?";


Во блин 666 сообщение smile.gif

Отредактировано Gedeon — 05/10/2004, 17:15
Benish
Отправлено: 06.10.2004, 10:42


Дежурный стрелочник

Группа: Участник
Сообщений: 67




Pstea это:

CODE

TDdeServerItem *Pstea;


QUOTE

вообще поакуратнее надо обращаться со свойствами, доступ к которым осуществлен через функцию. Например даже у простого TEdit следующий код не отработает
CODE

Edit1->Text += "Nu i chto takoe?";



Хм, действительно не работает:)
А почему? Про GetText/SetText ничего не нашел. Нашел только что get это функция ifstream.

Да будет тебе щастье! smile.gif
Boyko
Отправлено: 06.10.2004, 11:16


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (Benish @ 06/10/2004, 10:44)
QUOTE

вообще поакуратнее надо обращаться со свойствами, доступ к которым осуществлен через функцию. Например даже у простого TEdit следующий код не отработает
CODE

Edit1->Text += "Nu i chto takoe?";



Хм, действительно не работает:)
А почему? Про GetText/SetText ничего не нашел. Нашел только что get это функция ifstream.

Все в Help-е написано.

Когда есть гетер не можно писать +=. Все.

Edit->Text=Edit->Text+" Nu i chto takoe?" можно писать!
AVC
Отправлено: 06.10.2004, 11:23


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Edit1->Text += "Nu i chto takoe?";
Хм, действительно не работает:)
А почему?

Это же очевидно. За пропертью спрятан метод Set.
Benish
Отправлено: 07.10.2004, 13:26


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Вроде разобрался и с __property и с SetText/GetText.
Невозможность применения += и [] связана с перегрузкой операций?
Boyko
Отправлено: 07.10.2004, 14:14


Станционный диспетчер

Группа: Участник
Сообщений: 88



Вот и Help:

VCL Reference
AnsiString::operator +=

AnsiString

Append an AnsiString.

AnsiString& __fastcall operator +=(const AnsiString& rhs);

Description

The operator += concatenates this AnsiString and rhs, assigning the result to this AnsiString.

The operator +=() is not supported on a property with getter/setter functions.
Benish
Отправлено: 08.10.2004, 16:54


Дежурный стрелочник

Группа: Участник
Сообщений: 67



Все понятно. Спасибо большое всем.
Boyko
Отправлено: 19.11.2004, 16:35


Станционный диспетчер

Группа: Участник
Сообщений: 88



Я нашел почему не работает.

Using assignment operators with properties

When working with data members of a class which have been declared as properties, certain assignment operators are not supported. For example, an Edit Box's Text property is not a actually variable, but is, in fact, a pair of function calls that set an internal class variable (SetText(t)) and return its value (GetText()) by value.

Case 1

Edit1->Text = Edit1->Text + "foo";

Case 2

Edit1->Text += "foo";

Case 1, which is in the form of a = a + b, generates code looks like this:

SetText(GetText() + "foo");

which is fine and yields the expected results.

Case 2, which is in the form of a+=b, generates code looks like this:

temp = GetText();
temp += "foo";

which does not work as expected, as the temporary variable is the one being operated on and the setter for the Text property of the Edit control is never called.


Kак всегда все в Help-е! wink.gif
avc*
Отправлено: 19.11.2004, 17:01


Не зарегистрирован







2Boyko
[quote AVC 06/10/2004 писал]
За пропертью спрятан метод Set.
[/quote]
читайте посты внимательнее.
Boyko
Отправлено: 23.11.2004, 12:36


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (Benish @ 07/10/2004, 13:28)
Вроде разобрался и с __property и с SetText/GetText.
Невозможность применения += и [] связана с перегрузкой операций?

2abc

Все читал очень внимательно.

Хотел ответит benish и нашел в Help-е самое подробное описание... wink.gif
AVC
Отправлено: 23.11.2004, 13:48


Ветеран

Группа: Модератор
Сообщений: 1583



2бойко
Меня просто несколько удивило время поиска ответа даже при наличии подсказки где искать. smile.gif
Значит это Benish невнимателен. smile.gif
Benish
Отправлено: 23.11.2004, 13:56


Дежурный стрелочник

Группа: Участник
Сообщений: 67



2 Boyko — СПАСИБО! smile.gif
Дело в том, что на тот момент у меня полного хелпа не было....

Вернуться в Вопросы программирования в C++Builder