Autor Beitrag
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mo 14.03.05 14:05 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Mo 14.03.05 14:14 
Hi,

ich wäre ganz spontan die Owner-Hierarchie hochgeklettert:
ausblenden 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

_________________
JSXGraph
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Mo 14.03.05 14:42 
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.

_________________
Ciao, Sprint.
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
UGrohne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mo 14.03.05 14:56 
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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Mo 14.03.05 15:22 
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:

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Mo 14.03.05 19:29 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2453

Arch Linux
JS (WebStorm), C#, C++/CLI, C++ (VS2013)
BeitragVerfasst: Mo 14.03.05 19:36 
user profile icontommie-lie hat folgendes geschrieben:
(...) ParamStr(0) (was ist der Wert bei DLLs? :gruebel:)


Gibt ebenfalls den Pfad der Exe zurück:
ausblenden 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;


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

begin
  ShowMessage(ParamStr(0));
end.


Gruß,
raziel

_________________
JSXGraph
IngoD7
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 629


D7
BeitragVerfasst: Di 15.03.05 10:56 
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 15.03.05 11:10 
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 ;-)