2014-10-21 15 views
5

Tylko dla testu jak trudno jest przekształcić mój program Delphi 7 do Delphi XE 5 napisałem prostą aplikację w Delphi 7 - umieszczone TStringGrid na formularzu i dodał kod na formularzu tworzenia:Jak przekonwertować TStringGrid z Delphi 7 do Delphi XE

procedure TFMain.FormCreate(Sender: TObject); 
begin 
    With StringGrid1 do 
    begin 
     Cells[0,0]:='čęжэ€'; 
    end; 
end; 

(faktycznie napisano jako Komórki [0,0]: = "ce ??", ale spodziewałem się tego). Kompilacja, kompilacja, uruchamianie, brak Unicode, przyczyny. Następnie ponownie otworzyć projekt w Delphi XE 5, zmienić linię ponownie na Komórki [0,0]: = 'čęжэ €', skompilować, zbudować, uruchomić - i nie ma Unicode (ma coś takiego jak čę |||)! To było dla mnie dziwne. Nowy projekt zbudowany od zera na Delphi Xe 5 z tym samym kodem, ten sam TStringGrid działa zgodnie z oczekiwaniami. Wiem, że jest jakaś prosta sztuczka, może jakaś zmiana ustawień projektu, ale nie mogę google to ... Może ktoś może pomóc?

Pozdrawiamy.

Odpowiedz

6

Domyślną czcionką używaną przez Delphi 7 jest MS Sans Serif. Gdy używasz tej czcionki w Unicode Delphi, kontrola siatki łańcuchowej wydaje się nie rysować poprawnie tekstu z tą czcionką. Wiele innych elementów sterujących prawidłowo narysuje tekst w tej czcionce. Ale z jakiegoś powodu sterowanie siatką nie może tego zrobić.

Po uaktualnieniu starego projektu do XE5 odziedziczysz domyślną wartość Delphi 7. Kiedy tworzysz nowy projekt w XE5, domyślna czcionka jest inna, myślę, że Tahoma, a obraz siatki znaków poprawnie pokazuje Twoją cyrylicę w tej czcionce.

Możesz obejść ten problem, używając innej czcionki, takiej jak Tahoma lub Segoe UI. Na pewno nie chcesz używać MS Sans Serif. Widok listy w stylu widoku raportu byłby kolejną dobrą opcją. Nie tylko dlatego, że jest to natywna kontrola platformy.

Muszę przyznać, że tak naprawdę nie rozumiem, dlaczego kontrola siatki łańcuchowej nie zachowuje się lepiej. Byłoby wspaniale, gdyby ktoś inny mógł rzucić trochę światła na to.

+0

Doh ... Dziękuję bardzo, nie mogę głosować na odpowiedź teraz (brak reputacji), ale robię to w przyszłości. Z poważaniem. – Nihila

+0

Czy problem polegał na 'TStringGrid'? –

+1

@ FreeConsulting Tak, to 'TStringGrid', który wydaje się być tutaj wadliwy. Prawdopodobnie jakiś kiepski kod malarski. –

1

Jak wspomina David, problemem jest czcionka użyta w siatce strun. Jednak nie jest dokładnie powiedzieć, że domyślną czcionką w Delphi jest MS Sans Serif. Kiedyś był MS Sans Serif, ale był changed (in Delphi 2006) to Tahoma.

Można zobaczyć, jak dana wersja Delphi wybiera domyślną czcionkę, sprawdzając źródło Graphics jednostki w źródle RTL tej konkretnej wersji Delphi (od IDE jest zbudowany przy użyciu tego kodu). W szczególności procedura InitDefFontData (i, w starszych wersjach Delphi, rekord DefFontData).

Jak z (co najmniej) Delphi XE4 domyślny Tahoma tekstu zostanie zastąpiony przez dowolne ustawienie zmianę czcionek do wartości określonej jako MS Shell Dlg 2 określoną w rejestrze:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontSubstitutes\ 

