Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Eigene Komponente: Auf Application-Objekt zugreifen


UGrohne - Mo 14.03.05 14:05
Titel: Eigene Komponente: Auf Application-Objekt zugreifen
Hallo,
kann man aus einer eigenen entwickelten Komponete auf das Application-Objekt der Applikation zugreifen, das diese Komponente verwendet? Das Problem ist, dass ich den aktuellen Pfad des Programms ermitteln müsste.

Danke


raziel - Mo 14.03.05 14:14

Hi,

ich wäre ganz spontan die Owner-Hierarchie hochgeklettert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
var p: TComponent;
begin
  p := Self;
  repeat
    p := p.Owner;
  until (p is TApplication) or (p = nil);

  if(p is TApplication) then
    ShowMessage(TApplication(p).ExeName);
end;

Bin allerdings noch ein bisschen skeptisch :?

Gruß,
raziel


IngoD7 - Mo 14.03.05 14:22

Zitat:
kann man aus einer eigenen entwickelten Komponete auf das Application-Objekt der Applikation zugreifen, das diese Komponente verwendet?
Wenn ich dich richtig verstanden habe: Ja, natürlich. Das ist doch schnell ausprobiert. Hast du gegenteilige Erfahrungen gemacht?

Ich meine, du kannst da locker überall Application.Exename einsetzen ... oder nicht(?)


UGrohne - Mo 14.03.05 14:25

@IngoD7: Nein, eben nicht. Es handelt sich ja hier um eine Komponente, die noch keine Applikation um sich herum hat, daher hab ich zu diesem Zeitpunkt keinen Zugriff auf Application.

@raziel: Auch ne Idee, nur müsste der Anwender der Komponete diese dann eben korrekt initialisieren. Werde ich aber mal im Hinterkopf behalten.


IngoD7 - Mo 14.03.05 14:30

user profile iconUGrohne hat folgendes geschrieben:
@IngoD7: Nein, eben nicht. Es handelt sich ja hier um eine Komponente, die noch keine Applikation um sich herum hat, daher hab ich zu diesem Zeitpunkt keinen Zugriff auf Application.
Und wie wirkt sich das aus. Wer deine Komponente einsetzt, hat sie aber dann doch "in " einer Applikation. Ich rede von Komponenten, die auf einem TForm landen. Du nicht?


UGrohne - Mo 14.03.05 14:33

user profile iconIngoD7 hat folgendes geschrieben:
Und wie wirkt sich das aus. Wer deine Komponente einsetzt, hat sie aber dann doch "in " einer Applikation. Ich rede von Komponenten, die auf einem TForm landen. Du nicht?

Nicht ganz, es geht hierbei um eine nichtvisuelle Komponente. Davon abgesehen, kann ich nicht davon ausgehen, dass ich Zugriff auf ein Application-Objekt bekomme, denn theoretisch ist auch ein Einsatz in einer DLL denkbar und dort hat man diese Möglichkeit nicht. Da ist es dann aber auch nicht wichtig.


IngoD7 - Mo 14.03.05 14:42

Okay, aber was hilft dir dann raziels Vorschlag?

Wenn du auf TApplication aufprüfen kannst, dann ist die Unit Forms eingebunden. Wenn aber Forms eingebunden ist, dann ist auch Application schon bekannt.


Sprint - Mo 14.03.05 14:42
Titel: Re: Eigene Komponente: Auf Application-Objekt zugreifen
UGrohne hat folgendes geschrieben:
Das Problem ist, dass ich den aktuellen Pfad des Programms ermitteln müsste.

Was spricht gegen ParamStr(0) und ExtractFilePath?

Du kannst aber auch GetModuleName benutzen um den vollständigen Namen zu ermitteln. In einer DLL kannst du dann den vollständigen Dateinamen der EXE, aber auch der DLL ermitteln.


tommie-lie - Mo 14.03.05 14:55

Es müsste doch theoretisch gehen, indem man die Forms.pas einbindet und einfach auf das Application-Objekt zugreift, da es für die gesamte Anwendung identisch ist. Wenn deine Komponente aber auch in einer DLL sein kann und um den Benutzer nicht von der Forms.pas abhängig zu machen, wäre Sprints Weg aber die bessere Methode, wenn du nur den Pfad brauchst.


