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
UGrohne 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
IngoD7 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
UGrohne 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
tommie-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
tommie-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 <> 0) then 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
raziel hat folgendes geschrieben: |
tommie-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
IngoD7 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 ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!