Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Cannot convert 'AnsiString' to 'const char *'


Автор: Stentor 14.3.2006, 11:26
Копутер пишет «Cannot convert 'AnsiString' to 'const char *'» Как конвертировать???

Вообще, задача такая:

Идёт поиск в БД по фамилии, если запись не найдена, то появляется сообщение (не найдено)

AnsiString name;
name=Edit1->Text;
MainForm->Table1->Locate("Фамилия",name,TLocateOptions() << loCaseInsensitive);
if(!MainForm->Table1->Locate("Фамилия",name,TLocateOptions() << loCaseInsensitive))
MessageBox(0," Не найден: "+name," Запись не найдена ",0);


Чего бы такое написать, чтобы в сообщении было: «Не найден: Петров»? Как правильно сделать?

Автор: maxim1000 14.3.2006, 11:31
вроде бы так...
Код

(AnsiString("не найден:")+name).c_str()

Автор: Stentor 14.3.2006, 11:45

1. MessageBox(0,(" Не найден: "+name).c_str()," Запись не найдена ",0);

2. AnsiString("не найден:")+name).c_str()


Оба варианта работают без ошибок, только не делают т0, что надо. В результате выдает только «Не найден:». А фамилию не пишет. Что я не так делаю?



AnsiString name;
name=Edit1->Text;
MainForm->Table1->Locate("Фамилия",name,TLocateOptions() << loCaseInsensitive);
if(!MainForm->Table1->Locate("Фамилия",name,TLocateOptions() << loCaseInsensitive))
MessageBox(0,(" Не найден: "+name).c_str()," Запись не найдена",0);

Автор: Stentor 14.3.2006, 12:33
???????

Автор: tigger 14.3.2006, 12:42
Я обычно делал так

выношу строку перед MessageBox

Код


AnsiString str;

str = " Не найден:";

//
// код какой-нибудь
//

str = str + name;
MessageBox(0,str.c_str()," Запись не найдена",0); 



если не поможет попробуй через Application->MessageBoxA();

Автор: CatOleg 14.3.2006, 12:49
AnsiString name,ErrorMessage;
name = Edit1->Text;
ErrorMessage = "Не найден : " + name;
Application->MessageBoxA(ErrorMessage.c_str(),"Error",0);

Автор: maxim1000 14.3.2006, 16:06
Цитата(Stentor @ 14.3.2006, 10:45 Найти цитируемый пост)
Оба варианта работают без ошибок, только не делают т0, что надо. В результате выдает только «Не найден:». А фамилию не пишет. Что я не так делаю?

хм... единственное, что могу предположить - что-то не то с заполнением name...
специально запустил Builder
в OnCreate формы поставил такие строчки:
Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  AnsiString name="qqq";
  MessageBox(0,(AnsiString("aaa:")+name).c_str(),"www",MB_OK);
}

при запуске выдало "aaa:qqq"...

Автор: Stentor 15.3.2006, 12:38
maxim1000,

AnsiString name;
MessageBox(0,(AnsiString("Не найдено:")+name).c_str()," Запись не найдена ",0);

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

Тему можно закрывать. Спасибо всем!

Автор: Aver91 16.7.2009, 19:54
чтобы тем не плодить, отвечу тут. возникла такая же проблема, как заголовок темы. суть в чем. в компонент Edit вводится слово или словосочетание. это будет строка ansistring. эту строку нужно перевести в символьный массив типа char, для записи в файл и прочей работой как с обычной строкой( под обычной строкой подразумеваю последовательность char символов, ограниченных '\0'), либо прошу подсказать функции для работы со строкой ansistring, подобные:
1)strlen
2)strcopy
3)fputs/fgets/fgetc для ansistring
4)и подобные

Автор: Aver91 16.7.2009, 20:47
проблема решилась.
Код

Edit3->Text.c_str()

Автор: WebS 28.11.2009, 18:40
а у ми такой вопрос:


Код

    file=AnsiString(P).c_str();
    SetFileAttributes (file+"//x.exe",FILE_ATTRIBUTE_HIDDEN);


ошибка.., как норм сложить их?

Автор: Alexeis 28.11.2009, 18:46
char* не поддерживает конкатинацию плюсом, тока AnsiString. Можно к AnsiString приплюсовать char*. 

