Com-Schnittstelle CoClass?

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Benutzeravatar
mini990
1000 working lines a day
1000 working lines a day
Beiträge: 592
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
Danksagung erhalten: 1 Mal

Com-Schnittstelle CoClass?

Beitrag von mini990 »

Hallo,
bei einem ActiveX-Objekt (COM-Schnittstelle) muss ein zweites Objekt als "CoClass" angelegt werden.
Geht das mit Xbase?
Danke im Voraus.

Gruß Stefan
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Com-Schnittstelle CoClass?

Beitrag von AUGE_OHR »

hi,

meinst du damit das ein activeX Object einer Property eines anderen activeX Object zugeordnet werden soll ?

Code: Alles auswählen

   oAAA := CreateObject( "AAA...." )
   ...
   oBBB := CreateObject( "BBB...." )
   ...
   oAAA:MyProperty := oBBB       // DAS geht NICHT mit Xbase++
gruss by OHR
Jimmy
Benutzeravatar
mini990
1000 working lines a day
1000 working lines a day
Beiträge: 592
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
Danksagung erhalten: 1 Mal

Re: Com-Schnittstelle CoClass?

Beitrag von mini990 »

Hmmmm....
Sowas soll ich umsetzen:

Code: Alles auswählen

$appobj = new-object -comobject praxisCENTER3.ApplicationObject
$appobj.SetMode('MultiplePatient', '1')

# get Physician
$physician = $appobj.Physician

$physician.LANR="123456789"
$physician.BSNR="821234567"
$physician.Title="Dr"
$physician.FirstName="Hans"
$physician.LastName="Maier"
$physician.PostalCode="81369"
$physician.Activate()

# get Patients 
$patients = $appobj.Patients
$patients.Clear()
$patients.Count
 
# add new patient
$pat1 = new-object -comobject praxiscenter3.patient
$patients.add($pat1)
$pat1.ID = "45678"
$pat1.IKId = "108377503"
$pat1.InsuredMemberId = "123456789"
$pat1.FirstName = "Max"
$pat1.LastName = "Mayer2"
$pat1.City = "Berlin"
$pat1.PostalCode = "80337"
$pat1.Street = "Parkstrasse"
$pat1.No = "6"
$pat1.Pregnancy = 0
$pat1.Height = 196
$pat1.Birthday = "07.09.1981"
$pat1.Sex = 0

# get prescription collection
$prescription = $pat1.Prescription
$prescription.Clear()

# add new prescription item
# erfolgt in ipc
#$presMed = new-object -comobject praxiscenter3.PrescriptionMedicament
#$presMed.NecAutIdem=1
#$presMed.Count=4
#$presMed.PIC=780908
#$presMed.PrintName="xyz_PrintName2"
#$presMed.NewPrescription=1
#$presMed.Dosage.Morning = 3
#$presMed.SelectedPrescriptionType = 1
#$prescription.Add($presMed)
#$prescription.Activate()

# aktivate patient
$pat1.Activate()
# aktivate App/Session
$appobj.Activate()

$appobj.Show()


# Rezeptieren
# ALT + F9

$med = new-object -comobject praxisCENTER3.Medicament
foreach ($presMed in $prescription)
{
	# $presMed.PIC

	$appobj.GetMedicament($presMed.PIC,[ref]$med)
	# Ausgabe der Eigenschaften in der Console
	$med.PIC
	$med.narcoticaddition
	$med.Homeopathic

}
#$prescription.Count
#$presMed = $prescription.Item(0)
#$presMed.PIC


$appobj.Hide()
$appobj.Close()
... und da gibt's keine Chance mit Xbase?

Gruß Stefan
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Com-Schnittstelle CoClass?

Beitrag von AUGE_OHR »

mini990 hat geschrieben:

Code: Alles auswählen

$patients.add($pat1)    // -> hier
...
#$prescription.Add($presMed) // und hier
... und da gibt's keine Chance mit Xbase?
ausprobieren ...
ein (mögliches) Problem sehe ich beim ".ADD" da man hier ein Object (mit Eigenschaften) einem anderen Object zufügen möchte.
gruss by OHR
Jimmy
Benutzeravatar
mini990
1000 working lines a day
1000 working lines a day
Beiträge: 592
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
Danksagung erhalten: 1 Mal