UGrohne - Mo 14.03.05 14:56
Titel: Re: Eigene Komponente: Auf Application-Objekt zugreifen
Irgendwie stand mir die ganze Zeit einer aufm Schlauch hab ich das Gefühl. IngoD7 hat Recht, wenn ich Forms einbinde kann ich auf das Application-Objekt zugreifen. Jetzt muss ich mir nur überlegen, ob mir das nicht Nachteile gibt, weil noch nicht sicher ist, ob ich die Komponente auch für Kommandozeilen-Applikationen brauche. Ich werde mir aber dieses GetModuleName auch mal genauer anschauen.

Danke, dass Ihr mir den Felsen von der Leitung runtergeschoben habt *g*


tommie-lie - Mo 14.03.05 15:22
Titel: Re: Eigene Komponente: Auf Application-Objekt zugreifen
user profile iconUGrohne hat folgendes geschrieben:
Jetzt muss ich mir nur überlegen, ob mir das nicht Nachteile gibt, weil noch nicht sicher ist, ob ich die Komponente auch für Kommandozeilen-Applikationen brauche.
Nein, das Einbinden von Forms macht noch lange keine Anwendung mit 'nem Fenster ;-) Aber es wäre ärgerlich, weil Forms doch ziemlichen Ballast mitbringt. Und gerade eine Komponente sollte so unabhängig wie möglich sein, daher würde ich dir ganz dringend anraten, ParamStr(0) (was ist der Wert bei DLLs? :gruebel:) oder GetModuleName() zu verwenden.


UGrohne hat folgendes geschrieben:
Danke, dass Ihr mir den Felsen von der Leitung runtergeschoben habt *g*
Also wir kennen ja harte Co-Admins, aber als Felsbrocken würde ich dich doch nicht bezeichnen :mrgreen:


IngoD7 - Mo 14.03.05 16:34

Also wenn's denn wirklich nur um den Filenamen (oder -pfad) geht, so macht euch um TApplication keine Sorgen. Application.Exename wird exakt per Paramstr(0) ermittelt.


UGrohne - Mo 14.03.05 19:29
Titel: Re: Eigene Komponente: Auf Application-Objekt zugreifen
user profile icontommie-lie hat folgendes geschrieben:
Nein, das Einbinden von Forms macht noch lange keine Anwendung mit 'nem Fenster ;-) Aber es wäre ärgerlich, weil Forms doch ziemlichen Ballast mitbringt. Und gerade eine Komponente sollte so unabhängig wie möglich sein, daher würde ich dir ganz dringend anraten, ParamStr(0) (was ist der Wert bei DLLs? :gruebel:) oder GetModuleName() zu verwenden.

Ja, das Aufblähen ist das hauptsächliche Problem...
Ich werde mich wohl mal an GetModuleName halten.


raziel - Mo 14.03.05 19:36
Titel: Re: Eigene Komponente: Auf Application-Objekt zugreifen
user profile icontommie-lie hat folgendes geschrieben:
(...) ParamStr(0) (was ist der Wert bei DLLs? :gruebel:)


Gibt ebenfalls den Pfad der Exe zurück:

Exesource:
1:
2:
3:
4:
5:
6:
procedure TForm1.Button1Click(Sender: TObject);
var hModule: THandle;
begin
  hModule := LoadLibrary('dll.dll');
  if(hModule <> 0then FreeLibrary(hModule);
end;



Dll-Source dll.dpr:
1:
2:
3:
4:
5:
uses  SysUtils, Classes, Dialogs;

begin
  ShowMessage(ParamStr(0));
end.


Gruß,
raziel


IngoD7 - Di 15.03.05 10:56
Titel: Re: Eigene Komponente: Auf Application-Objekt zugreifen
user profile iconraziel hat folgendes geschrieben:
user profile icontommie-lie hat folgendes geschrieben:
(...) ParamStr(0) (was ist der Wert bei DLLs? :gruebel:)


Gibt ebenfalls den Pfad der Exe zurück:


Weil bei ParamStr(0) immer die Win-API-Funktion GetModuleFileName mit Handle=0 aufgerufen wird, die in dem Fall sich dann so verhält.

Auszug aus Hilfe:
Zitat:
If this parameter is NULL, GetModuleFileName returns the path for the file used to create the calling process.


UGrohne - Di 15.03.05 11:10
Titel: Re: Eigene Komponente: Auf Application-Objekt zugreifen
user profile iconIngoD7 hat folgendes geschrieben:
Weil bei ParamStr(0) immer die Win-API-Funktion GetModuleFileName mit Handle=0 aufgerufen wird, die in dem Fall sich dann so verhält.

Gut zu wissen, dann brauch ich GetModule*... ja gar nicht mehr ;-)