AnsiString
25.07.1999
  • Konwersja AnsiString do char *

      Użyj funkcji c_str(), która należy do klasy AnsiString. Poniżej kilka przykładów.

  // Przekazywanie Stringu do okienka message box
  AnsiString str = "Taki mały test!";
  Application->MessageBox(str.c_str(),
                         "AnsiString do char *", MB_OK);

  // Przekazywanie Stringu do funkcji API
  
  RECT p;
  RECT * rect = &p;
  p.left = 20;
  p.right = 100;
  p.top = 20;
  p.bottom = 50;
  
  ::DrawText(Canvas->Handle, str.c_str(), str.Length(),
                                      rect, DT_VCENTER);

Uwaga 1: c_str jest funkcją inline. Jej kod ujawnia, że zwraca ona wskaźnik do wewnętrznego wskaźnika AnsiString - char *.

// Data jest typu char * i należy do AnsiString
  char* __fastcall c_str() const
        {return (Data)? Data: "";}

Ten kod odpowiada następującemu:

char* __fastcall AnsiString::c_str() const
  {
    if(Data != NULL)
      return (Data);
    else
      return NULL;
  }

Uwaga 2: Ponieważ c_str zwraca wskaźnik do danej wewnętrznej, możesz urzyć c_str, żeby zmodyfikować zmienną AnsiString. Przykłady:

  // Ten przykład tworzy AnsiString i wypełnia go zerami
  AnsiString str;
  str.SetLength(50);                // allokuje pamięć na 50 znaków
  memset (str.c_str(), 0,50);       // wypełnia bufor zerami

  // Ten przykład przekazuje AnsiString do funkcji API,
  // która zapisuje do tego stringu.
  AnsiString str;
  DWORD size = 255;
  str.SetLength(size +1);              // 255 znaków plus znak null
  GetComputerName(str.c_str(), &size) ;// wywołuje funkcję API

Uwaga: Uwaga 1 pokazuje, że c_str jest funkcją stałą. Oznacza to, że możesz wywoływać funkcję c_str dla stałych typu AnsiString. C++ nie pozwala na wywoływanie funkcji nie-const na rzecz stałych obiektów klasy. Poniższy kod nie skompilowałby się, gdyby Borland nie umieścił słowa kluczowego const w deklaracji metody c_str.

const AnsiString str = "Znowu teścik!";
  Application->MessageBox(str.c_str(), "",MB_OK);
  		    // błąd, wywołanie funkcji nie-const
		    // na obiekcie const

Uwaga 4: Prawie zawsze będziesz wywoływał funkcję c_str używając kropki ".", a nie wskaźnika "->". To samo dotyczy właściwości typu AnsiString komponentów VCL. Kiedy kontrolka VCL ma taką właściwość, metoda Get dla tej właściwości zwraca nowy obiekt AnsiString przez wartość. I dlatego właśnie używasz kropki.