Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
384to388
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
384to388
384to388
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

[Excel] OLEObject und die Ereignisse

[Excel] OLEObject und die Ereignisse
19.02.2004 11:15:53
neolithos
Das OLEObject hat die zwei Ereignisse GotFocus und LostFocus.
Doch leider will es mit nicht gelingen die Ereignisse abzufangen.
Da habe ich folgenden Test versucht:
Kann mir jemand erkläaren warum es zu einem Laufzeitfehler kommt???
Code:
Private withevents t As OLEObject

Private Sub cmdTest_Click()
Set t = Tabelle1.OLEObjects("cmdTest") ' <- Fehler: Ohne WithEvents klappt es
End Sub


Private Sub cmdTest_LostFocus()
MsgBox "test"
End Sub



Private Sub t_LostFocus()
MsgBox "test 2"
End Sub

In VBA-Code in einer Excel-Tabelle. Auf dieser Tabelle befindet sich ein CommandButton namens cmdTest.

Scharfes Programm:
Delphi:
IID = '{00024410-0000-0000-C000-000000000046}'
Source steht ein _OLEObject
procedure InterfaceConnect(const Source: IUnknown; const IID: TIID;
const Sink: IUnknown; var Connection: Longint);
var
CPC: IConnectionPointContainer;
CP: IConnectionPoint;
begin
Connection := 0;
if Succeeded(Source.QueryInterface(IConnectionPointContainer, CPC)) then
if Succeeded(CPC.FindConnectionPoint(IID, CP)) then // <- Hier schlägt es Fehl Warum?
CP.Advise(Sink, Connection);
end;

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: [Excel] OLEObject und die Ereignisse
19.02.2004 12:03:55
Alex K.
Hallo neolithis
du kannst die t ohne WithEvents definieren. Die Ereignisse GotFocus / LostFocus bekommst du ohne die spezielle Definition. Wichtig ist, dass die Ereignisse in dem Tabellenblatt abgefangen werden, in dem auch "cmdTest_Click()" steht.
Also:

Private Sub cmdTest_GotFocus()
MsgBox "Aktiviert"
End Sub
Private Sub cmdTest_LostFocus()
MsgBox "Deaktiviert"
End Sub

AW: [Excel] OLEObject und die Ereignisse
19.02.2004 12:28:11
neolithos
Ups!
Ich habe vergessen etwas zu erwähnen! Das ist wie gesagt nur ein kleiner Test.
Ich habe aber das Control gekapselt
ca. so steht es in der Klasse
private withevents cmd as MSForms.CommandButton ' für cmd_OnClick
private withevents obj as OLEObject ' für obj_LostFocus
Anzeige
AW: [Excel] OLEObject und die Ereignisse
19.02.2004 12:36:03
Alex K.
Hallo,
so geht es leider nicht. Die Ereignisse bekommst du nur im Code der Tabelle mit dem OLEObjekt. Du kannst dort ja deine Klassen-Funktionen aufrufen, oder spricht etwas dagegen?
Und warum hast du eine eigene Klasse hierfür gemacht?
AW: [Excel] OLEObject und die Ereignisse
19.02.2004 14:19:17
neolithos
Eigentlich ist diese Klasse ein Teil eines ActiveX-Objects (Delphi), welches eine Dynamische Kalkulation auf der Basis eines PPS-System macht.
Eigentlich handelt sich es bei diesem Kontrol um eine Liste. Die Teil einer selbstgeschriebenen DropDown-Kombo ist. Daher LostFocus.
Derzeit musste ich für jede Liste ein LostFocus-Ereignis in dem Excel-Doc. anlegen. Und dort Visible = false aufrufen. Das will ich mir aber sparen.
Langsam habe ich aber das gefühl, das es ein Fehler von Excel ist, das diese Ereignisse nicht sauber weitergegeben werden. Denn es wird für OLEObject kein EventDispatcher gefunden! Ergo FindConnectionPoint schlägt fehl! *arrrg*
Seltsam!
*** Kann man sowas auch als Hinweis zu MS schicken! ***
Anzeige
Bypass als Lösungskrücker
19.02.2004 14:38:58
Alex K.
Hallo,
jetzt habe ich dein Problem verstand :-)
Eine Krücke als Bypass habe ich. Du kannst feststellen, wenn der User das Objekt verläßt und eine Zelle in der Tabelle aktiviert.
Dann kannst du deine eigene OLEObjekte auf Visible = False stellen. Den Code hierzu im VBA Editor in "DieseArbeitsmappe" kopieren.
Hier mal ein Beispiel für CommandButtons:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
Dim obj     As OLEObject
For Each obj In ActiveSheet.OLEObjects
If obj.ProgId = "Forms.CommandButton.1" Then
obj.Visible = False
End If
Next obj
End Sub

Ist natürlich nur eine Krücke, dann wenn der User auf ein anderes OLEObjekt klickt oder wieder die gleich Zelle wie zuvor aktiv, selektiert, bekommst du das Ereignis nicht.
Aber schaue dir mal die einzelnen Ereignisse in "DieseArbeitsmappe" an, vielleicht klappt es damit, die meisten Fälle abzudecken.
Anzeige
AW: Bypass als Lösungskrücker
19.02.2004 21:08:52
neolithos
Das ist eine gute Idee!
Das kann ich erstmal verwenden!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige