Was ist ein AnsiString?



  • Hallo,

    ich lese überall irgendwas von AnsiString und es scheint sehr wichtig für dem BCB zu sein.
    Deswegen wollte ich mal fragen ob mir jemand das erklären kann was man damit anstellt und wie es funktioniert bzw. was es überhaupt genau ist 😕
    Habe schon SUFU benutzt aber nix wirklich gefunden. vieleicht habe ich das Thema überlesen wenn ja sry 🙂

    Mfg TK



  • AnsiString ist die aus dem Delphi stammende Stringklasse in der VCL. Überall dort, wo innerhalb der VCL Strings (Zeichenketten) verwendet werden, sind das AnsiStrings.
    In der STL gibt es eine ähnliche Klasse, nämlich std::string (falls Du die schon kennst), AnsiStrings sind nur etwas einfacher zu handhaben (meiner Meinung nach, kann aber auch reine Gewöhnungssache sein 😉 ).

    AnsiString ist eine sehr mächtige Klasse, die viele nützliche Funktionen beinhaltet. Am besten wirfst Du mal einen Blick in die Hilfe des BCB und schaust Dir die Methoden in Ruhe an. Falls Du dann spezifische Fragen hast, helfen wir Dir gerne weiter.



  • also ist AnsiString eine Klasse die Funktionen enthält.
    Gut...was kann ich damit anstellen was sehr nützich sein kann bzw. was häufig verwendet wird 🙂



  • Suchen nach Teilausdrücken, extrahieren von Teilausdrücken, wandeln von Zahlen in einen String, wandeln von Strings in Zahlen... Schau Dir die Methoden in der Hilfe an.
    Was davon für Dich nützlich ist, kann ich nicht sagen. Ich muss recht oft Testdateien parsen. Dafür benutze ich die Methoden AnsiPos(), SubString(), Delete(), ToInt(), ToIntDef(), ToDouble() um die einzelnen Textzeilen in ihre Bestandteile zu zerlegen.

    Grundsätzlich kann man aber sagen, dass man an irgendeiner Stelle im Programm dem User Daten anzeigen muss. Dafür braucht man AnsiStirngs, da die entsprechenden Komponenten in der VCL AnsiStirngs erwarten.
    Angenommen Du führst eine mathematische Berechnung durch und willst das Ergebnis in einem Label anzeigen:

    int result;
    result = berechne_irgendwas();
    Label1->caption = AnsiString(result);
    

    Oder du erwartest vom Benutzer eine Zahleneingabe in einem TEdit:

    int Zahl;
    Zahl = Edit1->Text.ToInt();
    


  • also das Text.ToInt() ist schon ein AnsiString??
    wenn ja dann habe ich es schon verwendet ohne zu wissen was es ist xD



  • Ja, TEdit::Text ist vom Typ AnsiString. Innerhalb der VCL kommt man praktisch nicht an AnsiStrings vorbei. 😉 Listen sind zB meist vom Typ TStrings (siehe TStringList) und die sind praktisch nur ein Array von AnsiStrings.



  • also AnsiString ist ein überbegriff für die gnzen Funktionen die man halt verwendet.
    Oder kann man das nich so sagen??
    Dann werde ich nochmal genauer in die Hilfe vom BCB rein schauen. mal sehen ob ich jetzt was finde



  • AnsiString ist eine Klasse die Strings (Zeichenketten) repräsentiert und Funktionen zu ihrer Berabeitung anbietet.
    Vielleicht solltest du dir mal ein Tutorial zum Thema C++ ansehen.



  • Hallo

    Zu den Grundlagen der OOP siehe zum Beispiel dieses C++ Tutorial. Das wirst du nicht nur für AnsiStrign brauchen sondern auch für alle anderen VCL-Komponenten.

    Zu AnsiString selber siehe BCB-Hilfe, Forums-SuFu sowie Forums-Tutorial

    bis bald
    akari



  • Joe_M. schrieb:

    AnsiString ist die aus dem Delphi stammende Stringklasse in der VCL. Überall dort, wo innerhalb der VCL Strings (Zeichenketten) verwendet werden, sind das AnsiStrings.

    In der nächsten Version von C++Builder werden es UnicodeStrings sein.
    Zu einer der größten Schwierigkeiten bei der Unicode-Umstellung auf Seiten CodeGears wurde, daß wir C++Builder-Programmierer nicht wie die meisten Delphi-Programmierer einfach String, sondern meist explizit AnsiString benutzen (was wohl daher rührt, daß die Verwechslungsgefahr zwischen String und string recht groß ist). Wenn man dem glaubt, was in den Newsgroups so durchsickerte, dann wird AnsiString recht tief in die Trickkiste greifen, um einen möglichst reibungslosen Übergang zu ermöglichen.

    Joe_M. schrieb:

    In der STL gibt es eine ähnliche Klasse, nämlich std::string (falls Du die schon kennst), AnsiStrings sind nur etwas einfacher zu handhaben (meiner Meinung nach, kann aber auch reine Gewöhnungssache sein 😉 ).

    Die wesentlichen Unterschiede zu std::string sind:

    • std::string ist Teil des C++-Standards, AnsiString ist proprietär und an Delphi/C++Builder gebunden.
    • AnsiString stellt, wie Joe_M. bereits ausführte, sehr viele Methoden zur Bearbeitung von Strings bereit, die es in std::string nicht gibt. Erwähnenswert sind IMHO besonders AnsiString::sprintf() und AnsiString::sprintf_cat().
    • Die meisten String-Funktionen von Delphi (gleichermaßen die Methoden von AnsiString) sind in Assembler geschrieben und vom FastCode-Projekt aufs Äußerste optimiert.
    • AnsiString verwendet Referenzzählung, wodurch das Anlegen einer Kopie, sofern sie nicht schreibend benutzt wird, fast nichts kostet.


  • audacia schrieb:

    Die meisten String-Funktionen von Delphi (gleichermaßen die Methoden von AnsiString) sind in Assembler geschrieben und vom FastCode-Projekt aufs Äußerste optimiert.

    Hm, ich hatte das so verstanden, dass sämtlicher handoptimierter Assemblercode zu gunsten von CLX aufgegeben werden musste. Oder irre ich mich?



  • Im BCB2007 ist der AnsiString noch in der gewohnten Version (mit Assembler) drin.



  • Joe_M. schrieb:

    Hm, ich hatte das so verstanden, dass sämtlicher handoptimierter Assemblercode zu gunsten von CLX aufgegeben werden musste. Oder irre ich mich?

    Da der Code für Linux gegebenenfalls positionsunabhängig sein mußte und daher das EBX-Register zum Zugriff auf den Speicher benötigte (das nennt sich, glaube ich, PIC), konnte der für Windows geschriebene Assemblercode nicht verwendet werden. Allerdings hat man, soweit ich weiß, diesen nicht verworfen, sondern per #ifdef nur für Windows belassen.
    Die Bemühungen des FastCode-Projektes übrigens wurden, wenn ich mich richtig erinnere, erst in Delphi/C++Builder 2006 in die RTL übernommen, also zu einem Zeitpunkt, als die Linux-Unterstützung längst keine Rolle mehr spielte.


Log in to reply