Obsługa wielu języków - TStringList?

dział ogólny

Obsługa wielu języków - TStringList?

Nowy postprzez Koziol » poniedziaÅ‚ek, 28 lipca 2008, 13:30

Ostatnio przeszukuje sobie sieć w poszukiwaniu implementacji obsługi wielu języków w BCB ale niestety nic konkretnego znaleźć mi się nie udało ;( jedyną rzeczą jaką udało mi się dowiedzieć jest że można się posłużyć komponentem/klasą TStringList ale niestety jak widzę można się tam odwoływać tylko przez numer indexu znaczy:
Kod: Zaznacz cały
TStringList *Lista = new TStringList;
Lista->Add("asd");
cos = Lista->Strings[0];

I pytanie czy nie da się tu nadać indexów słownych jak np. w PHP? tam rzecz jest bardzo prosta:
Kod: Zaznacz cały
$lista=array();
$lista['jakas_nazwa'] = "asd";

Czy w BCB da rade osiągnąć coś takiego np przy użyciu ów klasy?
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 28 lipca 2008, 13:48

Nie wiem czy o to pytasz, ale w C++ builder działa tylko język C++, można wstawiać wstawki assamblerowe w specjalnych blokach, można dodawać pliki zawierające kod w Delphi, Pascalu, ale nie słyszałem np. by można było dodawać kod w Visual Basic, ale na pewno nie można wstawiać języków skryptowych czyli HTML, Java, czy PHP.




Klasa TStrings jest klasą wirtualną i nie może występować samodzielnie, ale może być składnikiem innych klas jak. np. TStringList, TLisBox, TListView, TComboBox, itp. NIe jest niczym więcej jak tablicą przechowującą znaki i łańcuchy znaków typu AnsiString.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez Koziol » poniedziaÅ‚ek, 28 lipca 2008, 13:50

A ja nie chce wstawki z PHP ja chciał bym uzyskać efekt jak w PHP czyli zamiast indexów liczbowych indexy słowne.
Cyz coś takiego da się uzyskać.
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 28 lipca 2008, 13:56

Wyrażasz się nieprecyzyjnie.
Tablice w C++ zawsze mają numery indeksów, ale są to numery.

Przykład tworzenia takiej tablicy:

Kod: Zaznacz cały
AnsiString tablica[] = {"tekst 1", "tekst 2", "tekst 3"};

Label1->Caption = tablica[2];// na Label1 pokaże się tekst tekst 2


Tablica TStringList może zawierać wartości i nazwy przypisane do wartości, czyli w zasadzie nazwa jest tutaj nazwą indeksu, który posiada jakąś wartość.
OpisaÅ‚em to ► patrz serwis: Cyfrowy Baron w dziale: Porady | TStringList | Tworzenie listy zawierajÄ…cej nazwy i wartoÅ›ci przypisane do nazw.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez wargo » wtorek, 29 lipca 2008, 09:56

Ale jemu chodzi o to że zamiast numerów chce podać słowo, na pewno inaczej to będzie działać, to jest tak samo jak tablice php. I nie chodzi lub nie musi chodzić o wybranie z tablicy.
Tutaj pokażę o co chodzi:
Kod: Zaznacz cały
//php:
//PrzykÅ‚ad 1
$x = array("asd" => "asasasasas");
echo 
$x["asd"];//wyÅ›wietli asasasasss
//2
$userdata["username"] = "wargo";
echo 
$userdata["username"]; //wyÅ›wietli: wargo
 
Ostatnio edytowano czwartek, 26 lutego 2009, 22:40 przez wargo, Å‚Ä…cznie edytowano 1 raz
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez Cyfrowy Baron » wtorek, 29 lipca 2008, 13:29

Czegoś takiego nie ma w C++. Indeksy w tablicach są numerami, można co prawda definiować nazwy i przypisywać im tylko numery, wtedy można by się odwoływać do nazw, ale nazwy muszą być zdefiniowane:

Kod: Zaznacz cały
void __fastcall TForm1::Button2Click(TObject *Sender)
{
const int nazwa_1 = 0;
const int nazwa_2 = 1;
const int nazwa_3 = 2;
const int nazwa_4 = 3;
// itd...
AnsiString Tablica[] = {"tekst a", "tekst b", "tekst c", "tekst d"};

Label1->Caption = Tablica[nazwa_3]; // zostanie wyświetlony napis: tekst c
}


tłumaczysz to tak zawile, że na dobrą sprawę nie wiem o co Tobie właściwie chodzi. Nie rozumiem jak indeks tablicy może być nazwą. Tablica to zbiór wartości uszeregowanych w kolejności, to ta kolejność decyduje o numerach indeksów. Skąd w tablicy zamiast numerów miały by się wziąć nazwy, przecież trzeba by najpierw stworzyć te nazwy, a potem przyporządkować je poszczególnym elementom tablicy.

Tak dziaÅ‚a tablica TStringList ( ► patrz serwis: Cyfrowy Baron dzial: Porady | TStringList | Tworzenie listy zawierajÄ…cej nazwy i wartoÅ›ci przypisane do nazw) ponieważ pozwala definiować nazwy, ale trzeba też od razu przypisywać tym nazwom wartoÅ›ci. Ta tablica tak naprawdÄ™ nie różni siÄ™ niczym od innych tablic, ale klasa TStringList ma wbudowany mechanizm rozdzielajÄ…cy wartoÅ›ci poszczególnych indeksów na nazwy i wartoÅ›ci, a wykorzystuje do tego celu separator '='.
Prosty przykład działania takiej tablicy:

Kod: Zaznacz cały
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TStringList *tablica = new TStringList;
tablica->Add("Opel=Kadet");
tablica->Add("Ford=Escort");
tablica->Add("Polonez=Caro");
tablica->Add("Fiat=Uno");

Label1->Caption = tablica->Values["Polonez"]; // wyświetlony zostanie napis: Caro

delete tablica;
}
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez Darek_C++ » wtorek, 29 lipca 2008, 14:12

