Niestandartowy znak

dział ogólny

Niestandartowy znak

Nowy postprzez Michal-S2 » piÄ…tek, 5 wrzeÅ›nia 2008, 09:01

Czy ktoś z was wie jak moge wstawić do programu literę omega (Ω)? Rozmawiałem z kiedyś z Cyfrowym Baronem na ten temat dlatego, zacytuję co on napisał:
Problem z właściwością Caption obiektu typu TLabel jest taki, że to właściwość typu AnsiString, a ten typ nie obsługuje Unicode, musiała by być typu WideString, żeby obsługiwać Unicode, dlatego nietypowych znaków nie wstawisz do TLabel.
Najgorsze nieszczęścia w historii były spowodowane przez idealistów próbujących zmuszać ludzi do tego, "co dla nich dobre"
Bjarne Stroustrup - twórca c++
Avatar użytkownika
Michal-S2
Intelektryk
Intelektryk
 
Posty: 148
Dołączył(a): sobota, 19 lipca 2008, 13:03
Lokalizacja: Gdańsk
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional OEM 64bit
Kompilator: Turbo C++ Explorer
    NieznanyNieznana

Re: Niestandartowy znak

Nowy postprzez kinio » piÄ…tek, 5 wrzeÅ›nia 2008, 09:29

Cześć!

Można wstawić każdy znak do programu, czy to do obiektu TLabel::Caption, czy do Memo. Napisz trochę więcej szczegółów jak chcesz to zrobić, czy np. za pomocą kodu, czy za pomocą Object Inspector-a, jakiej kontrolki to dotyczy itp. To wtedy będzie można coś więcej powiedzieć czy da się w ogóle to zrobić i ewentualnie jak by trzeba było się za to zabrać. Bo faktycznie to co napisał CB jest jak najbardziej prawdziwe.

Pozdr!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Niestandartowy znak

Nowy postprzez Michal-S2 » piÄ…tek, 5 wrzeÅ›nia 2008, 09:32

Na początku chciałem wstawić ten znak do TLabel, ale według tego co napisał Cyfrowy Baron jest to nie możliwe, chodzi mi o to żeby to wyglądało jak TLabel. Może być to zrobione za pomoca kodu.
Ostatnio edytowano piątek, 5 września 2008, 10:15 przez Michal-S2, łącznie edytowano 1 raz
Najgorsze nieszczęścia w historii były spowodowane przez idealistów próbujących zmuszać ludzi do tego, "co dla nich dobre"
Bjarne Stroustrup - twórca c++
Avatar użytkownika
Michal-S2
Intelektryk
Intelektryk
 
Posty: 148
Dołączył(a): sobota, 19 lipca 2008, 13:03
Lokalizacja: Gdańsk
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional OEM 64bit
Kompilator: Turbo C++ Explorer
    NieznanyNieznana

Re: Niestandartowy znak

Nowy postprzez kinio » piÄ…tek, 5 wrzeÅ›nia 2008, 09:41

Cześć!

Oczywiście że jest możliwe!!!
No dobra do TLabel ale sÄ… dwa przypadki:
1. Gdy wartość Caption będzie zawierać tylko i wyłącznie ten nietypowy znak.
2. Gdy będziesz np. chciał napisać: podaj Ω:
Chodzi o to że w pierwszym przypadku to jest proste, bo używasz tablicy znaków z narzędzi systemowych Windows znajdujesz sobie znak (tutaj Ω) który pewnie jest w czcionce o nazwie Symbol, kopiujesz go, wklejasz jako wartość Caption (użyj Ctrl+V) a następnie zmieniasz czcionkę komponentu TLabel na taką w jakiej znalazłeś swój znak (np. Symbol) i gotowe. Omega Ci się pojawi jako nagłówek elementu Caption, mimo iż w Object Inspectorze w polu Caption będzie inny znak.

Sprawdziłem, szukana przez Ciebie Omega jest w czcionce Symbol i jej odpowiednik na klawiaturze to W. Tak więc jako wartość Caption komponentu TLabel wpisz W i zmień właściwość font na Symbol i gotowe, piękna Omega ukaże się Twoim oczom :) Na wszelki wypadek załączam pliki projektu.