Автор: WebS 28.11.2009, 20:13
Спасибо, всё ок smile

Автор: 123lexx321 30.1.2011, 10:34
у меня похожий вопрос. Нужно значения матрицы переписать в массив
пишу b[c++]=StrToInt(StringGrid1->cells[col][row]);
ошибка 
' ' is not a valid integer value

Уже который день мучаюсь чувствую что ушёл куда то в дебри

Автор: Dem_max 30.1.2011, 11:19
ну не знаю у меня все работает
Код

StringGrid1->Cells[1][1] = "2";
int q = StrToInt(StringGrid1->Cells[1][1]);


Автор: 123lexx321 30.1.2011, 11:52
у меня b[] объявлен как char, ну и соответственно все элементы матрицы символы. может можно как то проще вывести элементы из StringGrid в Label (в определённом порядке)

Автор: Dem_max 30.1.2011, 12:00
объяви как int

Автор: 123lexx321 31.1.2011, 18:07
у меня b[] объявлен как char, ну и соответственно все элементы матрицы символы. может можно как то проще вывести элементы из StringGrid в Label (в определённом порядке)

Автор: Dem_max 31.1.2011, 19:34
Цитата

может можно как то проще вывести элементы из StringGrid в Label 

тогда проще
Код

Label1->Caption = StringGrid1->Cells[1][1];

Автор: 123lexx321 1.2.2011, 18:35
Итог тот же. is not a valid integer value
Вообще лечше весь код выложу чтоб было понятно что куда
Код

void __fastcall TForm1::Button3Click(TObject *Sender)
{
 char b[121];
 int col=5,row=5;
 int n=1,i,j,c=0;
 while (1)
  {
  b[c]=StrToInt(StringGrid1->Cells[col][row]);
  c++;
    switch(n)
    {
    case 1: col++;break;
    case 2: row--;break;
    case 3: col--;break;
    case 4: row++;break;
    }
   if (col==10) break;
   if (col==row&&col<6) n=4;
   else if(col+row==10&&col<6) n=1;
   else if(col+row==10&&col>=6) n=3;
   else if(col==row+1&&col>5) n=2;
  }
  Label1->Caption=b;

}

цикл начинается с центра матрицы, на нем же и ошибка появляется

Автор: xvr 2.2.2011, 13:03
Цитата(123lexx321 @  1.2.2011,  18:35 Найти цитируемый пост)
 is not a valid integer value

Видимо где то у вас в гриде лежит нечто не похожее на число. StrToInt на это бросает эксепшен, который вы и видите

Автор: 123lexx321 2.2.2011, 18:03
Цитата(xvr @ 2.2.2011,  13:03)
Цитата(123lexx321 @  1.2.2011,  18:35 Найти цитируемый пост)
 is not a valid integer value

Видимо где то у вас в гриде лежит нечто не похожее на число. StrToInt на это бросает эксепшен, который вы и видите

ну там как бы во всем гриде символы лежат

Автор: xvr 2.2.2011, 22:46
Цитата(123lexx321 @  2.2.2011,  18:03 Найти цитируемый пост)
ну там как бы во всем гриде символы лежат 

Ну тогда StrToInt имеет полное право бросать эксепщены - она ожидает увидеть на входе строку с числом в ней, а не произвольный символ. Т.е. "0", "123" или "8765" подойдут, а "Число" - даст эксепшен

Если вам нужен код первого символа из ячейки грида, то так и пишите:
Код

b[c]=StringGrid1->Cells[col][row][1];

И то сломается, если в ячейке грида будет пустая строка (т.е. не будет у нее первого символа)

Автор: 123lexx321 3.2.2011, 18:28
Цитата(xvr @  2.2.2011,  22:46 Найти цитируемый пост)
Если вам нужен код первого символа из ячейки грида, то так и пишите:

мне нужно данные всего грида(данные это текс) вывести в определённом порядке на экран (Label? Edit?)
Может есть какие то идеи, как это по другому можно сделать?
Лучше наглядно

Автор: xvr 3.2.2011, 20:46
Цитата(123lexx321 @  3.2.2011,  18:28 Найти цитируемый пост)
мне нужно данные всего грида(данные это текс) вывести в определённом порядке на экран (Label? Edit?)