NB - od sprawdzania kodu w XE4 to możliwe że jeśli ten klucz nie istnieje lub nie można uzyskać, lub jeśli nie ma wpisu podstawienie MS Shell Dlg 2 czcionki, a następnie MS Sans Serif będzie nadal używany. Trudno powiedzieć, ponieważ jest to zachowanie, gdy zdefiniowano "CLR", co nie powinno mieć miejsca, ponieważ Delphi już nie obsługuje.NET i IDE prawdopodobnie nie są kompilowane z zdefiniowanym CLR, ale nie ma możliwości upewnienia się po prostu od sprawdzenia kodu, jakie definicje warunkowe mogą być zastosowane podczas kompilowania IDE.

Niezależnie od tego, którą czcionkę używa IDE i jak wybiera tę czcionkę, dotyczy to tylko nowych formularzy utworzonych w IDE.

Dla istniejących form, jak w tym przypadku nie chodzi o TStringGrid jako takiego, ale raczej fakt, że stworzył projekt w wersji Delphi, który stosowany domyślną czcionkę zrobił/nie obsługuje Unicode.

Akt otwarciu projektu w nowszej wersji Delphi nie zmieni czcionkę używaną w formularzu (ów), a więc forma zapisane w Delphi 7 pomocą czcionki MS Sans Serif jest nadal przy użyciu tej czcionki po otwarciu w Delphi XE5.

TStringGrid sterowania jest następnie za pomocą czcionki MS Sans Serif, ponieważ jest to czcionka ustawiona na formularzu, a domyślne dla formantów na formularzu jest użycie ich czcionki formantu nadrzędnego.

to tym konkretnym przypadku z TStringGrid stosuje MS bezszeryfowy ponieważ formy, na której jest umieszczony (jeszcze) stosując MS bezszeryfowy. W takich przypadkach należy zmienić czcionkę formularza na Tahoma lub n. inna odpowiednia czcionka z obsługą Unicode.

Wszystkie elementy sterujące w formularzu, w których nadal jest używana czcionka nadrzędna, również przyjmą tę czcionkę. Podczas wykonywania tej czynności w konkretnej aplikacji możesz znaleźć kilka elementów sterujących przy ustawieniu FALSE dla ParentFont, które będą wymagać indywidualnego adresowania, a nawet jeśli ustawienia czcionek są "dziedziczone", projekty formularzy mogą wymagać dalszej pracy, aby uporządkować rzeczy z powodu zmian w wyglądzie wynikające ze zmiany czcionki.

Zauważ, że nawet ta zmiana Tahoma został wyprzedzony przez zmiany w samym systemie Windows, a jeśli chcesz zastosować jakąś inną domyślną czcionkę (w nowych formach/projektów) można znaleźć useful information here.

+0

Właściwie, w każdym razie, nowy projekt w XE7 używa MS Sans Serif. Spróbuj. Może to tylko ja. XE7 to miejsce, w którym wykonałem wszystkie moje testy. To nie zgadza się z informacją w Q. Nie wiem, dlaczego. –

+0

@ David - zaktualizowałem odpowiedź informacją, która może rzucić trochę światła. Czy masz wartość MS Shell Dlg 2 w FontSubstitutions, która określa MS Sans Serif?Jeśli nie, aw szczególności jeśli ten wpis lub cały klucz nie ma w systemie, może to oznaczać, że kod USE DEFINED (CLR) jest rzeczywiście aktywny w IDE (lub że procedura XE7 InitDefFontData zmieniła się ponownie z niektóre nowe warunki, które mogą spowodować wybór MS Sans Serif). – Deltics

+0

Być może podążyłeś już za radą w tym artykule, z którym się łączyłeś. I tak nie ma to znaczenia. Chodzi o to, że kontrola nie jest dobra z tą czcionką. –

Powiązane problemy