Hi!
Ich habe ein Modul habe welches einen Variablenwert von meinem Formular ändern soll. Auf label usw. kann ich zugreifen aber nicht auf die Variable. Wie bekomme ich eine globale Variable auf der ich lesen/schreiben kann?
Viele Grüße
Franz
Hi!
Ich habe ein Modul habe welches einen Variablenwert von meinem Formular ändern soll. Auf label usw. kann ich zugreifen aber nicht auf die Variable. Wie bekomme ich eine globale Variable auf der ich lesen/schreiben kann?
Viele Grüße
Franz
Hallo,
Ich habe ein Modul habe welches einen Variablenwert von meinem
Formular ändern soll. Auf label usw. kann ich zugreifen aber
nicht auf die Variable. Wie bekomme ich eine globale Variable
auf der ich lesen/schreiben kann?
deklariere sie im Modul als Public.
‚Public Variable as Long‘
… zum Beipiel. Dann kannst Du von überall aus darauf zugreifen.
Gruß, Rainer
Hallo Franz,
eine Frage noch zu dem Thema …
In ein Modul schreibt man ja wiederverwendbaren Code, also Programmteile, die man dann einfach in anderen Programmen weiterverwenden kann/will.
Von so einem Modul aus auf eine Form zuzugreifen funktioniert ja dann nur, wenn die Form enthält, was das Modul verwenden soll. Das halte ich nicht für geschickt, genau genommen widerspricht das dem Konzept. Überdenke das noch mal, ich würde das andern. Mir scheint, Du hast Programmteile in ein Modul ausgelagert, die in eine Prozedur gehört hätten. Damit machst Du Dir das Leben unnötig schwer.
Gruß, Rainer
Danke für den Hinweis. Eigentlich hab ich nur einen Rückgabewert der aufgerufenen Funktion gebraucht und hab damals nicht gleich daran gedacht. Aber danke nochmals!
Viele Grüße
Franz
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hallo Rainer!
Nachdem ich nach längerer Zeit wieder mal kompiliert habe, funktioniert es nicht mehr so richtig. Außer der Möglichkeit der globalen Variable fällt mir nichts mehr ein. Der Code war vorher in einem Modul, aber jetzt ist er in einer Form (bei dem es beim AdressOf eine ungültige Verwendung gibt).
Ich könnte das ganze wieder in ein Modul schreiben und mit der globalen Variable arbeiten. Das mit dem Rückgabetyp kann nicht so funktionieren, denn eine Funktion kann ja nur einen Rückgabewert haben …
Hier mal der Code:
'Fenster, die in der Taskleiste zu sehen sind
'http://www.vbarchiv.net/archiv/tipp_1147.html
Public currentApps As Integer
’ Benötigte API’s
Private Declare Function EnumWindows Lib „user32“ ( _
ByVal lpEnumFunc As Long, _
ByVal lParam As Long) As Long
Private Declare Function GetWindowLong Lib „user32“ _
Alias „GetWindowLongA“ ( _
ByVal hWnd As Long, _
ByVal nIndex As Long) As Long
Private Declare Function GetParent Lib „user32“ ( _
ByVal hWnd As Long) As Long
Private Declare Function IsWindowVisible Lib „user32“ ( _
ByVal hWnd As Long) As Long
Private Declare Function GetWindow Lib „user32“ ( _
ByVal hWnd As Long, _
ByVal wCmd As Long) As Long
’ Noch ein paar Konstanten
Private Const GWL_EXSTYLE = (-20)
Private Const GWL_STYLE = (-16)
Private Const GW_OWNER = 4
Private Const WS_EX_TOOLWINDOW = &H80&
Private Const WS_EX_APPWINDOW = &H40000
’ Laufende Anwendungen
’ ------------------------------------------------------------------
’ Diese Funktion initialisiert das Ganze
Sub ew_go()
’ Aufrufen, und ew_callback() übergeben.
’ Der zweite Parameter ist egal, kann frei definiert werden
EnumWindows AddressOf ew_callback, 0
End Sub
’ Diese Function nimmt die Callbacks entgegen.
’ param ist der zweite Parameter von EnumWindows,
’ handle stellt ein enumeriertes Fenster dar
Private Function ew_callback(ByVal handle As Long, ByVal param As Long) As Long
’ Die Funktion ew_fenster() prüft das Fenster
ew_fenster handle
’ TRUE zurückgeben, um Windows zu sagen: Alles OK
’ und evtl. Fehler zu vermeiden
ew_callback = True
End Function
’ Diese Funktion prüft, ob das gefundene Fenster
’ in der Taskleiste angezeigt wird
Private Sub ew_fenster(handle As Long)
Dim i1 As Long
Dim i2 As Long
Dim d1 As String
Dim d2 As String
’ Fenster muss sichtbar sein UND darf kein Elternfenster haben
If IsWindowVisible(handle) And GetParent(handle) = 0 Then
’ erweiterte Optionen abrufen
i1 = GetWindowLong(handle, GWL_EXSTYLE)
’ nochmals Elternfenster prüfen:
i2 = GetWindow(handle, GW_OWNER)
’ Prüfen, ob:
’ - Kein ToolWindow und kein Childfenster oder
’ - Anwendungsfenster und Childfenster
If ((i1 And WS_EX_TOOLWINDOW) = 0 And i2 = 0) Or _
((i1 And WS_EX_APPWINDOW) And (i2 0)) Then
currentApps = currentApps + 1
Label1(7).Caption = currentApps
End If
End If
End Sub
Die Aufgabe hier ist es die laufenden Anwendungen in der Taskleiste herauszufinden. Das ist früher mal gegangen …
Naja vielleicht liegt der Fehler doch wo anders, aber ich glaub weniger …
Meine „globale“ Variable ist currentApps. Genau diese benötige ich in meinem Hauptformular. Anschließend wird die Anzahl noch auf einem Label angezeigt.
Soviel dazu!
Ich hoffe du hast Lust mir weiterzuhelfen! Sonst schmeiß ich es wieder in ein Modul …
MFG
Franz
Hallo Franz,
fast hätte ich Deinen Beitrag übersehen. Wenn Du auf meine Beiträge antwortest, bekomme ich eine Mail, dann passiert das nicht.
Nachdem ich nach längerer Zeit wieder mal kompiliert habe,
funktioniert es nicht mehr so richtig. Außer der Möglichkeit
der globalen Variable fällt mir nichts mehr ein. Der Code war
vorher in einem Modul, aber jetzt ist er in einer Form (bei
dem es beim AdressOf eine ungültige Verwendung gibt).
Ich könnte das ganze wieder in ein Modul schreiben und mit der
globalen Variable arbeiten. Das mit dem Rückgabetyp kann nicht
so funktionieren, denn eine Funktion kann ja nur einen
Rückgabewert haben …
Die Aufgabe hier ist es die laufenden Anwendungen in der
Taskleiste herauszufinden. Das ist früher mal gegangen …Naja vielleicht liegt der Fehler doch wo anders, aber ich
glaub weniger …Meine „globale“ Variable ist currentApps. Genau diese benötige
ich in meinem Hauptformular. Anschließend wird die Anzahl noch
auf einem Label angezeigt.Soviel dazu!
Ich hoffe du hast Lust mir weiterzuhelfen! Sonst schmeiß ich
es wieder in ein Modul …
Lust habe ich schon, ob ich das schaffe, weiß ich aber noch nicht.
Ich frage noch einmal. Du möchtest wissen, wie vile Fenster in der Taskleiste liegen? Was weißt Du über diese Fenster? Suchst Du alle beliebigen Programme oder nur Deine Eigenen, deren Titel Du kennst?
Dein Code ist für mich recht schwer zu lesen, so etwas habe ich noch nicht gemacht, aber irgendwann ist ja immer das erste mal.
Erkläre doch mal noch etwas genauer, worum es geht. Suchst Du wirklich die Fenster, oder doch eher eine Liste der laufenden Programme, also eher eine Prozess-Liste?
Gruß, Rainer
Hallo Rainer!
OK das nächste Mal antworte ich auf deine Beiträge
Ich möchte die Anzahl aller laufenden Anwendungen/Fenster in der Taskleiste haben. Also nicht die, die dort nicht angezeigt werden und nur im Taskmanager evtl. noch zu sehen sind.
Was weiß ich über die Fenster? Naja nicht viel. Ich hab den Tipp den ich gefunden hatte nur so angepasst, dass er mir die Anwendungen in der Taskleiste zählt und das tut er auch.
Ich suche alle Fenster/Anwendungen.
Naja Prozessliste ist es ja nicht da mehr Sachen laufen als in der Taskleiste zu sehen sind. Z.B. sind auf http://www.teamstaroffice.org/infos/webtop/grafikgro… 4 Anwendungen zu sehen. Das will ich zählen!
Ganz unten um
currentApps = currentApps + 1
Label1(7).Caption = currentApps
die gehts eigentlich. Wie die Rückgabe des Wertes ausschaut weiß ich aber nicht. Zurzeit hab ich es wieder global gemacht …
Ich hoffe du findest eine Lösung! Vielen Dank für deine Hilfe!
MFG
Franz
Hallo Franz,
Ich möchte die Anzahl aller laufenden Anwendungen/Fenster in
der Taskleiste haben. Also nicht die, die dort nicht angezeigt
werden und nur im Taskmanager evtl. noch zu sehen sind.
OK.
Was weiß ich über die Fenster? Naja nicht viel. Ich hab den
Tipp den ich gefunden hatte nur so angepasst, dass er mir die
Anwendungen in der Taskleiste zählt und das tut er auch.Ich suche alle Fenster/Anwendungen.
Auch OK. Ich muß mir den Code mal in der IDE ansehen …
Naja Prozessliste ist es ja nicht da mehr Sachen laufen als in
der Taskleiste zu sehen sind. Z.B. sind auf
http://www.teamstaroffice.org/infos/webtop/grafikgro…
4 Anwendungen zu sehen. Das will ich zählen!
Ja, ist klar.
currentApps = currentApps + 1
Label1(7).Caption = currentAppsdie gehts eigentlich. Wie die Rückgabe des Wertes ausschaut
weiß ich aber nicht. Zurzeit hab ich es wieder global gemacht
…Ich hoffe du findest eine Lösung! Vielen Dank für deine Hilfe!
‚eine‘ Lösung habe ich schon, die gefällt mir aber nicht. Das ist wieder mal unsauber ‚gefummelt‘, läuft vermutlich nur bei mir. Ich suche mal noch ein wenig.
Nur Eins verstehe ich nicht. Wenn Du das in verschiedenen Formen brauchst, was spricht dann dagegen, das in einem Modul laufen zu lassen? Oder habe ich das wieder falsch verstanden? Ich möchte es nämlich auch in ein Modul packen, dann ist die Form nicht so zugemüllt und wenn nur eine Zahl zurückgegeben werden soll, bietet sich eine globale Funktion doch förmlich an.
Gruß, Rainer
Hallo Franz,
das war mir alles zu kompliziert. Ich habe ein wenig aus Deinem Code geklaut und das Ganze etwas umgeschrieben …
'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
'\* In der Form \*
'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
Option Explicit
Private Sub Form\_Load()
Label4.Caption = currentApps
End Sub
'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
'\* im Modul \*
'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
Option Explicit
Private Declare Function GetWindow Lib "user32" \_
(ByVal hWnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetParent Lib "user32" \_
(ByVal hWnd As Long) As Long
Private Declare Function GetWindowText Lib "user32" \_
Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, \_
ByVal cch As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" \_
(ByVal hWnd As Long) As Long
Private Declare Function GetWindowLong Lib "user32" \_
Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Const GW\_HWNDFIRST = 0
Const GW\_HWNDNEXT = 2
Private Const GWL\_EXSTYLE = (-20)
Private Const GWL\_STYLE = (-16)
Private Const GW\_OWNER = 4
Private Const WS\_EX\_TOOLWINDOW = &H80&
Private Const WS\_EX\_APPWINDOW = &H40000
Public Function currentApps() As Integer
Dim CurrWnd As Long
Dim Length As Long
Dim i1 As Long
Dim i2 As Long
Dim d1 As String
Dim d2 As String
CurrWnd = GetWindow(Form1.hWnd, GW\_HWNDFIRST)
While CurrWnd 0
CurrWnd = GetWindow(CurrWnd, GW\_HWNDNEXT)
If IsWindowVisible(CurrWnd) And GetParent(CurrWnd) = 0 Then
i1 = GetWindowLong(CurrWnd, GWL\_EXSTYLE)
i2 = GetWindow(CurrWnd, GW\_OWNER)
If ((i1 And WS\_EX\_TOOLWINDOW) = 0 And i2 = 0) Or \_
((i1 And WS\_EX\_APPWINDOW) And (i2 0)) Then
currentApps = currentApps + 1
End If
End If
Wend
End Function
Du kannst natürlich den Code aus dem Modul auch in die Form schreiben und einfach ‚Public Function‘ in ‚Private Function‘ ändern, dann läuft der Code auch.
Getestet, bei mir läuft der Code. Nun gefällt er mir auch.
Gruß, Rainer