Jeżeli chodzi o drugi przypadek to sprawa jest nieco trudniejsza ale też nie niewykonalna w przypadku komponentu TLabel. Musiałbym Ci przygotować parę linijek kodu.

Pozdr!
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Niestandartowy znak

Nowy postprzez Michal-S2 » piÄ…tek, 5 wrzeÅ›nia 2008, 10:13

Dzięki, właśnie o to mi chodziło. Ale czy można też wstawić ten znak do RichEdit lub Memo?
Najgorsze nieszczęścia w historii były spowodowane przez idealistów próbujących zmuszać ludzi do tego, "co dla nich dobre"
Bjarne Stroustrup - twórca c++
Avatar użytkownika
Michal-S2
Intelektryk
Intelektryk
 
Posty: 148
Dołączył(a): sobota, 19 lipca 2008, 13:03
Lokalizacja: Gdańsk
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional OEM 64bit
Kompilator: Turbo C++ Explorer
    NieznanyNieznana

Re: Niestandartowy znak

Nowy postprzez kinio » piÄ…tek, 5 wrzeÅ›nia 2008, 10:23

Cześć!

Do Memo możesz wstawić tekst ale tylko tak jak w notatniku, możesz zmienić czcionkę również na Symbol lecz to zmieni czcionkę w całym komponencie, czyli nie dasz rady napisać np. Podaj Ω, natomiast samo Ω da się wstawić tak samo jak w przypadku TLabel.

Inna historia jest w przypadku RichEdit ponieważ ta kontrolka obsługuje formatowanie tekstu. Możesz za pomocą kodu zaznaczyć interesujący Cię obszar tekstu i dopisać np. taki kod:
Kod: Zaznacz cały
RichEdit1->SelAttributes->Name = "Symbol";

Co spowoduje zmianÄ™ czcionki zaznaczonego tekstu na wybranÄ… (w tym przypadku Symbol).

Pozdr!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Niestandartowy znak

Nowy postprzez Michal-S2 » piÄ…tek, 5 wrzeÅ›nia 2008, 10:28

Rozumiem. Ale czy mogę zrobić to z poziomu kodu? Np. mam pusty Edit i wstawię do niego z poziomu kodu "Opór: 20 Ω".
Najgorsze nieszczęścia w historii były spowodowane przez idealistów próbujących zmuszać ludzi do tego, "co dla nich dobre"
Bjarne Stroustrup - twórca c++
Avatar użytkownika
Michal-S2
Intelektryk
Intelektryk
 
Posty: 148
Dołączył(a): sobota, 19 lipca 2008, 13:03
Lokalizacja: Gdańsk
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional OEM 64bit
Kompilator: Turbo C++ Explorer
    NieznanyNieznana

Re: Niestandartowy znak

Nowy postprzez Cyfrowy Baron » piÄ…tek, 5 wrzeÅ›nia 2008, 11:04

Rozwiązanie polegające na używaniu znaków zastępczych zamiast liter, w Twoim przypadku czcionka Symbol, jest rozwiązaniem doraźnym, nie zmienia to jednak faktu, że TLabel ,czy też Memo nie obsługują Unicode. Po prostu w danym typie czcionki pod literą zamiast litery znajduje się inny znak, ale trudno jest taką czcionką pisać, gdyż wyskoczą znaczki zamiast liter.

Jest więc dokładnie tak jak napisałem, nie można do obiektu TLabel wstawić znaku Ω gdyż Label nie obsługuje unicode. Jeżeli używasz czcionki Symbol, to nie wstawiasz do Label znaku Ω lecz literę W, która jest reprezentowana przez ten znak.

Tak więc to co napisałem jest prawdą. Równie dobrze mógłbyś stworzyć mała bitmapę i umieścić ją na formularzu zamiast Label, efekt byłby dokładnie taki sam.

Dlatego w związku z powyższym nie wstawisz do Edit tekstu Opór: 20 Ω, a jedynie 20 Ω, gdyż czcionka Symbol (co możesz zobaczyć w programie Tablica znaków) zawiera tylko cyfry i znaki zastępujące litery:

