AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Feststellen ob Anwendung die VCL verwendet

Ein Thema von igel457 · begonnen am 1. Jun 2010 · letzter Beitrag vom 2. Jun 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#1

Feststellen ob Anwendung die VCL verwendet

  Alt 1. Jun 2010, 19:52
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
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Feststellen ob Anwendung die VCL verwendet

  Alt 1. Jun 2010, 19:58
Zur Laufzeit:
Delphi-Quellcode:
function IsVclApplication:Boolean;
begin
  Result := Assigned(Classes.FindGlobalComponent);
end;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Feststellen ob Anwendung die VCL verwendet

  Alt 1. Jun 2010, 20:11
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?
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#4

Re: Feststellen ob Anwendung die VCL verwendet

  Alt 1. Jun 2010, 20:44
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;
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.325 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Feststellen ob Anwendung die VCL verwendet

  Alt 1. Jun 2010, 20:48
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
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#6

Re: Feststellen ob Anwendung die VCL verwendet

  Alt 1. Jun 2010, 20:52
@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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von H4ndy
H4ndy

Registriert seit: 28. Jun 2003
Ort: Chemnitz
515 Beiträge
 
Delphi XE3 Professional
 
#7

Re: Feststellen ob Anwendung die VCL verwendet

  Alt 1. Jun 2010, 21:05
@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?
Manuel
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#8

Re: Feststellen ob Anwendung die VCL verwendet

  Alt 1. Jun 2010, 21:17
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Feststellen ob Anwendung die VCL verwendet

  Alt 1. Jun 2010, 21:57
Vielen Dank schonmal für die ganzen Antworten.

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 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
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#10

Re: Feststellen ob Anwendung die VCL verwendet

  Alt 1. Jun 2010, 22:14
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:19 Uhr.
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