Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - ActiveX einbinden - aber wie?!


tdroese - So 16.11.08 15:43
Titel: ActiveX einbinden - aber wie?!
Hallo an alle Forumsmitglieder,

derzeit bin ich dabei von VB auf Delphi umzusteigen und einige Projekte zu übertragen. Viele Dinge sind in Delphi leichter zu realisieren aber ich beiße mir manchmal echt die Zähne aus...

Zum Beispiel:

Ich habe eine Anwendung die auf ein ActiveX zugreift, dies habe ich auch in Delphi eingebunden und ein Objekt unter "ActiveX" in der Leiste.

Dies bette ich nun in die Anwendung ein "TEIBNet". Dies kann ich dann auch prima ansprechen und Kommandos an das ActiveX senden z.B. "EIBNet1.SendBit (X);" usw. aber wie reagiere ich darauf, wenn das ActiveX etwas empängt? Es gibt dort eine Methode die nennt sich EIBNet1.OnReceive, die ein Ereignis ähnlich "OnClick" auslösen soll...

In VB hab ich dafür folgende Prozedur:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
Private Sub EIBnet1_OnReceive(ByVal GroupAddr As Integer, ByVal Value As Long)
    Dim GA1 As Integer
    Dim GA2 As Integer
    Dim GA3 As Integer
    
    '-- decompress GroupAddress
    GA1 = (GroupAddr And &HF800) / (2 ^ 11)
    GA2 = (GroupAddr And &H700) / (2 ^ 8)
    GA3 = (GroupAddr And &HFF)
    
    '-- format values
    Dim sGA As String
    sGA = "GA = " + Format(GA1) + "/" + Format(GA2) + "/" + Format(GA3)
    
    Range("E5").Select
    ActiveCell.FormulaR1C1 = sGA

    If (GA1 = 10) And (GA2 = 3) And (GA3 = 1) Then
    ....
    End If

End Sub

Aber wie löse ich das in Delphi? Bin völlig ratlos und nirgendwo fündig geworden...
Geht das über ein Interface?! Und wie löse ich die Gruppenadressen auf?

Hoffe hier gibt es noch den ein oder anderen der "in beiden Welten" zu Hause ist und mir weiterhelfen kann...

Schönen Tag noch!

Thomas

Moderiert von user profile iconUGrohne: Code-Tags hinzugefügt.


tdroese - Mo 17.11.08 14:35
Titel: Lösung für "OnReceive"
Habe die Lösung inzwischen gefunden! Für den Fall, dass es andere hier gibt, die ebenfalls dieses Problem haben sollten:

Unter

type
procedure OnReceive(Sender: TObject; GroupAddr: smallint; Value: longint);


Dann im FormCreate Ereignis:
EIBNet1.OnReceive := OnReceive;

und nun die Prozedur... :)...

procedure OnReceive(Sender: TObject; GroupAddr: smallint; Value: longint);
begin
...
end;

Damit löst die ActiveX ein Ereignis im Hauptprogramm aus. Soweit so gut...
Aber wie ich jetzt die Gruppenadresse zerlege... Ich weiß es nicht...

Also wie löse ich diese Rechnung in Delphi?

GA1 = (GroupAddr And &HF800) / (2 ^ 11)
GA2 = (GroupAddr And &H700) / (2 ^ 8)
GA3 = (GroupAddr And &HFF)


tdroese - Di 18.11.08 20:40
Titel: Binärzahlen usw.
Hallo Leute,

ich brauche immer noch Hilfe bei der Auflösung der Gruppenadressen!

In VB:


Quelltext
1:
2:
3:
GA1 = (GroupAddr And &HF800) / (2 ^ 11) 
GA2 = (GroupAddr And &H700) / (2 ^ 8)
GA3 = (GroupAddr And &HFF)


Bisher in Delphi


Quelltext
1:
2:
3:
GA1 := (GroupAddr And StrToInt('$' + 'F800') 
GA2 := (GroupAddr And StrToInt('$' + 'F700') 
GA3 := (GroupAddr And StrToInt('$' + 'FF')


Im VB Code steht 2^11. Damit werden typischerweise Bitpositionen beschrieben:

2^0 = 1 = &H1, niederwertigstes Bit
2^1 = 2 = &H2
2^10 = 1024 = &H400
2^20 = 1024*1024 = 1048576 = &H100000
2^31 = 2147483648 = &H80000000, höchstwertiges Bit

etc.


Quelltext
1:
2:
3:
GA1 = (GroupAddr And &HF800) / (2 ^ 11) 
GA2 = (GroupAddr And &H700) / (2 ^ 8) 
GA3 = (GroupAddr And &HFF)


GA1: Es wird ein Teil der GroupAddr maskiert. Hier die 5 höchstwertigen Bits eines Wortes (16 Bit) und diese um 11 bit nach rechts geschoben. Man könnte sagen rechtsbündig ausgerichtet.

GA2: Es werden 3 Bit unterhalb GA1 maskiert und um 8 Bit nach rechts geschoben.

GA3: Es werden die restlichen 8 Bit maskiert, die müssen nicht mehr geschoben werden, da sie schon rechtsbündig sind.

Man hat also hier 16 Bit, die folgendermaßen aufgebaut sind:

|- höchstwertiges Bit --> niederwertigstes Bit
54321 098 76543210
GA1 GA2 GA3

Aber wie mache ich soetwas in Delphi?!

Bin jetzt endgültig am Ende meiner Fähigkeiten...

Gruß

Thomas


Sinspin - Di 18.11.08 22:10

Ich glaube du machst dir das ganze unnötig schwehr.
Zum einem kann man kann auch in Delphi Hexa-Zahlen schreiben.
Zum anderen gibt es hier auch Schiebeoperationen. Die sind vom Namen her sogarn ein bisschen an Assembler angelehnt.

Delphi-Quelltext
1:
2:
3:
  GA1 := (GroupAddr And $F800shr 11;
  GA2 := (GroupAddr And $0700shr 3;
  GA3 := GroupAddr And $FF;