tablica-znakow.png


Mam nadzieję, że już rozumiesz różnicę między wstawianiem znaków Unicode a zwykłych ASCII.

Rozwiązaniem Twojego problemu mogłoby być stworzenie specjalnej czcionki, która oprócz standardowych liter zawierałaby również zamiast niektórych zbędnych dla Twoich potrzeb znaków, znaki których potrzebujesz. Taką czcionkę trzeba by było oczywiście umieścić w zasobach programu, tak by nawet Ci którzy nie maja u siebie zainstalowanej takiej czcionki, mogli prawidłowo odczytać tekst.

Inny sposób to stworzenie własnej klasy podobnej do TLabel, która będzie przechowywać wartości typu WideString.

Istnieje zmienna WideString obsługująca Unicode, lecz właściwości Caption, Text, czy też klasa TStrings są typu AnsiString, nie potrafią wyświetlić prawidłowo znaków Unicode, gdyż zmienne 16 bitowe (WideString - Unicode) "nie mieszczą się" w 8 bitowym typie AnsiString (DBCS ANSI, MBCS ANSI).
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
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: Niestandartowy znak

Nowy postprzez kinio » piÄ…tek, 5 wrzeÅ›nia 2008, 14:27

Cześć!!

Zgadzam siÄ™ z CB.
Jeżeli natomiast chciałbyś aby na TLabel można było umieszczać formatowany tekst (podobnie jak w RichText), to mogę Ci przygotować odpowiedni interface który to zrobi z poziomu kodu. Nie mam niczego takiego gotowego, ani nawet podobnego żeby pokazać jako przykład, ale wiem jak się za to zabrać więc musiałbym mieć trochę czasu.

Może był by to dobry pomysł na kolejną poradę??

Pozdr!
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Niestandartowy znak

Nowy postprzez Cyfrowy Baron » piÄ…tek, 5 wrzeÅ›nia 2008, 14:34

Taka porada by się przydała, ale puki co nie wiem, jak w obiekcie wyświetlającym tekst w ANSI (8 bit) wyświetlić tekst UNICODE (16 bit). Nie pomoże tutaj żadna konwersja, gdyż zmienna AnsiString nie pomieści zmiennej 16 bitowej.

Rozważałem możliwość stworzenie własnego obiektu typu Label w oparciu o klasę TCanvas, problem jednak w tym, że ta klasa również operuje na zmiennych typu ANSI.

Nigdy nie zastanawiałem się nad obsługą Unicode w programach, gdyż nie było mi to do niczego potrzebne i dziś brak mi punktu zaczepienia, ale poszukam.
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: Niestandartowy znak

Nowy postprzez Witold » piÄ…tek, 5 wrzeÅ›nia 2008, 15:25

Witam,

Michal-S2 napisał(a): chodzi mi o to żeby to wyglądało jak TLabel.


Kod: Zaznacz cały
#include <stdio.h>
//...
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  Canvas->Font->Name = "Arial";  // dla "MS Sans Serif" nie dziaÅ‚a
  Canvas->Font->Size = 12;
}
//---------------------------------------------------------------------------
void WyswietlOpor( HDC hdc, int poz_x, int poz_y, int opor)
{
  wchar_t bufor[256];
  int dl = swprintf(bufor, L"Opór: %d %c", opor, 0x03a9);
  TextOutW(hdc, poz_x, poz_y, bufor, dl);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  WyswietlOpor(Canvas->Handle, 10, 10, 90);
}
//---------------------------------------------------------------------------

U mnie wyświetla prawidłowo. Nie wykluczam że są błędy.
Pozdrawiam.
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Niestandartowy znak

Nowy postprzez Michal-S2 » piÄ…tek, 5 wrzeÅ›nia 2008, 16:21

Michal-S2 napisał(a):Rozumiem. Ale czy mogę zrobić to z poziomu kodu? Np. mam pusty Edit i wstawię do niego z poziomu kodu "Opór: 20 Ω".