Jak dla mnie to tytuł tego topicku jest całkowicie nietrafny do jego kontekstu i kojarzy mi się z unicode i rozszerzonymi zakresami znaków np chińskim etc., etc. :)

Jeśli zaś chodzi o funkcjonalność typu tablicy asocjacyjnej z PHP w C++ implementuje to kontener typu map z STL
Nie wnikając w zagadnienie iteratorów przykład dodawanie i pobieranie danych:
Kod: Zaznacz cały
#include <map> // nalezy dolÄ…czyc
using namespace std;
map<String,String> myMap; // tworzymy zmienna typu map;
void __fastcall TForm1::Button2Click(TObject *Sender)
{


    myMap.insert(pair<String, String>("klucz1","Wartość 1"));
    myMap.insert(pair<String, String>("klucz2","Wartość 2"));
    myMap.insert(pair<String, String>("klucz3","Wartość 3"));

    Memo1->Lines->Add( myMap["klucz2"]);
    Memo1->Lines->Add( myMap["klucz1"]);
    Memo1->Lines->Add( myMap["klucz3"]);

    Memo1->Lines->Add("---------------");

    map<String, String> myMap2;

    myMap["klucz1"] = "Wartość 1";
    myMap["klucz2"] = "Wartość 2";
    myMap["klucz3"] = "Wartość 3";

    Memo1->Lines->Add( myMap["klucz2"]);
    Memo1->Lines->Add( myMap["klucz1"]);
    Memo1->Lines->Add( myMap["klucz3"]);
}

Czyli zupełnie jak w PHP i array();
Ostatnio edytowano wtorek, 29 lipca 2008, 14:58 przez Darek_C++, Å‚Ä…cznie edytowano 3 razy
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
PodziÄ™kowaÅ‚ : 66
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez Cyfrowy Baron » wtorek, 29 lipca 2008, 14:25

A jak się temu co napisałeś dokładniej przyjrzysz to się okaże, że TStringList oferuje to samo, w zasadzie opisany przeze mnie mechanizm TStrinList opiera się na tym co podałeś.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez Darek_C++ » wtorek, 29 lipca 2008, 14:44

Z tym, że kontener map możemy bardzo wydajne przeszukiwać.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
PodziÄ™kowaÅ‚ : 66
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez Koziol » wtorek, 29 lipca 2008, 14:46

z tą róznicą że przy użyciu TStringList możemy również prawie automatycznie przypisywać zmienne do napisów na button'ach itp.

// przejrzałem dokładnie na stronce opis do TStringList
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez Darek_C++ » wtorek, 29 lipca 2008, 14:51

A z map nie ?
Kod: Zaznacz cały
Button1->Caption = myMap["klucz2"];

Zastanów się zamim coś napiszesz :lol:
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
PodziÄ™kowaÅ‚ : 66
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez Koziol » wtorek, 29 lipca 2008, 16:01

lol... albo ty sie naucz czytać ze zrozumieniem "prawie automatycznie"