Грид - это 2х мерный массив. Label - это 1 строка. Как вы представляете себе вывод 2х мерного массива в виде 1 строки?
Если вам надо соединить вместе текст из всех ячеек грида и вывести то, что получилось, то так и пишите:
Код

AnsiString b;
...
while(1)
{
 b+=StringGrid1->Cells[col][row];
 ...
}
Label1->Caption=b;

Автор: 123lexx321 4.2.2011, 16:57
Цитата(xvr @ 3.2.2011,  20:46)
Цитата(123lexx321 @  3.2.2011,  18:28 Найти цитируемый пост)
мне нужно данные всего грида(данные это текс) вывести в определённом порядке на экран (Label? Edit?)

Грид - это 2х мерный массив. Label - это 1 строка. Как вы представляете себе вывод 2х мерного массива в виде 1 строки?
Если вам надо соединить вместе текст из всех ячеек грида и вывести то, что получилось, то так и пишите:
Код

AnsiString b;
...
while(1)
{
 b+=StringGrid1->Cells[col][row];
 ...
}
Label1->Caption=b;


сделал как написано. выдаёт illegal structure operation

Автор: xvr 4.2.2011, 18:59
Цитата(123lexx321 @  4.2.2011,  16:57 Найти цитируемый пост)
сделал как написано. выдаёт illegal structure operation 
В каком месте выдает?


Автор: 123lexx321 4.2.2011, 19:11
Цитата(xvr @ 4.2.2011,  18:59)
Цитата(123lexx321 @  4.2.2011,  16:57 Найти цитируемый пост)
сделал как написано. выдаёт illegal structure operation 
В каком месте выдает?

на этом b+=StringGrid1->Cells[col][row];

Автор: Dem_max 4.2.2011, 19:20
потому что за пределы  Cells[col][row]; наверное выходим

Автор: 123lexx321 4.2.2011, 19:21
Цитата(Dem_max @ 4.2.2011,  19:20)
потому что за пределы  Cells[col][row]; наверное выходим

да нет, начинается как раз с центра матрицы, как и задумано....

Автор: xvr 4.2.2011, 19:39
Цитата(123lexx321 @ 4.2.2011,  19:11)
Цитата(xvr @ 4.2.2011,  18:59)
Цитата(123lexx321 @  4.2.2011,  16:57 Найти цитируемый пост)
сделал как написано. выдаёт illegal structure operation 
В каком месте выдает?

на этом b+=StringGrid1->Cells[col][row];

Не должно. Дайте всю функцию, что то там у вас не так описано

Автор: 123lexx321 4.2.2011, 19:53
Цитата(xvr @  4.2.2011,  19:39 Найти цитируемый пост)
Не должно. Дайте всю функцию, что то там у вас не так описано

вот
Код

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
StringGrid1->ColCount=11;
StringGrid1->RowCount=11;        
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{

char a[121];
for(int i=0; i<121; i++)
  {
  a[i]=' ';
  }
strcpy(a, Edit1->Text.c_str());

int c=0;
 for(int row=0; row<StringGrid1->ColCount; row++)
    for(int col=0; col<StringGrid1->RowCount; col++)
    {
    StringGrid1->Cells[col][row]=a[c++];
    }
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)
{
 char b[121];
 int col=5,row=5;
 int n=1,i,j,c=0;
 while (1)
  {
  b+=StringGrid1->Cells[col][row];
    switch(n)
    {
    case 1: col++;break;
    case 2: row--;break;
    case 3: col--;break;
    case 4: row++;break;
    }
   if (col==10) break;
   if (col==row&&col<6) n=4;
   else if(col+row==10&&col<6) n=1;
   else if(col+row==10&&col>=6) n=3;
   else if(col==row+1&&col>5) n=2;
  }
  Label1->Caption=b;

}

Автор: xvr 5.2.2011, 16:39
В строке 44 тип переменной b должен быть не массив символов, а AnsiString. Внимательно посмотрите мое исходное сообщение - строка 1 в листинге

Автор: 123lexx321 5.2.2011, 18:57
Цитата(xvr @ 5.2.2011,  16:39)
В строке 44 тип переменной b должен быть не массив символов, а AnsiString. Внимательно посмотрите мое исходное сообщение - строка 1 в листинге

Да точно. Ох уж эта моя невнимательность. Спасибо большое. Все заработало.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)