Re: Com-Schnittstelle CoClass?

Beitrag von mini990 »

mit dem adden gibt es kein Problem.
Das funktioniert soweit. Ich kann auch die Werte abfragen.
Wo ich nicht weiterkomme ist hier:

Code: Alles auswählen

$med = new-object -comobject praxisCENTER3.Medicament
foreach ($presMed in $prescription)
{
   # $presMed.PIC

   $appobj.GetMedicament($presMed.PIC,[ref]$med)
Bei diesem getmedicament ..... bekomme ich immer leere Werte zurück.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Com-Schnittstelle CoClass?

Beitrag von AUGE_OHR »

hi,

für die FOREACH Kombination kannst du das versuchen

Code: Alles auswählen

   bCollBlock     := {|oService,n| AADD(aItem,{ n,;
     oService:getProperty("PIC"),;
     oService:getProperty("narcoticaddition"),;
     oService:getProperty("Homeopathic") })}

   ComEvalCollection(prescription, bCollBlock )

   IF LEN(aItem) > 0
       // auswerten
   ENDIF
gruss by OHR
Jimmy
Benutzeravatar
mini990
1000 working lines a day
1000 working lines a day
Beiträge: 592
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
Danksagung erhalten: 1 Mal

Re: Com-Schnittstelle CoClass?

Beitrag von mini990 »

Hier mal der Quellcode....

Code: Alles auswählen

// AutomationObjekt
oIfap := CreateObject("PraxisCENTER3.ApplicationObject")
oIfap := oIfap:dynamicCast ( ActiveXObject() )
...
...
oIfAp:OnPrescription := { |x| FOnPrescript(x) }


STATIC FUNCTION FOnPrescript (x)
aMedi := AClone ({})
  
// IfAp-PC verstecken
oIfap:Hide()
 
oMed := CreateObject("PraxisCENTER3.Medicament")

// Presciption --> aMedi
IF oPat:Prescription:Count > 0

   for i:=0 to oPat:Prescription:Count-1
			oMedic := oPat:Prescription:Item(i)
      // Daten des Medikamentes in Array ablegen
      cPZN := padl(alltrim(ntoc(oMedic:PIC)), 7, "0")

			oifap:GetMedicament(cPZN, oMed)

      nAVP := val(strtran(ntoc(oMed:Pharmacyprice), ",", "."))
      aadd(aMedi,{cZ1, cZ2, cPZN, nAVP, oMed:DosageForm, allTrim(oMed:Quantity)+" "+allTrim(oMed:QuantityOfUnit), cSort, cDosi, nAnz})
      
			? cPZN
			? nAVP      
   next i
   use
ENDIF
oPat:Prescription:Clear()
lPrescription := .T.
RETURN (.T.)
Ich kann alle Werte des Objekts oMedic auswerten, hier stimmen die Inhalte.
Auch die for-next Schleife wird korrekt abgearbeitet.

Probleme bereitet diese Zeile:
oifap:GetMedicament(cPZN, oMed)
Hier erscheint die Fehlermeldung:
  • Xbase++ Version : Xbase++ (R) Version 1.90.355
    Betriebssystem : Windows Vista 06.01 Build 07601 Service Pack 1
    ------------------------------------------------------------------------------
    oError:args :
    -> VALTYPE: C VALUE: GetMedicament
    -> VALTYPE: C VALUE: 1020081
    -> VALTYPE: O CLASS: AutomationObject
    oError:canDefault : J
    oError:canRetry : N
    oError:canSubstitute: J
    oError:cargo : NIL
    oError:description : Falscher Variablentyp.
    Parameter hat falschen Wert
    oError:filename : NIL
    oError:genCode : NIL
    oError:operation : GetMedicament
    oError:osCode : -2147352568
    oError:severity : 2
    oError:subCode : 6500
    oError:subSystem : Automation
    oError:thread : 1
    oError:tries : NIL
    ------------------------------------------------------------------------------
    CALLSTACK:
    ------------------------------------------------------------------------------
Bin langsam am verzweifeln....

Gruß Stefan
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Com-Schnittstelle CoClass?

Beitrag von Wolfgang Ciriack »

Hast du mal versucht, das Object per Reference zu übergeben ?

Code: Alles auswählen

oifap:GetMedicament(cPZN, @oMed)
Viele Grüße
Wolfgang
Benutzeravatar
mini990
1000 working lines a day
1000 working lines a day
Beiträge: 592
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
Danksagung erhalten: 1 Mal

Re: Com-Schnittstelle CoClass?

Beitrag von mini990 »

hatte ich schon probiert, gleiches Ergebnis.
Trotzdem Danke...

Gruß Stefan
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Com-Schnittstelle CoClass?

Beitrag von AUGE_OHR »

mini990 hat geschrieben:Hier mal der Quellcode....

Code: Alles auswählen

oIfap := oIfap:dynamicCast ( ActiveXObject() ) 
...
oIfAp:OnPrescription := { |x| FOnPrescript(x) }


   for i:=0 to oPat:Prescription:Count-1
			oMedic := oPat:Prescription:Item(i)
      // Daten des Medikamentes in Array ablegen
      cPZN := padl(alltrim(ntoc(oMedic:PIC)), 7, "0")

			oifap:GetMedicament(cPZN, oMed)
hi,
ein

Code: Alles auswählen

oIfap:dynamicCast ( ActiveXObject() )
benötigtst du nur wenn das activeX Events sendet die du mit

Code: Alles auswählen

o:subscribeEvent("Name_of_Event")
abfangen willst.
mit scheint als wenn "oIfAp:OnPrescription" ein solcher Event ist, oder ?

zu der Method

Code: Alles auswählen

oifap:GetMedicament(cPZN, oMed)
ich bin mir hier nicht sicher ob "oMed" ein Object oder eine Structur sein müsste.
grob gesagt suchst du in einer "Menge" ($prescription) wobei ein Object / Structur ($med) die Ergebnisse enthalten soll.

dabei verwendest du, in der Schleife, immer wieder das selbe Object was du "füllen" möchtest... hm
dies ähnelt dem Problem in WMI wo dafür ComEvalCollection() verwendet wird welches das Object als Parameter, im Codeblock

Code: Alles auswählen

 {|oService, n| ...}
zurück gibt.
oError:description : Falscher Variablentyp.
ich tippe eher auf den ersten Parameter denn

Code: Alles auswählen

#$presMed.PIC=780908
ist ja wohl numerisch !
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Com-Schnittstelle CoClass?

Beitrag von AUGE_OHR »

mini990 hat geschrieben:

Code: Alles auswählen

$med = new-object -comobject praxisCENTER3.Medicament
foreach ($presMed in $prescription)
{
   # $presMed.PIC

   $appobj.GetMedicament($presMed.PIC,[ref]$med)
ich sehe gerade das [ref] ...
mit Referenz auf ein Object könnte ein numerischer Pointer gemeint sein ( wo ich die Structur finde )

Code: Alles auswählen

oifap:GetMedicament(nPZN, oMed:interface)
gruss by OHR
Jimmy
Benutzeravatar
mini990
1000 working lines a day
1000 working lines a day
Beiträge: 592
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.
Danksagung erhalten: 1 Mal

Re: Com-Schnittstelle CoClass?

Beitrag von mini990 »

Habe diese Beschreibung für den Aufruf gefunden:

Function GetMedicament (Value: WideString, var Medicament: IMedicament): Integer;

Parameter: Value PZN des Medikaments oder StarCode [out] Medicament Ein Medicament-Objekt,
welches nach dem Funktionsaufruf das Ergebnis beinhaltet.
Das Objekt muss vor dem Funktionsaufruf als CoClass angelegt werden.

Bin ehrlich: ich verstehe es nicht...

Gruß Stefan
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Com-Schnittstelle CoClass?

Beitrag von AUGE_OHR »

mini990 hat geschrieben:Function GetMedicament (Value: WideString, var Medicament: IMedicament): Integer;
hm ...
ein WideString hört sich nach String an ABER vorher im Source wurde ein numerischer Wert zugewiesen ?!
mit o:Interface bekommst du einen numerischen Wert.
gruss by OHR
Jimmy
Antworten