Announcement

Collapse
No announcement yet.

Implementation Windows-Taschenrechner

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

  • Implementation Windows-Taschenrechner

    Hallo Leute,

    ich möchte in meinem Programm den Windows-Taschenrechner verwenden. Dies habe ich über den Aufruf (ShellExecute(MyHandle, 'open', pchar('calc.exe'), NIL, NIL, SW_ShowNormal) durchgeführt --> funktioniert. Jetzt möchte ich aber dem Taschenrechner einen Wert mitgeben und das Rechenergebnis in meiner Anwendung weiter verwenden.

    Kann mir da jemand einen Tip geben wie ich dies verwirklichen kann.

    Danke
    Gruß Jürgen

  • #2
    Falls Du nicht auf dem Windows-Rechner bestehst, gibt es von eigentlich jedem Komponenten-Hersteller für Delphi Edits, die einen eingebauten Rechner haben.<p>
    http://www.tmssoftware.com/moneyedit.htm<p>
    Schöne Grüße, Mario Noac
    Schöne Grüße, Mario

    Comment


    • #3
      Hallo Mario,

      zunächst danke für deinen Vorschlag. Habe mir aber einige Taschenrechner angeschaut. Problem ist, das fast alle in direkt Verbindung mit einem Eingabefeld stehen. Dies kann ich nicht gebrauchen. Der Rechner soll losgelöst sein.

      Gruß Jürge

      Comment


      • #4
        Hallo,

        auf der Delphi-CDROM liegt im Unterverzeichnis Extras die Unit <b>SNDKEY32.PAS</b>. Über diesen Weg kann man den Taschenrechner-Input über Windows-Botschaften zum Taschenrechner schicken. Ich hatte das einmal für eine ältere Entwickler-Konferenz mit dem WSH (VBScript) gemacht.

        Mit dem Delphi-Tool <b>WinSight32</b> kann man dann den Fensteraufbau des Taschenrechners ermitteln, um dann über den vorgefunenen Namen das Ergebnis der Berechnung durch das eigene Programm auszulesen.

        Die Suche nach der Zeichenkette "WinSight32" liefert im FORUM zum Beispiel den Zugriff auf das Login-Fenster von AOL zurück - dieses Prinzip kann auch beim Taschenrechner genutzt werden

        Comment


        • #5
          Hallo Andreas,

          vielen Dank für Deine Hilfe, aber so ganz scheint es bei mir nicht zu funktionieren.
          Habe mir Dein AOL-Beispiel angesehen und nach Start des Rechners das Handle ermittelt. Der Versuch den Titel zu ändern funktioniert aber schon nicht.
          Bei WinSight habe ich bzgl. des Rechners auch schlechte Karten, weil dieser nicht identifiziert werden kann, sondern nur über einen nichts sagenden Code definiert ist. Somit fällt mir das vorgeben eines Wertes sehr schwer, da ich das Feld nicht greifen kann.

          Habe ich da jetzt etwas verkehrt gemacht?

          Code-Beispiel:
          ShellExecute(Self.Handle, ......
          hCalcWnd := GetWindow(Self.Handle, GW_Child);
          if hCalcWnd <> 0 then
          SendMessage(hCalcWnd, WM_SetText, 0, LongInt('PChar('TEST')));

          (BreakPoint auf "SendMessage..." hält an, Titel wird aber nicht geändert

          Comment


          • #6
            Hallo,

            &gt;..Titel wird aber nicht geändert..

            das folgende Beispiel ändert die Fensterbeschriftung vom Taschenrechner:
            <pre>
            <b>procedure</b> TForm1.Button1Click(Sender: TObject);
            <b>var</b>
            hCalcWnd : HWND;
            <b>begin</b>
            hCalcWnd := FindWindow(<b>nil</b>, <font color="#9933CC">'Rechner'</font>);
            <b>if</b> hCalcWnd &lt;&gt; 0 <b>then</b>
            SendMessage(hCalcWnd, WM_SETTEXT, 0, LongInt(PChar(<font color="#9933CC">'Test'</font>)));
            <b>end</b>;
            </pre>
            Siehe Abbildung

            Comment


            • #7
              &gt;Bei WinSight habe ich bzgl. des Rechners auch schlechte Karten, <br>
              &gt;weil dieser nicht identifiziert werden kann....

              Der Fensteraufbau des Taschenrechners wird von WinSight32 korrekt angezeigt

              Comment


              • #8
                Hallo Andreas,

                Problem 1 - Fenster finden:
                Der ShellExecute war zu langsam für den FindWindow. Durch einbauen einer kurzen Pause, kann das Fenster dann auch gefunden werden.
                Fensterbez. ändern funktioniert:

                Problem 2 - WinSight:
                Funktioniert bei mir am Rechner nicht (Windows 2000 - Delphi 5). Hat bei einem Kollegen aber funktioniert. Wie in der JPG.Datei zeigt er den Rechner und das "EDIT"-Feld an.
                Aber dessen Handle bekomme ich immer noch nicht. Folgende Varianten habe ich getestet:
                FindWindowEx(hWnd, 0, 'Edit', nil);
                FindWindowEx(hWnd, 0, PChar('Edit'), nil);
                FindWindowEx(hWnd, 0, nil, '0,');

                Wo liegt jetzt noch mein Fehler?

                Gruß Jürge

                Comment


                • #9
                  Hallo,

                  das folgende Beispiel demonstriert, wie man den Taschenrechner von Windows für eigene Berechnungen nutzt und das Ergebnis im eigenen Delphi-Programm anzeigt. Die beiden Funktionen <b>AppActivate</b> und <b>SendKeys</b> stammen aus der Unit <i>SNDKEY32.pas</i>, die Borland im <i>Extras</i>-Unterverzeichnis der Delphi-CDROM mit ausliefert. Die verzögernden <b>Sleep</b>-Aufrufe sollen nur den Ablauf im Taschenrechner visuell nachverfolgbar machen. Der zu suchende Fensterklassen-Name <b>Edit</b> des Eingabefeldes des Taschenrecherns wurde über das Delphi-Zubehör <i>WinSight32</i> nachgeschlagen:
                  <pre>
                  <b>uses</b> ShellAPI, SNDKEY32;
                  <br>
                  <b>procedure</b> TForm1.Button1Click(Sender: TObject);
                  <b>var</b>
                  hCalcWnd : HWND;
                  hEditWnd : HWND;
                  iBuffLen : Integer;
                  pBuffer : PChar;
                  <b>begin</b>
                  hCalcWnd := FindWindow(<b>nil</b>, <font color="#9933CC">'Rechner'</font>);
                  AppActivate(<font color="#9933CC">'Rechner'</font>);
                  SendKeys(<font color="#9933CC">'1{+}'</font>, True);
                  Sleep(500);
                  SendKeys(<font color="#9933CC">'2'</font>, True);
                  Sleep(500);
                  SendKeys(<font color="#9933CC">'~'</font>, True);
                  hEditWnd := FindWindowEx(hCalcWnd, 0, PChar(<font color="#9933CC">'Edit'</font>), <b>nil</b>);
                  <b>if</b> hEditWnd &lt;&gt; 0 <b>then</b>
                  <b>begin</b>
                  iBuffLen := SendMessage(hEditWnd, WM_GETTEXTLENGTH, 0, 0);
                  <b>if</b> iBuffLen &gt; 0 <b>then</b>
                  <b>begin</b>
                  Inc(iBuffLen);
                  GetMem(pBuffer, iBuffLen);
                  <b>try</b>
                  SendMessage(hEditWnd, WM_GETTEXT, iBuffLen, LPARAM(pBuffer));
                  StatusBar1.SimpleText := pBuffer;
                  <b>finally</b>
                  FreeMem(pBuffer);
                  <b>end</b>
                  <b>end</b>
                  <b>end</b>;
                  <b>end</b>;
                  </pre&gt

                  Comment


                  • #10
                    Hallo Adreas,

                    vielen Dank noch mal für Deine Hilfe.

                    Da es mit dem Auslesen des Wertes unter Windows2000 Probleme gibt, habe ich darauf verzichtet. Der Rest funktioniert gut.

                    Gruß Jürge

                    Comment


                    • #11
                      Hallo,

                      &gt;Da es mit dem Auslesen des Wertes unter Windows2000 Probleme gibt...

                      welcher Art? Das Beispiel funktioniert unter Windows XP tadellos

                      Comment


                      • #12
                        Hallo Andreas

                        bei dem Befehl

                        hEditWnd := FindWindowEx(hCalcWnd, 0, PChar('Edit'), nil);

                        bekomme ich als Handle immer den Wert 0.

                        Die gleiche Funktion klappt bei einem Kollegen, der ebenfalls XP hat, bei einem Anderen mit Win2000 wiederum nicht.

                        Ist aber nicht so tragisch, habe nur den Aufruf mit Wertübergabe programmiert. Das funktioniert auf mehreren Rechnern.

                        Gruß Jürge

                        Comment

                        Working...
                        X