Announcement

Collapse
No announcement yet.

MSAgent

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

  • MSAgent

    Moin Herr Kosch,
    in Ihrem Buch verweisen Sie auf<br>
    http://www.microsoft.com/workshop/prog/agent<br>
    Sie schreiben, dass dort der MSAgent zum downloaden zu finden ist. Leider ist Microsoft diese Adresse nicht mehr bekannt.<br>
    Wissen Sie zufällig, wo ich den Agent bekommen kann ?<br>
    :-) Jens Schumann

  • #2
    http://msdn.microsoft.com/workshop/c-frame.htm#/workshop/imedia/agent/default.as

    Comment


    • #3
      Hallo Jens,

      der <b>MS Agent</b> ist nun unter der URL http://msdn.microsoft.com/workshop/imedia/agent/agentdl.asp zu finden

      Comment


      • #4
        <b>Hallo Herr Kosch,<br>
        vielen, vielen Dank für Ihre Hilfe.</b><br>
        Grundsätzlich läuft alles prima. Ich mußte nur mit den Agentversionen aufpassen. Ihre Typbibliothek ist für die Version 1.5. Von MS erhält man unter der von Ihnen angegebenen Adresse die Verion 2.0. In der Version 2.0 gibt es das OnClick event nicht mehr. Stimmt nicht ganz - es heißt jetzt On_AgentsEvents_Click.<br>
        Ich habe noch Probleme mit den Aktionen des Servers. Es werden nicht alle Aktionen aus geführt. Bei ca. der Hälfte der Aktionen erhalte ich die Fehlermeldung: <br>
        Die angegebene Animation wird nicht unterstüzt.<br>
        Stellen Sie sicher, daß der Animationsname richtig ist.<br>
        Es handlet sich hier um das Beispiel von der E-Konferenz 99 aus dem Verzeichnis com_1\source\msagent <br>
        Wo kann ich eine Liste mit den gültigen Animationsnamen finden ?<br>
        Ich weiß - bestimmt im MSDN. Das kann ich mir leider nicht leisten.<br>
        :-) Jens Schuman

        Comment


        • #5
          Hallo Jens,

          ich habe für beide <b>MS Agent</b>-Versionen Beispielprojekte mitgeliefert. Das Beispielprojekt für die Version 2.0 ist im Unterverzeichnis <b>MSAgent2</b> zu finden und greift auf die AgentObjects_TLB.pas für die Version 2.0 zu. Dort liegt auch die Datei LIESMICH.TXT mit den Installationshinweisen.

          Im dem neuen Beispielprojekt wird auch demonstriert, wie sich eine Anwendung zur Laufzeit alle vom ausgewählten Agenten unterstützten Animationsnamen holen kann:
          <pre>
          procedure TFormMain.GetAnimationList(aSL: TStrings);
          var
          pEnum : IEnumVARIANT;
          vAnimName : VARIANT ;
          dwRetrieved : DWORD ;
          hRes : HResult;
          begin
          pEnum := aDualMerlin.AnimationNames.Enum as IEnumVARIANT;
          while (TRUE) do
          begin
          hRes := pEnum.Next(1, vAnimName, @dwRetrieved);
          if hRes <> S_OK then
          Break;
          aSL.add(vAnimName);
          end;
          end;
          </pre>

          Kommt bereits <b>Delphi 5</b> zum Einsatz, muß die Deklaration von <b>IEnumVARIANT</b> durch die Kompatiblitätsdeklaration <b>IEnumVARIANT_D4</b> ersetzt werden

          Comment


          • #6
            <b>Moin Herr Kosch</b><br>
            jetzt läuft alles bestens.<br>
            Ich nutze immer noch D4. Ihr Beispielprogramm läuft ohne Änderungen.<br>
            :-) Jens Schuman

            Comment


            • #7
              Hallo Herr Kosch,

              ich habe mir Ihr Buch (COM/DCOM) gekauft und bin gerade an dem (sehr interessanten) Beispiel mit MS-Agent. Da ich kein Delphi-Profi bin, möchte ich Ihnen gerne an dieser Stelle 2 Fragen stellen, auch wenn diese für einen eingefleischten Delphi-Entwickler etwas lächerlich erscheinen sollten:

              1. Wie müßte eine Variable deklariert sein, die eine zur Laufzeit geladene Character-Datei (.acs) aufnimmt (also, wenn die Character-Datei nicht als Ressource oder so hinterlegt ist, sondern z.B. zur Laufzeit geändert wird)? Ich habe es mit einer String-Variablen probiert, hat aber nicht funktioniert.

              2. Gibt es innerhalb MS-Agent eine Möglichkeit, diese Ballon-Fenster (wie in MS-Office) aufzurufen?

              Vielen Dank im Vorau

              Comment


              • #8
                Hallo,

                das Programm kann zur Laufzeit gleich mehrere Figuren laden, wobei für jede Figur eine eigene Interface-Variable vom Typ <b>IAgentCtlCharacterEx</b> verwendet wird. Dies könnte zum Beispiel so aussehen:
                <pre>
                type
                TForm1 = class(TForm)
                ...
                private
                aDualMerlin : IAgentCtlCharacterEx;
                aDualPeedy : IAgentCtlCharacterEx;
                ...
                end;

                resourcestring
                cAgentCharBasePath = 'C:\WINDOWS\Msagent\CHARS\';
                cMerlinPath = 'merlin.acs';
                cMerlinName = 'MERLIN';
                cPeedyPath = 'peedy.acs';
                cPeedyName = 'PEEDY';

                procedure TForm1.FormCreate(Sender: TObject);
                begin
                MSAgent1.Characters.Load(cMerlinName, cAgentCharBasePath + cMerlinPath);
                MSAgent1.Characters.Load(cPeedyName, cAgentCharBasePath + cPeedyPath);
                aDualMerlin := MSAgent1.Characters.Character(cMerlinName);
                aDualPeedy := MSAgent1.Characters.Character(cPeedyName);
                end;
                </pre>

                Der Agent unterstützt meines Wissens nach nur einfache Balloon-Fenster:

                <pre>
                procedure TFormMain.ButtonSpeakClick(Sender: TObject);
                begin
                aDualMerlin.Balloon.Visible := True;
                aDualMerlin.Speak(EditSpeak.Text,'');
                ...
                aDualMerlin.Balloon.Visible := False;
                end;
                </pre>

                Allerdings stellen die <i>MS Office</i>-Anwendungen vollständig konfigurierbare (d.h. auch mit Checkboxen etc. bestückbare) Balloons zur Verfügung. Ein Beispiel dafür habe ich auf der diesjährigen Entwicklerkonferenz (Session COM I) vorgestellt. Bei Bedarf kann ich die wesentlichen Teile hier im FORUM vorstellen (die Balloon-Fenster kommen dann aber vom unsichtbaren MS Word, aber nicht vom Agent)

                Comment


                • #9
                  Hallo Herr Kosch,

                  das wäre toll, wenn Sie dieses Beispiel von der Entwicklerkonferenz vorstellen könnten.
                  Bedeutet das dann, wenn man diese Möglichkeit nutzt, das auf dem jeweiligen Rechner Word installiert sein muß

                  Comment


                  • #10
                    Hallo Uwe,

                    ja - der <b>Automation-Server</b>, der die Funktionen bereitstellt, muß auf dem Rechner installiert sein. Es betrifft aber alle Anwendungen aus dem MS Office-Paket.
                    <pre>

                    unit WordBalloonFrm;

                    interface

                    uses
                    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
                    Dialogs, ComCtrls, StdCtrls, ComObj, Word_TLB, Office_TLB;

                    type
                    TForm1 = class(TForm)
                    StatusBar1: TStatusBar;
                    Button1: TButton;
                    Button2: TButton;
                    CheckBoxWord: TCheckBox;
                    procedure FormCreate(Sender: TObject);
                    procedure FormDestroy(Sender: TObject);
                    procedure Button1Click(Sender: TObject);
                    procedure Button2Click(Sender: TObject);
                    procedure CheckBoxWordClick(Sender: TObject);
                    private
                    { Private-Deklarationen }
                    FWordApp : _Application;
                    FWordWnd : HWnd;
                    public
                    { Public-Deklarationen }
                    end;

                    var
                    Form1: TForm1;

                    implementation

                    {$R *.DFM}

                    { Um die Sprechblasen des Office-Assistenten auch in einem eigenen
                    Delphi-Programm nutzen zu können, muß das Word-Fenster beim Aufruf
                    des Balloon-Fensters aktiv sein. Diese Forderung wirde über die
                    Win32-API-Funktion SetForegroundWindow erfüllt, dafür muß das
                    Fensterhandle von Word gesichert werden. }

                    procedure TForm1.FormCreate(Sender: TObject);
                    begin
                    FWordApp := CoApplication_.Create;
                    FWordWnd := FindWindow('OpusApp', nil);
                    if FWordWnd = 0 then
                    raise Exception.Create('Word-Fensterhandle ist undefiniert!');
                    end;

                    procedure TForm1.FormDestroy(Sender: TObject);
                    begin
                    OleVariant(FWordApp).Quit(False);
                    FWordApp := nil;
                    end;

                    procedure TForm1.CheckBoxWordClick(Sender: TObject);
                    begin
                    if CheckBoxWord.Checked then
                    FWordApp.Visible := True
                    else
                    FWordApp.Visible := False;
                    end;

                    // 1. Versuch: Balloon nur mit Text

                    procedure TForm1.Button1Click(Sender: TObject);
                    var
                    aBalloon : Balloon;
                    begin
                    aBalloon := IUnknown(FWordApp.Assistant.NewBalloon) as Balloon;
                    with aBalloon do
                    begin
                    BalloonType := msoBalloonTypeBullets;
                    Heading := 'Office-Assistent mit Delphi';
                    Text := 'Über OLE Automation kann nicht nur MS Word 97 ' +
                    'fernbedient werden, sondern auch die Balloon-' +
                    'Sprechblasen vom Office-Assistenten';
                    Mode := msoModeModal;
                    Icon := msoIconAlert;
                    end;
                    // Word-Fenster muß zum Zeitpunkt des Aufrufs aktiv sein !
                    SetForegroundWindow(FWordWnd);
                    aBalloon.Show;
                    end;

                    // 2. Versuch: Balloon mit Auswahlmöglichkeit

                    procedure TForm1.Button2Click(Sender: TObject);
                    var
                    aBalloon : Balloon;
                    aCheckboxes : BalloonCheckboxes;
                    aCheckbox1 : BalloonCheckbox;
                    aCheckbox2 : BalloonCheckbox;
                    aCheckbox3 : BalloonCheckbox;
                    aCheckbox4 : BalloonCheckbox;
                    begin
                    aBalloon := IUnknown(FWordApp.Assistant.NewBalloon) as Balloon;
                    with aBalloon do
                    begin
                    BalloonType := msoBalloonTypeBullets;
                    Heading := 'Office-Assistent mit Delphi';
                    Text := 'Über OLE Automation kann nicht nur MS Word 97 ' +
                    'fernbedient werden, sondern auch die Balloon-' +
                    'Sprechblasen vom Office-Assistenten. ' + #13#13 +
                    'Welche Delphi-Versionen kennen Sie?';
                    Button := msoButtonSetOK;
                    Mode := msoModeModal;
                    end;
                    //
                    aCheckboxes := IUnknown(aBalloon.Checkboxes) as BalloonCheckboxes;
                    aCheckbox1 := IUnknown(aCheckboxes.Item[1]) as BalloonCheckbox;
                    aCheckbox1.Text := 'Delphi 1 (16-Bit)';
                    aCheckbox2 := IUnknown(aCheckboxes.Item[2]) as BalloonCheckbox;
                    aCheckbox2.Text := 'Delphi 2';
                    aCheckbox3 := IUnknown(aCheckboxes.Item[3]) as BalloonCheckbox;
                    aCheckbox3.Text := 'Delphi 3';
                    aCheckbox4 := IUnknown(aCheckboxes.Item[4]) as BalloonCheckbox;
                    aCheckbox4.Text := 'Delphi 4';
                    aBalloon.Icon := msoIconAlert;
                    SetForegroundWindow(FWordWnd);
                    aBalloon.Show;
                    StatusBar1.SimpleText := 'Es wurde markiert: ';
                    if aCheckBox1.Checked then
                    StatusBar1.SimpleText := StatusBar1.SimpleText + 'D1; ';
                    if aCheckBox2.Checked then
                    &#10

                    Comment


                    • #11
                      Hallo,

                      kann mir jemand zeigen, wie man die Schriftart und die Farbe des Balloon-Fensters bei Verwendung des MS-Agent in Delphi 4 direkt beim Programmstart festlegen kann (möglichst mit Beispiel)?

                      Vielen Dank

                      Uw

                      Comment


                      • #12
                        Ich versuche mich schon länger mit dem Agent. Jetzt möchte passend zur Sprechblase eine wav-Datei abspielen. Das klappt auch prima. Nur leider habe ein Problem mit Synchronisation. Ich versuche das Problem über das OnBalloonShow Event des Agent-Servers zu lösen. Meistens klappt das auch ganz gut. Nur wenn zwei Sprechblasen unmittelbar nacheinander erscheinen, wird scheinbar ds zweite OnBalloonShow-Event vom Agent-Server verschluckt. Das Verschlucken passiert nicht, wenn ich den Agent, bevor die Sprechblase erscheinen soll, eine Idlex_x Animation ausführen lasse. Ist das ein Bug, oder liegt das Problem zwischen meinen Ohren ?

                        :-) Jens Schuman

                        Comment


                        • #13
                          Moin Uwe,<br>
                          Die Toolbox hat in Ausgabe Jan/Feb 2000 einen ausgezeichneten MSAgent Artikel losgelassen. Die Antworten auf Deine Frage findest Du und noch vieles mehr. <br>
                          MSAgent.Characters.Item['Merlin'].Ballon.Set_FontName('Arial');<br>
                          MSAgent.Characters.Item['Merlin'].Ballon.Set_FontSize(20);<br>
                          :-) Jens Schuman

                          Comment


                          • #14
                            Moin,<br>hat der MSAgent eigentlich auch die Möglichkeit in der Sprechblase Checkboxen oder Buttons anzuzeigen ?<br> Jen

                            Comment


                            • #15
                              Hallo,

                              ja - das folgende Beispiel zeigt 5 Checkboxen im Dialog an und liefert die Benutzerauswahl an das eigene Programm zurück:
                              <pre>
                              procedure TForm1.Button2Click(Sender: TObject);
                              var
                              aBalloon : Balloon;
                              aCheckboxes : BalloonCheckboxes;
                              aCheckbox1 : BalloonCheckbox;
                              aCheckbox2 : BalloonCheckbox;
                              aCheckbox3 : BalloonCheckbox;
                              aCheckbox4 : BalloonCheckbox;
                              begin
                              aBalloon := IUnknown(FWordApp.Assistant.NewBalloon) as Balloon;
                              with aBalloon do
                              begin
                              BalloonType := msoBalloonTypeBullets;
                              Heading := 'Office-Assistent mit Delphi';
                              Text := 'Über OLE Automation kann nicht nur MS Word 97 ' +
                              'fernbedient werden, sondern auch die Balloon-' +
                              'Sprechblasen vom Office-Assistenten. ' + #13#13 +
                              'Welche Delphi-Versionen kennen Sie?';
                              Button := msoButtonSetOK;
                              Mode := msoModeModal;
                              end;
                              //
                              aCheckboxes := IUnknown(aBalloon.Checkboxes) as BalloonCheckboxes;
                              aCheckbox1 := IUnknown(aCheckboxes.Item[1]) as BalloonCheckbox;
                              aCheckbox1.Text := 'Delphi 1 (16-Bit)';
                              aCheckbox2 := IUnknown(aCheckboxes.Item[2]) as BalloonCheckbox;
                              aCheckbox2.Text := 'Delphi 2';
                              aCheckbox3 := IUnknown(aCheckboxes.Item[3]) as BalloonCheckbox;
                              aCheckbox3.Text := 'Delphi 3';
                              aCheckbox4 := IUnknown(aCheckboxes.Item[4]) as BalloonCheckbox;
                              aCheckbox4.Text := 'Delphi 4';
                              //
                              aBalloon.Icon := msoIconAlert;
                              SetForegroundWindow(FWordWnd);
                              aBalloon.Show;
                              StatusBar1.SimpleText := 'Es wurde markiert: ';
                              if aCheckBox1.Checked then
                              StatusBar1.SimpleText := StatusBar1.SimpleText + 'D1; ';
                              if aCheckBox2.Checked then
                              StatusBar1.SimpleText := StatusBar1.SimpleText + 'D2; ';
                              if aCheckBox3.Checked then
                              StatusBar1.SimpleText := StatusBar1.SimpleText + 'D3; ';
                              if aCheckBox4.Checked then
                              StatusBar1.SimpleText := StatusBar1.SimpleText + 'D4; ';
                              end;
                              </pre&gt

                              Comment

                              Working...
                              X