Przepraszam, pomyliłem się chciałem napisać RichEdit, a nie Edit.
Najgorsze nieszczęścia w historii były spowodowane przez idealistów próbujących zmuszać ludzi do tego, "co dla nich dobre"
Bjarne Stroustrup - twórca c++
Avatar użytkownika
Michal-S2
Intelektryk
Intelektryk
 
Posty: 148
Dołączył(a): sobota, 19 lipca 2008, 13:03
Lokalizacja: Gdańsk
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional OEM 64bit
Kompilator: Turbo C++ Explorer
    NieznanyNieznana

Re: Niestandartowy znak

Nowy postprzez Witold » piÄ…tek, 5 wrzeÅ›nia 2008, 18:19

Michal-S2 napisał(a):
Michal-S2 napisał(a):Rozumiem. Ale czy mogę zrobić to z poziomu kodu? Np. mam pusty Edit i wstawię do niego z poziomu kodu "Opór: 20 Ω".

Przepraszam, pomyliłem się chciałem napisać RichEdit, a nie Edit.


Kod: Zaznacz cały
// ...
#include <memory>
// ...
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char opor20[] = "{\\rtf1\\ansi\\ansicpg1250\\deff0\\deflang1045{\\fonttbl"
"{\\f0\\fswiss\\fprq2\\fcharset238{\\*\\fname Arial;}Arial CE;}}\n"
"\\viewkind4\\uc1\\pard\\f0\\fs20 Op\\'f3r: 20 \\u937?\n\\par }";

std::auto_ptr<TMemoryStream> s(new TMemoryStream());
s->Write(opor20, strlen(opor20));
s->Position = 0;
RichEdit1->Lines->LoadFromStream(s.get());

}
//---------------------------------------------------------------------------

:twisted:
Avatar użytkownika
Witold
Konstrukcjonista
Konstrukcjonista
 
Posty: 223
Dołączył(a): piątek, 29 sierpnia 2008, 10:53
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 14
Kompilator: bcb6, Turbo C++ Explorer
    NieznanyNieznana

Re: Niestandartowy znak

Nowy postprzez Michal-S2 » piÄ…tek, 5 wrzeÅ›nia 2008, 20:29

Dzięki :D To jest właśnie to o co mi chodziło. Ale czy mógłbyś mi jeszcze wytłumaczyć(bo przecież nie chodzi o to żeby tylko bezmyślnie przepisywać z forum) co oznaczają poszczególne wyrazy w:
char opor20[] = "{\\rtf1\\ansi\\ansicpg1250\\deff0\\deflang1045{\\fonttbl"
"{\\f0\\fswiss\\fprq2\\fcharset238{\\*\\fname Arial;}Arial CE;}}\n"
"\\viewkind4\\uc1\\pard\\f0\\fs20 Op\\'f3r: 20 \\u937?\n\\par }";
?
Najgorsze nieszczęścia w historii były spowodowane przez idealistów próbujących zmuszać ludzi do tego, "co dla nich dobre"
Bjarne Stroustrup - twórca c++
Avatar użytkownika
Michal-S2
Intelektryk
Intelektryk
 
Posty: 148
Dołączył(a): sobota, 19 lipca 2008, 13:03
Lokalizacja: Gdańsk
PodziÄ™kowaÅ‚ : 1
OtrzymaÅ‚ podziÄ™kowaÅ„: 1
System operacyjny: Windows 7 Professional OEM 64bit
Kompilator: Turbo C++ Explorer
    NieznanyNieznana

Re: Niestandartowy znak

Nowy postprzez Cyfrowy Baron » sobota, 6 wrzeÅ›nia 2008, 09:29

Ja ci wytłumaczę, ta linia zawiera formatowanie RTF. Jeżeli utworzysz za pomocą programu np. WordPad czy Word plik zawierający jakiś tekst i zapiszesz go w formacie *.rtf, a potem otworzysz np. w Notatniku to zobaczysz tam właśnie takie formatowanie.

Witold posłużył się formatowaniem RTF żeby zapisać znaki Unicode do kontrolki RichEdit.
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

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 3 gości