Kod: Zaznacz cały
// Plik źródłowy np. Unit1.cpp
//--------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Lista = new THashedStringList;
Lista->Add("Button1=Zapisz");
Lista->Add("Button2=Otwórz");
Lista->Add("Button3=Zamknij");
Lista->Add("Button4=OK");
Lista->Add("zamieszkały miasto=Płońsk");
Lista->Add("adres=top secret");
Lista->Add("telefon kom.:=506 115 671");
}
//--------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
for(int i = 1; i <= 4; i++)
{
  String name = "Button" + IntToStr(i);
  dynamic_cast<TButton *>(FindComponent(name))->Caption = Lista->Values[name];
}
}
//--------------------------------


przy odpowiedniejk zmianie tego kodu bedziesz mogl pobrac index'y, a przy takiej tablicy ja ty proponujesz nie wiem czy to sie uda, bo chyba w BCB nie ma petli foreach
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
PodziÄ™kowaÅ‚ : 8
OtrzymaÅ‚ podziÄ™kowaÅ„: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez Darek_C++ » wtorek, 29 lipca 2008, 16:10

Twój przykład:
Kod: Zaznacz cały
void __fastcall TForm1::Button5Click(TObject *Sender)
{

    myMap["Button1"] = "Zapisz";
    myMap["Button2"] = "Otwórz";
    myMap["Button3"] = "Zamknij";
    myMap["Button4"] = "OK";
    for(int i = 1; i <= 4; i++)
    {
        String name = "Button" + IntToStr(i);
        dynamic_cast<TButton *>(FindComponent(name))->Caption = myMap["Button"+(String)i+""];
    }
}


BCB nie ogranicza użytkownika do komponentów wizualnych i tych nie wizualnych jak przedmiotowa kalsa TStringList z VCL, ale jak najbardziej obsługuje cały język C++. Druga sprawa to jest wydajność...
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
PodziÄ™kowaÅ‚ : 66
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez Cyfrowy Baron » wtorek, 29 lipca 2008, 17:51

Te dysputy do niczego nie prowadzą. Klasa TStringList wykorzystuje mechanizm kontener map, więc jest równie wydajna, ten sam mechanizm wyszukiwania. Mogą być pewne opóźnienia przy przetwarzaniu łańcucha znaków, gdyż zapis: nazwa=wartość wymaga rozbicia na dwa wyrazy i wrzucenia do tablicy. Niemniej jednak klasa TStringList oferuje prostszy w obsłudze i bardziej zautomatyzowany sposób pobierania i przechowywania danych. Kolejna zaleta to możliwość łatwego zapisania zawartości TStringList do pliku, podczas gdy w przypadku mapowania, konieczne jest stworzenie struktury która będzie pośredniczyć w zapisie i odczycie danych. Klasa TStringList hermetyzuje zmienne i funkcje, w efekcie jej użycie ogranicza się do wywołania kilku funkcji.

To którego sposobu użyjemy zależy od potrzeb, poza tym STL oferuje znacznie większą funkcjonalność, przedstawiona w przykładzie to tylko jedna z możliwości.
Wydaje mi się, że na potrzeby prostej tablicy lepiej skorzystać z klasy TStringList, gdyż posiada ona już wydajny mechanizm, podczas gdy funkcjonalne korzystanie z STL wymaga stworzenia funkcji z mechanizmem obsługującym tablice.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Obsługa wielu języków - TStringList?

Nowy postprzez Darek_C++ » wtorek, 29 lipca 2008, 19:09

W tym topicku mowa o tablicach asocjacyjnych z PHP wiec komtentt typu map jest ich odpowiednikiem.
W kwestii "bo chyba w BCB nie ma petli foreach" proszÄ™ bardzo za pomocÄ… przychodzÄ… iteratory:
Kod: Zaznacz cały
map<String,String>::iterator it;

myMap["klucz1"] = "Wartość 1";
myMap["klucz2"] = "Wartość 2";
myMap["klucz3"] = "Wartość 3";

for ( it=myMap.begin() ; it != myMap.end(); it++)
{
   Memo1->Lines->Add(myMap[(*it).first]);
   Memo1->Lines->Add((*it).second);
}

I mamy odpowiednik foreach z PHP.
Nie wiem czy taką funkcjonalność posiada TStringList bez rozbicia na części po znaku = Twojego przykładu CB implementacji tablicy asocjacyjnej. Poza tym ja wcale nie umniejszam zalet TStringList, ale podaje inne rozwiązanie z STL.
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
PodziÄ™kowaÅ‚ : 66
OtrzymaÅ‚ podziÄ™kowaÅ„: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    NieznanyNieznana

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 8 gości

cron