![]() |
TFont(program)<>TFont(library)
Hi tu oll!
Das obige Problem ist ja hinreichend bekannt. Ein TFont-Objekt in einer library unterscheidet sich von einem TFont-Objekt in einem program. Gut, nehmen wir an, ich finde micht damit ab. ;) Kennt einer (es dürfen auch mehrere sein :) ) ein Workaround außer der Kompilierung mit Packages? Jeder noch so windige Tip ist willkommen. |
Re: TFont(program)<>TFont(library)
Schau Dir mal an, in welcher unit der entspr. TFont deklariert wurde.
Dann gehst Du z.B. hin, schreibst die entspr. unit des programmes mit in die uses deiner library. Wenn Du dann eine Variable von diesem Typ deklarieren willst, gib einfach die passende unit mit an "var test = wasweissich.TFont;" In Delphi gibt es leider einige inkompatible doppeldeklarationen, deshalb gehe ich mal davon aus, dass es hier das gleiche ist. |
Re: TFont(program)<>TFont(library)
Zitat:
|
Re: TFont(program)<>TFont(library)
Einzigst richtige Lösung ist der Vergleich über ClassName:
Delphi-Quellcode:
mit der Hoffnung das beide Klassen, also der in der Library und des eigenen Modules, die identische Klassennamen besitzen auch die gleichen Klassenimplementierungen darstellen. Dies trifft nur dann zu wenn beides, Library und Modul mit der exakt gleichen Kopie der Sourcen kompiliert wurden.
if Library.Font.ClassNameIs(TFont.ClassName) then
Nimm Packages, das macht es absolut sicher. Gruß Hagen |
Re: TFont(program)<>TFont(library)
Oder Du benutzt das
![]() mfG mirage228 |
Re: TFont(program)<>TFont(library)
Danke für eure Antworten.
@negaH: Zitat:
Zitat:
|
Re: TFont(program)<>TFont(library)
Hast Du denn auch schonmal nachgeschaut, WO die jeweiligen TFont deklariert wurden (welche unit)? DA dürfte der Hund begraben liegen, denn TFont kann <> TFont sein...
|
Re: TFont(program)<>TFont(library)
Ja, meines erachtens kommen beide aus der Unit "Graphics". In einem der vielen Threads in Google.Groups stand aber, das der Hase angeblich bei "TPersistent" im Pfeffer liegt. Aber ich werde das in der nächsten Stunde genauer untersuchen. Wenn ich also bis 14.00 Uhr keine weiteren Lebenszeichen von mir gebe, hab ich mich wahrscheinlicht mit einem Pointer erdrosselt. :-D
|
Re: TFont(program)<>TFont(library)
Zitat:
Der Vergleich der Klassennamen ist die EINZIGST mögliche Überprüfung zweier Klassen die in unterschiedlichen Modulen deklariert wurden, aber im Grunde identisch sind, auf Gleichheit zu verifizieren. Eine andere Möglichkeit gibt es einfach nicht. Da du OHNE Packages arbeitest sieht die Situation einfach so aus: Modul A benutzt seine komplett eigenen Sourcen für TFont und linkt dementsprechend alle RTTI und Klassen in sein eigenes Codesegement. Modul B benutzt seine komplett eigenen Sourcen für TFont und linkt dementsprechend alle RTTI und Klassen in sein eigenes Codesegement. Ergo: beide Module arbeiten mit ihren eigenen Klassen, basierend auf dem identischen Source. Ein Vergleich beider Klassen miteinander ist im Grunde unsinnig, wie auch ein Typcast über Modulgrenzen unsinnig ist. In jedem Falle stellen die beiden separaten TFont Klassen zwei absolut indifferente Klassen dar. Klar, praktisch gesehen hat man für Modul A und B jeweils den identischen Source für TFont benutzt, sie sind also logisch gesehen identisch, aber NICHT wirklich aus Sicht des Codes zum Vergleich von Klassen. Alle Operationen wie "is" und "as" werden damit Probleme bekommen. Die EINDEUTIGKEIT einer Klasse ist aber für das Funktionieren der kompletten VCL von entscheidender Bedeutung. Ein TForm aus Modul A ist eben nicht das gleiche TForm aus Modul B und auch nicht identisch zum TForm im eigenen Prozess. Der obige Ansatz über IUnknown und COM Interfaces zu gehen ist dagegen richtig in diesem Falle. Gruß Hagen |
Re: TFont(program)<>TFont(library)
Nach der Lektüre von Beschreibungen der VMT dämmert es jetzt ein wenig. Danke für eure Hilfe.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz