[Delphi] Problem z TFont.Assign

0

Mam problem. Przy przypisywaniu

Form1.Font.Assign(Screen.HintFont);

pojawia się exception: "Unable to convert".

Cała rzecz w tym, że wewnątrz TFont.Assign(Source:TPersistent) jest linia:

if (Source is TFont) then

, która zwraca wartość fałsz i nie wykonuje if'a.

Sprawdzałem debugując:

pointer(Source) = $E21600
pointer(Screen.HintFont) = $E21600

W czym więc problem??

0
Szczawik napisał(a)

Cała rzecz w tym, że wewnątrz TFont.Assign(Source:TPersistent) jest linia:

if (Source is TFont) then

, która zwraca wartość fałsz i nie wykonuje if'a

W takim razie obiekt reprezentowany przez Screen.HintFont nie jest obiektem klasy TFont :)

0

Mylisz się.. napisz

if Screen.HintFont is TFont then
application.Terminate;

a twój program zostanie zamknięty.. Screen.HintFont TO JEST TFont.

0

Przeczytaj jeszcze raz to, co napisałeś. Mówisz, że warunek

if (Source is TFont) then

zwraca Ci fałsz. Dobra, rozumiem, że to fragment metody TFont.Assign(). Skoro tak, to jako parametr Source masz podany Screen.HintFont - a więc Source (Screen.HintFont) nie jest klasy TFont. Nie wiem czemu, ale tak wynika z wykonania warunku.

0

Huh.. Wróciliśmy do punktu wyjścia: ja też nie wiem, właśnie dlatego o to pytam..

Przypomnienie z pierwszego postu, fragment z debugowania (podgląd Watch'ów z Delphi):

pointer(Source) = $E21600
pointer(Screen.HintFont) = $E21600

A więc to jest to samo, Screen.HintFont jest czcionką, a mimo tego sprawdzanie zwraca fałsz.

0

Dziwne, że nie działa - typy są identyczne.

TScreen: property HintFont: TFont;
TForm: property Font: TFont;

Także w zasadzie powinno chodzić .. u mnie działa - może daj tak:

Form1.Font.Assign(TFont(Screen.HintFont));

0

To też nie działa.. ale już dałem sobie radę: cały bajer polegał na tym: Aplikacja ładowała DLL (oba w pisane Delphi). Podawała mu swojego TApplication i TScreena, bo jak wiadomo DLL ma własne, więc by współpracowały potrzeba podmienić. DLL i aplikacja są przecież we wspólnej pamięci więc nie powinno być problemu.

Problem pojawił się z tym wywołaniem podczas ustawienia Hint'a na kontrolce okna tworzonego przez DLL. Rzecz jest następująca: nie dość, że DLL i aplikacja mają własne środowiska (TApplication i TScreen), to jeszcze każde tworzy sobie listę obiektów GDI (Manager). Przy powyższym odwołaniu pojawiał się problem z tą listą. DLL miał czcionkę na liście, ale aplikacja na swojej nie miała i error. Troszkę nie wiem jak bezpośrednio sobie z tym poradzić, więc zrobiłem to przez funkcje exportowane DLL. Dziwi mnie to, że nie działa to jedynie dla obiektów takich jak czcionki, pen'y i brush'e, ale TImageList czy TForm nie mają nic przeciwko bezpośrednim wywołaniom funkcji.

Cokolowiek, ale dzięki za pomoc.Wciąż jednak nie wiem jak zrobić Hint'y na kontrolkach Formy utworzonej przez DLL. Ale to może treść na kiedy indziej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1