Announcement

Collapse
No announcement yet.

Andere Fachanwendung fernsteuern und umgekehrt.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Andere Fachanwendung fernsteuern und umgekehrt.

    Hallo

    Ich habe das Forum nach einer lösung durchsucht, aber ich werde bei der ganzen Sache nicht schlau. Ist COM/DCOM.... die Lösung oder gibt einfacheres, besseres?

    Ich habe folgende Aufgabe:

    Eine Fachapplikation von einem bekannten Programmierer soll eine Maske aus unserer Applikation starten. Dabei werden verschiedene Parameter übergeben.

    Das ganze muss auch umgekehrt funktionieren. D.h. aus "unserer" Maske sollen Parameter an die andere Applikation übergeben werden und dort auch eine bestimmte Maske geöffnet werden. Da uns der Programmierer der anderen Applikation bekannt ist können auch Veränderungen an derselbigen vorgenommen werden.

    Wie ist sowas am einfachsten möglich?

    Wir verwenden D6 und ORACLE

    Danke im Voraus

    Gruss Fabian

  • #2
    Hallo,

    wenn es nur darum geht, programmgesteuert Einträge in die Controls der Benutzeroberfläche der anderen Anwendung einzufügen, wäre auch der Win32-Weg über Botschaften verfügbar.

    Stabiler und leistungsfähiger ist es jedoch, beide Anwendungen um ein Automation-Objekt (COM-Objekt) zu erweitern, da dann beide Anwendung direkt die Interface-Methoden der jeweils anderen Anwendung aufrufen können. Da auch Events unterstützt werden, können diese über die von Delphi generierten VCL-Wrapperkomponenten wie gewohnt im Objektinspektor konfiguriert werden

    Comment


    • #3
      Hallo,

      wenn es nur darum geht, programmgesteuert Einträge in die Controls der Benutzeroberfläche der anderen Anwendung einzufügen, wäre auch der Win32-Weg über Botschaften verfügbar.

      Stabiler und leistungsfähiger ist es jedoch, beide Anwendungen um ein Automation-Objekt (COM-Objekt) zu erweitern, da dann beide Anwendung direkt die Interface-Methoden der jeweils anderen Anwendung aufrufen können. Da auch Events unterstützt werden, können diese über die von Delphi generierten VCL-Wrapperkomponenten wie gewohnt im Objektinspektor konfiguriert werden. Das folgende Beispiel demonstriert dies:

      A) Anwendung 1:
      <pre>
      <font color="#003399"><i>{ ************************************************** **************
      Autor : Andreas Kosch
      Compiler : Delphi 6.0 Enterprise
      Betriebssystem : Windows 2000 SP2
      Erstellt am : 31.01.2002
      Beschreibung : Zwei Anwendungen über Automation verbinden
      ************************************************** ************** }</i></font>
      <b>unit</b> OSAutoMasterFrm;
      <br>
      <b>interface</b>
      <br>
      <b>uses</b>
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls, OleServer, OSAutoClient_TLB;
      <br>
      <b>type</b>
      TFormMaster = <b>class</b>(TForm)
      Label1: TLabel;
      StaticText1: TStaticText;
      ButtonClient: TButton;
      MemoLog: TMemo;
      StatusBar1: TStatusBar;
      OSAutoCltObj1: TOSAutoCltObj;
      <b>procedure</b> OSAutoCltObj1Info(Sender: TObject; vInfo: OleVariant);
      <b>procedure</b> OSAutoCltObj1Exit(Sender: TObject);
      <b>procedure</b> ButtonClientClick(Sender: TObject);
      <b>private</b>
      <font color="#003399"><i>{ Private-Deklarationen }</i></font>
      <b>public</b>
      <font color="#003399"><i>{ Public-Deklarationen }</i></font>
      <b>end</b>;
      <br>
      <b>var</b>
      FormMaster: TFormMaster;
      <br>
      <b>implementation</b>
      <br>
      <font color="#003399"><i>{$R *.dfm}</i></font>
      <br>
      <font color="#003399"><i>//</i></font>
      <font color="#003399"><i>// Schritt 1: ConnectionPoint-Verbindung aufbauen</i></font>
      <font color="#003399"><i>//</i></font>
      <br>
      <b>procedure</b> TFormMaster.ButtonClientClick(Sender: TObject);
      <b>var</b>
      aCltObj : IOSAutoCltObj;
      swSrvMsg: WideString;
      <b>begin</b>
      MemoLog.Lines.Add(<font color="#9933CC">'CoOSClientObj.Create...'</font>);
      aCltObj := CoOSAutoCltObj.Create;
      aCltObj.DoWork(<font color="#9933CC">'Test'</font>, swSrvMsg);
      MemoLog.Lines.Add(<font color="#9933CC">' -&gt; DoWork: '</font> + swSrvMsg);
      OSAutoCltObj1.Connect;
      MemoLog.Lines.Add(<font color="#9933CC">' -&gt; OSAutoCltObj1.Connect'</font>);
      aCltObj := <b>nil</b>;
      MemoLog.Lines.Add(<font color="#9933CC">'IOSAutoCltObj freigegeben.'</font>);
      <b>end</b>;
      <br>
      <font color="#003399"><i>//</i></font>
      <font color="#003399"><i>// Schritt 2: Event vom Client auswerten</i></font>
      <font color="#003399"><i>//</i></font>
      <br>
      <b>procedure</b> TFormMaster.OSAutoCltObj1Info(Sender: TObject;
      vInfo: OleVariant);
      <b>begin</b>
      MemoLog.Lines.Add(<font color="#9933CC">' -&gt; OSAutoCltObj-Event OnInfo eingetroffen'</font>);
      StaticText1.Caption := vInfo;
      <b>end</b>;
      <br>
      <font color="#003399"><i>//</i></font>
      <font color="#003399"><i>// Schritt 3: ConnectionPoint-Verbindung trennen</i></font>
      <font color="#003399"><i>//</i></font>
      <br>
      <b>procedure</b> TFormMaster.OSAutoCltObj1Exit(Sender: TObject);
      <b>begin</b>
      MemoLog.Lines.Add(<font color="#9933CC">' -&gt; OSAutoCltObj-Event OnExit eingetroffen'</font>);
      OSAutoCltObj1.Disconnect;
      MemoLog.Lines.Add(<font color="#9933CC">'OSAutoCltObj.Disconnect'</font>);
      <b>end</b>;
      <br>
      <b>end</b>.
      </pre>

      B) Anwendung 2:
      <pre>
      <b>unit</b> OSAutoClientFrm;
      <br>
      <font color="#003399"><i>{$WARN SYMBOL_PLATFORM OFF}</i></font>
      <br>
      <b>interface</b>
      <br>
      <b>uses</b>
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls,
      OSAutoClient_TLB; <font color="#003399"><i>// von Hand hinzugefügt</i></font>
      <br>
      <b>type</b>
      TFormClient = <b>class</b>(TForm)
      Label1: TLabel;
      EditData: TEdit;
      ButtonSetData: TButton;
      StatusBarClient: TStatusBar;
      <b>procedure</b> FormCreate(Sender: TObject);
      <b>procedure</b> FormClose(Sender: TObject; <b>var</b> Action: TCloseAction);
      <b>procedure</b> ButtonSetDataClick(Sender: TObject);
      <b>private</b>
      <font color="#003399"><i>{ Private-Deklarationen }</i></font>
      <b>public</b>
      <font color="#003399"><i>{ Public-Deklarationen }</i></font>
      FEventsBuffer: IOSAutoCltObjEvents;
      <b>end</b>;
      <br>
      <b>var</b>
      FormClient: TFormClient;
      <br>
      <b>implementation</b>
      <br>
      <b>uses</b> ComServ, OSAutoClient_Impl; <font color="#003399"><i>// von Hand hinzugefügt</i></font>
      <br>
      <font color="#003399"><i>{$R *.dfm}</i></font>
      <br>
      <b>procedure</b> TFormClient.FormCreate(Sender: TObject);
      <b>begin</b>
      <b>if</b> (Comserver.StartMode = smAutomation) <b>then</b>
      StatusBarClient.SimpleText := <font color="#9933CC">'Automation'</font>;
      <b>end</b>;
      <br>
      <b>procedure</b> TFormClient.FormClose(Sender: TObject; <b>var</b> Action: TCloseAction);
      <b>begin</b>
      <font color="#003399"><i>// Schritt 1: Master benachrichtigen -&gt; Disconnect</i></font>
      <b>if</b> FEventsBuffer &lt;&gt; <b>nil</b> <b>then</b>
      FEventsBuffer.OnExit;
      <font color="#003399"><i>// Interfacezeiger freigeben</i></font>
      FEventsBuffer := <b>nil</b>;
      <b>end</b>;
      <br>
      <b>procedure</b> TFormClient.ButtonSetDataClick(Sender: TObject);
      <b>begin</b>
      <b>if</b> FEventsBuffer &lt;&gt; <b>nil</b> <b>then</b>
      FEventsBuffer.OnInfo(EditData.Text);
      <b>end</b>;
      <br>
      <b>end</b>.
      </pre>

      C) Automation-Objekt (COM-Objekt)
      <pre>
      <font color="#003399"><i>{ ************************************************** **************
      Autor : Andreas Kosch
      Compiler : Delphi 6.0 Enterprise
      Betriebssystem : Windows 2000 SP2
      Erstellt am : 31.10.2002
      Beschreibung : Client für OSAutoMaster.exe liefert
      Daten über Events OnInfo/OnExit beim
      Master ab.
      ************************************************** ************** }</i></font>
      <br>
      <b>unit</b> OSAutoClient_Impl;
      <br>
      <font color="#003399"><i>{$WARN SYMBOL_PLATFORM OFF}</i></font>
      <br>
      <b>interface</b>
      <br>
      <b>uses</b>
      ComObj, ActiveX, AxCtrls, Classes, OSAutoClient_TLB, StdVcl;
      <br>
      <b>type</b>
      TOSAutoCltObj = <b>class</b>(TAutoObject, IConnectionPointContainer, IOSAutoCltObj)
      <b>private</b>
      <font color="#003399"><i>{ Private-Deklarationen }</i></font>
      FConnectionPoints: TConnectionPoints;
      FConnectionPoint: TConnectionPoint;
      <br>
      <font color="#003399"><i>// auskommentiert, siehe EventSinkChanged</i></font>
      <font color="#003399"><i>//FEvents: IOSAutoCltObjEvents;</i></font>
      <br>
      <b>public</b>
      <b>procedure</b> Initialize; <b>override</b>;
      <b>protected</b>
      <font color="#003399"><i>{ Protected-Deklarationen }</i></font>
      <b>property</b> ConnectionPoints: TConnectionPoints <b>read</b> FConnectionPoints
      implements IConnectionPointContainer;
      <b>procedure</b> EventSinkChanged(<b>const</b> EventSink: IUnknown); <b>override</b>;
      <b>function</b> Get_Version: Integer; <b>safecall</b>;
      <b>procedure</b> DoWork(sInfo: OleVariant; out sSrvMsg: WideString); <b>safecall</b>;
      <b>end</b>;
      <br>
      <b>implementation</b>
      <br>
      <b>uses</b> ComServ,
      OSAutoClientFrm; <font color="#003399"><i>// von Hand hinzugefügt</i></font>
      <br>
      <b>procedure</b> TOSAutoCltObj.EventSinkChanged(<b>const</b> EventSink: IUnknown);
      <b>begin</b>
      <br>
      <font color="#003399"><i>// von Hand geändert: privates Objektfeld wird nicht verwendet</i></font>
      <font color="#003399"><i>//FEvents := EventSink as IOSAutoCltObjEvents;</i></font>
      <font color="#003399"><i>// statt dessen Public-Objektfeld des Formulars</i></font>
      <br>
      FormClient.FEventsBuffer := EventSink <b>as</b> IOSAutoCltObjEvents;
      <b>end</b>;
      <br>
      <b>procedure</b> TOSAutoCltObj.Initialize;
      <b>begin</b>
      <b>inherited</b> Initialize;
      FConnectionPoints := TConnectionPoints.Create(Self);
      <b>if</b> AutoFactory.EventTypeInfo &lt;&gt; <b>nil</b> <b>then</b>
      FConnectionPoint := FConnectionPoints.CreateConnectionPoint(
      AutoFactory.EventIID, ckSingle, EventConnect)
      <b>else</b> FConnectionPoint := <b>nil</b>;
      <b>end</b>;
      <br>
      <b>function</b> TOSAutoCltObj.Get_Version: Integer;
      <b>begin</b>
      Result := 1; <font color="#003399"><i>// von Hand hinzugefügt</i></font>
      <b>end</b>;
      <br>
      <b>procedure</b> TOSAutoCltObj.DoWork(sInfo: OleVariant; out sSrvMsg: WideString);
      <b>begin</b>
      sSrvMsg := sInfo + <font color="#9933CC">' (ok)'</font>; <font color="#003399"><i>// von Hand hinzugefügt</i></font>
      <b>end</b>;
      <br>
      <b>initialization</b>
      TAutoObjectFactory.Create(ComServer, TOSAutoCltObj, Class_OSAutoCltObj,
      ciMultiInstance, tmApartment);
      <b>end</b>.
      </pre>

      Sie folgende Abbildung verdeutlicht das Prinzip

      Comment


      • #4
        Hallo

        Herr Kosch, besten Dank für die schnelle Antwort. Ich werde mich da mal hineindenken.

        Gruss Fabia

        Comment

        Working...
        X