Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Feststellen ob Anwendung die VCL verwendet (https://www.delphipraxis.net/151791-feststellen-ob-anwendung-die-vcl-verwendet.html)

igel457 1. Jun 2010 18:52


Feststellen ob Anwendung die VCL verwendet
 
Hallo,

ich habe ein kleines Problemchen: Abhängig davon, ob eine Delphi Anwendung die VCL verwendet oder nicht, möchte ich entweder TThread.Synchronize verwenden oder eine eigene Non-VCL Methode. Um festzustellen, ob die VCL initialisiert ist oder nicht, müsste ich aber die Unit "Forms" einbinden, was bekanntermaßen die VCL automatisch initialisiert und die Größe der ausführbaren Datei aufbläht.

Momentan verwende ich folgenden Code, ich habe jedoch berechtigte Zweifel (TComponent wird erst mit der Registration von "TMenuItem" registriert), ob dieser Code mit allen Delphi-Versionen funktioniert:
Delphi-Quellcode:
function AcVCLActive: Boolean;
begin
  //The VCL can only be active, if the TComponent class is registered
  result := GetClass('TComponent') <> nil;
end;
Gibt es eine (zuverlässige) Möglichkeit festzustellen (entweder zur Compile- oder zur Laufzeit) ob die Anwendung die VCL (ich meine damit das vorhanden sein von TApplication) verwendet? Die Units "SysUtils" und "Classes" dürfen dabei verwendet werden.

Schonmal vielen Dank,
Andreas

shmia 1. Jun 2010 18:58

Re: Feststellen ob Anwendung die VCL verwendet
 
Zur Laufzeit:
Delphi-Quellcode:
function IsVclApplication:Boolean;
begin
  Result := Assigned(Classes.FindGlobalComponent);
end;

igel457 1. Jun 2010 19:11

Re: Feststellen ob Anwendung die VCL verwendet
 
Danke für die schnelle Antwort.

Leider scheinen neuere Delphi-Versionen mehrere "FindGlobalComponentProcs" zu unterstützen und die FindGlobalComponent-Funktion ist nun statisch in der Classes-Unit vorhanden:

Delphi-Quellcode:
function FindGlobalComponent(const Name: string): TComponent;
var
  I: Integer;
begin
  Result := nil;
  if FindGlobalComponentProcs <> nil then
  begin
    for I := FindGlobalComponentProcs.Count - 1 downto 0 do
    begin
      Result := TFindGlobalComponent(FindGlobalComponentProcs[I])(Name);
      if Result <> nil then Exit;
    end;
  end;
end;
Ich hatte auch schon vorher mit dieser Funktion herumgespielt, doch leider ist dabei nichts brauchbares entstanden...

Die "FindGlobalComponentProcs"-Liste ist leider nur privat für die Classes unit.

Edit: Kann ich vielleicht irgendwie über die RTTI an alle vorhanden Klassen kommen, die von TPersistent abgeleitet sind?

H4ndy 1. Jun 2010 19:44

Re: Feststellen ob Anwendung die VCL verwendet
 
Vielleicht geht das ja.
Allerdings weiss ich nicht, ab wann dieses Compiler-Konstrukt funktioniert, hab nur D2010 zur Hand.

Delphi-Quellcode:
function AcVCLActive: Boolean;
begin
  {$IF Defined(TApplication)}
  Result := True;
  {$ELSE}
  Result := False;
  {$IFEND}
end;

Helmi 1. Jun 2010 19:48

Re: Feststellen ob Anwendung die VCL verwendet
 
Zitat:

Zitat von H4ndy
Vielleicht geht das ja.
Allerdings weiss ich nicht, ab wann dieses Compiler-Konstrukt funktioniert, hab nur D2010 zur Hand.

Delphi-Quellcode:
function AcVCLActive: Boolean;
begin
  {$IF Defined(TApplication)}
  Result := True;
  {$ELSE}
  Result := False;
  {$IFEND}
end;

Nur so als Info:
Dieses Konstrukt wird unter D7 Pro kompiliert, aber es wird false rückgemeldet

himitsu 1. Jun 2010 19:52

Re: Feststellen ob Anwendung die VCL verwendet
 
@H4ndy: Dieses prüft nur ob TApplication an der Codestelle verfügbar wäre.
Wobei ihm auch noch TApplication egal ist.

Mit Definied(TComponent) würde auch sowas geprüft
und am Ende ist dieses Ergebnis vollkommen irrelevant, da dieses nicht aussagt, ob diese Klasse auch verwendet wird,
abgesehn davon, daß man dafür auch noch die böse Forms-Unit einbinden muß, mit dem Ergebnis, daß man gleich TRUE zurückgeben kann. :roll:

H4ndy 1. Jun 2010 20:05

Re: Feststellen ob Anwendung die VCL verwendet
 
@himitsu Ach stimmt, das sagt ja dann leider nix ueber die gesammte Anwendung aus :/
Forms muss man nicht dafuer einbinden, da das Defined() und Declared() eine reine Compiler-Anweisung ist.

Andere Frage: Kann man nicht einfach immer die NonVCL-Routine nutzen?

himitsu 1. Jun 2010 20:17

Re: Feststellen ob Anwendung die VCL verwendet
 
Zitat:

Zitat von H4ndy
da das Defined() und Declared() eine reine Compiler-Anweisung ist.

Schon klar, wobei TApplication ihm doch vollkommen schnuppe ist,
aber um auf diese Weise z.B. TComponent prüfen zu können, muß man die entsprechende Unit einbinden.

@Lösung: Du könntest eventuell nachsehn, ob irgendwelche von der VCL verwendete/benötigte Resourcen vorhanden sind.

igel457 1. Jun 2010 20:57

Re: Feststellen ob Anwendung die VCL verwendet
 
Vielen Dank schonmal für die ganzen Antworten.

Zitat:

Zitat von H4ndy
Andere Frage: Kann man nicht einfach immer die NonVCL-Routine nutzen?

Nein, leider geht das in meinem Fall nicht, da meine NonVCL-Routine nicht nur NonVCL, sondern auch noch Plattform unabhängig und auch für Konsolenanwendungen geeignet ist: Meine Notifications (wofür ich das ganze Brauche) werden hiervon einfach unsynchronisiert ausgegeben. Sobald die VCL/LCL vorhanden ist, möchte ich meine Notifications jedoch mit dem Hauptthread synchronisieren, da dies dem Anwender der Bibliothek ermöglicht ganz Transparent auf Events zu reagieren, ohne z.B. mit Mutices oder Critical Sections umgehen zu müssen.

In meiner alten Version des Codes, habe ich entsprechend einen Compilerswitch eingefügt, der explizit aktiviert werden muss, sobald man die VCL nicht verwendet. Da ich das Ganze nun neu geschrieben habe, möchte ich es so einfach verwendbar wie möglich haben. Und bevor jemand auf die Idee kommt das Vorzuschlagen: Die Synchronisation kann auch recht einfach vom Anwender selbst geschehen, er muss dann nur eine Funktion in einem Timer/Schleife/Was auch immer aufrufen.

Zitat:

Zitat von himitsu
Du könntest eventuell nachsehn, ob irgendwelche von der VCL verwendete/benötigte Resourcen vorhanden sind.

Das wäre nicht mal so dumm, schließlich könnte ich das sogar Plattformübergreifend mit einem TResourceStream machen...

Nochmal Danke, vielleicht hat jemand noch eine Zündende Idee,
Andreas

himitsu 1. Jun 2010 21:14

Re: Feststellen ob Anwendung die VCL verwendet
 
Eine zündene Idee, wie der Anwender doch mithilft.
PS: Nur weil die VCL eingebunden ist, muß sie bei den Events dennoch keine Rolle spielen.

Bau doch einfach ein Feld/Property in deiner Komponente ein, wo man den SyncMode wählen kann.
(per Standard auf VCL-Synchronize ... sicher ist sicher, falls man das Setzen vergist)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:04 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz