Announcement

Collapse
No announcement yet.

PostMessage in Delphi8 (.net)

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

  • PostMessage in Delphi8 (.net)

    Hallo<BR>
    <BR>
    habe ein kleines Problem. Vieleicht kann mir einer helfen.<BR>
    <BR>
    Im Delphi5 habe ich die PostMessage verwendet um einen Druckvorgang in einen<BR>
    Modale-Fenster zu starten.<BR>
    Wie funktioniert die PostMessage in .Net (Delphi8) ?<BR>
    <BR>
    Danke im Voraus<BR>
    <BR>
    <PRE>
    type<BR>
    TLDForm0001 = class(TForm)<BR>
    Printer: TSWSPrinter;<BR>
    .... <BR>
    private<BR>
    procedure CMStartDrucken(var Message: TMessage);message CM_STARTDRUCKEN;<BR>
    .....<BR>
    END<BR>
    .......
    procedure TLDForm0001.FormActivate(Sender: TObject);<BR>
    begin<BR>
    PostMessage(Handle,CM_STARTDRUCKEN,0,0);<BR>
    end;<BR>
    .......<BR>
    Procedure TLDForm0001.CMStartDrucken(var Message: TMessage);<BR>
    begin<BR>
    if FDruckGestartet = false then begin<BR>
    FDruckGestartet:=true;<BR>
    ......<BR>
    </PRE>

  • #2
    Hallo,

    &gt;Wie funktioniert die PostMessage in .Net (Delphi8) ?

    genauso wie früher. Bei einer <b>FCL</b>-Anwendung (Windows Forms aus dem .NET Framework) sieht das zum Beispiel so aus:

    Schritt 1: Namespace <b>System.Runtime.InteropServices</B> einbinden
    <pre>
    <b>unit</b> WinForm;
    <br>
    <b>interface</b>
    <br>
    <b>uses</b>
    System.Drawing, System.Collections, System.ComponentModel,
    System.Windows.Forms, System.Data,
    System.Runtime.InteropServices;
    </pre>
    Schritt 2: Botschaftsbehandlung über die geerbte Methode <b>WndProc</b> im Formular deklarieren
    <pre>
    <b>type</b>
    TWinForm = <b>class</b>(System.Windows.Forms.Form)
    <font color="#003399"><i>{$REGION 'Designer Managed Code'}</i></font>
    ...
    <font color="#003399"><i>{$ENDREGION}</i></font>
    strict <b>protected</b>
    <b>procedure</b> Dispose(Disposing: Boolean); <b>override</b>;
    <b>procedure</b> WndProc(<b>var</b> aMsg: System.Windows.Forms.Message); <b>override</b>;
    <b>private</b>
    <font color="#003399"><i>{ Private Declarations }</i></font>
    <b>public</b>
    <b>constructor</b> Create;
    <b>end</b>;
    </pre>
    Schritt 3: Botschaftsbehandlung (Auswertung) implementieren
    <pre>
    <b>procedure</b> TWinForm.WndProc(<b>var</b> aMsg: System.Windows.Forms.Message);
    <b>begin</b>
    <b>if</b> aMsg.Msg = $8001 <b>then</b>
    <b>begin</b>
    Button1.Text := <font color="#9933CC">'$8001'</font>;
    <b>end</b>;
    <b>inherited</b> WndProc(aMsg);
    <b>end</b>;
    </pre>
    Schritt 4: Botschaft über <b>PostMessage</b> verschicken
    <pre>
    [DllImport(<font color="#9933CC">'user32.dll'</font>)]
    <b>function</b> PostMessage(Hnwd, Msg, wParam, lParam: Integer): Integer; <b>external</b>;
    <br>
    <b>procedure</b> TWinForm.Button1_Click(sender: System.<b>Object</b>; e: System.EventArgs);
    <b>begin</b>
    PostMessage(Handle.ToInt32, $8001, 0, 0);
    <b>end</b>;
    </pre>
    Handelt es sich im jedoch um eine <b>VCL.NET</b>-Anwendung, so ändert sich nichts gegenüber früher:
    <pre>
    <b>unit</b> Unit1;
    <br>
    <b>interface</b>
    <br>
    <b>uses</b>
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, System.ComponentModel, Borland.Vcl.StdCtrls;
    <br>
    <b>const</b>
    PM_APP = WM_APP + 1;
    <br>
    <b>type</b>
    TForm1 = <b>class</b>(TForm)
    Button1: TButton;
    <b>procedure</b> Button1Click(Sender: TObject);
    <b>procedure</b> PMAPP(<b>var</b> Msg: TMessage); message PM_APP;
    <b>private</b>
    <font color="#003399"><i>{ Private declarations }</i></font>
    <b>public</b>
    <font color="#003399"><i>{ Public declarations }</i></font>
    <b>end</b>;
    <br>
    <b>var</b>
    Form1: TForm1;
    <br>
    <b>implementation</b>
    <br>
    <font color="#003399"><i>{$R *.nfm}</i></font>
    <br>
    <b>procedure</b> TForm1.PMAPP(<b>var</b> Msg: TMessage);
    <b>begin</b>
    Button1.Caption := <font color="#9933CC">'PM_APP'</font>;
    <b>end</b>;
    <br>
    <b>procedure</b> TForm1.Button1Click(Sender: TObject);
    <b>begin</b>
    PostMessage(Handle, PM_APP, 0, 0);
    <b>end</b>;
    <br>
    <b>end</b>.
    </pre&gt

    Comment


    • #3
      Danke für die prompte Antwort !<BR>
      <BR>
      Habe aber noch eine Frage. <BR>
      <BR>
      Das Beispiel beinhaltet die Zeilen ..<BR>
      <PRE>
      [DLLImport('user32.dll')]
      funktion PostMessage(Hnwd,Msg,wParam,lParam: integer ;external;
      </PRE>
      <BR>
      Das sieht für mich so aus als ob hier eine Funktion aus der alten<BR>win32-Welt verwendet wird und nicht eine reine .Net Funktion.<BR
      <BR>
      Ist das jetzt ein .net Programm oder nicht ?<BR>
      <BR>
      Dank

      Comment


      • #4
        > Das sieht für mich so aus als ob hier eine Funktion aus der alten
        win32-Welt verwendet wird und nicht eine reine .Net Funktion.

        Na Und?<br>
        Du verwendest wie ich sehe VCL.NET. Und dort wird alles über PInvoke auf die "alten" Win32-Funktionen umgesetzt.<br>
        Auch WinForms werden letztendlich auf Win32-API-Funktionen umgesetzt. Jedoch im Gegensatz zu VCL.NET in "Trusted" MS-Assemblies und deshalb mit weniger problemen (Rechte, Portierbarkeit, ...)

        > Ist das jetzt ein .net Programm oder nicht ?

        Es ist ein .NET-Programm, jedoch nicht mehr auf andere Plattformen (PocketPC, Linux) portierbar, da eine feste Bindung mit Win32 vorliegt

        Comment


        • #5
          Hallo,

          &gt;Das sieht für mich so aus als ob hier eine Funktion aus der alten
          win32-Welt verwendet wird ...

          über das <b>DllImport</b>-Attribut wird der CLR (Common Language Runtime) von .NET mitgeteilt, dass die Implementierung der aufgerufenen Methode in einer unmanged code-DLL (Win32-DLL) steckt. Wenn die Konfiguration der .NET Security dem Aufruf nicht im Wege steht, schaltet die CLR für den Zeitpunkt des Aufrufs in der Tat kurzzeitig vom mananged code auf unmanged code um (P/Invoke-Aufruf).

          &gt;Ist das jetzt ein .net Programm oder nicht ?

          Es ist immer noch ein .NET-Programm. Denn auch die nativen Klassen aus dem .NET-Framework setzen ja <b>zur Zeit</b> noch direkt auf die "alten" Win32-API-Funktionen auf. Der Komfort besteht nur darin, dass die Klassen im .NET Framework gerade im Bezug auf die <i>Code Access Security</i> (CAS) bereits alle Vorkehrungen treffen (d.h. die von Microsoft signierten Assemblies werden effizienter ausgeführt als eigene P/Invoke-Aufrufe). Erst mittelfristig wird sich das ändern, wenn das Win32-API im Betriebssystem ersetzt wird.

          Wenn man "reines" .NET (also ohne eigene P/Invoke-Aufrufe) nutzen will, muss man auf andere (vorhandene) Synchronisationsmechanismen wie zum Beispiel über die Klassen <b>AutoResetEvent</b> und <b>ManualResetEvent</b> zurückgreifen. Die Frage ist nur, welchen Vorteil man von diesem "puren" Ansatz hat ;-

          Comment


          • #6
            Hallo,<BR>
            <BR>
            <Die Frage ist nur, welchen Vorteil man von diesem "puren" Ansatz hat ;-) ...<BR>
            <BR>
            für mich stellt sich die Frage wie wird es in Zukunft weiter gehen?.<BR>
            Ich denke die Zukunft wird sicher .net sein. Das bedeutet aber auch dass es die win32 Welt<BR>
            irgendwann einmal nicht mehr geben wird. Wenn ich schon in .net Programmiere dann werde ich<BR>
            auch die vorhandenen .net Funktion verwenden und nicht die win32 Funktionen. Weil wie schon<BR>
            gesagt irgendwann werden die win32 Funktionen nicht mehr zur Verfügung stehen, und ich muss<BR>
            dann alle meine Programme umschreiben!<BR>
            Dieser Arbeit will ich rechzeitig aus dem Weg gehen!<BR&gt

            Comment


            • #7
              Hallo,

              &gt;Dieser Arbeit will ich rechzeitig aus dem Weg gehen!

              derartige Überlegungen sind sicherlich prinzipiell richtig. Aber wenn man bedenkt, dass auch Heute noch Win16-Anwendungen unter aktuellen Windows-Versionen laufen, ist die Übergangsfrist schon sehr lang, die uns an dieser Stelle von Microsoft eingeräumt wird. Denn nach dem .NET Framework 2.0 wird ja erst die darauffolgende Version grundlegende Erweiterungen vornehmen (Longhorn, Avalon, WinFS usw.). Ich glaube daher, dass der pragmatische Ansatz im Alltag am zweckmäßigsten ist - nur aus didaktischer Sicht muss die "reine" .NET-Anwendung im Vordergrund stehen ;-

              Comment


              • #8
                > Weil wie schon gesagt irgendwann werden die win32 Funktionen nicht mehr zur Verfügung stehen, und ich muss dann alle meine Programme umschreiben!

                Wirst Du eh machen dürfen wenn Du auf WinForms/VCL.NET aufsetzt. Erst mit .NET 2.0 und Avalon gibt es einen komplett neuen Ansatz, welcher letztendlich nicht auf Win32 basiert

                Comment


                • #9
                  Hallo Bernhard,

                  &gt;Wirst Du eh machen dürfen ...

                  auch nach Avalon werden die bisherigen FCL Windows Forms unterstützt. Nur dann, wenn man die <b>neuen</b> Fähigkeiten nutzen will (d.h. wenn die Benutzeroberfläche aufpoliert werden soll), gibt es Handlungsbedarf.

                  Ich bin so frei, die entsprechende Passage im Original zu zitieren (den aus meiner Sicht entscheidenden Satz habe ich durch die Fettschrift hervorgehoben):

                  <i>
                  At PDC2003, Microsoft introduced a new Windows presentation technology, code-named “Avalon.” Though Avalon v1.0 is not slated to be available to customers until 2006, we want to provide guidance on the relationship of Avalon to Windows Forms to ensure that customer investments in user interface are protected.



                  Windows Forms has substantial customer adoption today. It delivers a powerful rapid application development experience with full integration with Visual Studio, which lowers cost of development and time to market of smart client applications. Windows Forms v2.0 will release with Visual Studio 2005 (prior to Avalon v1.0) and is the best way today to create client applications using the .NET Framework. Going forward, Windows Forms will continue to be part of the .NET Framework and supported as such and is the main way to write managed code today to prepare for Avalon.



                  Avalon is Microsoft’s future presentation platform, designed for creating visually stunning, differentiated user experiences. Avalon builds on top of DirectX and introduces a unified engine for creating forms-based applications, graphics, video, and documents. Avalon’s engine fully exploits the richness of today’s hardware. When delivered, Avalon will become Microsoft’s strategic UI platform.



                  Microsoft is committed to providing guidance, tools, and technologies that will enable customers to leverage their skills and, where appropriate, source code to extend applications with the latest technologies. <b>One of the key areas Microsoft has invested in is interoperability between Avalon and Windows Forms, enabling Windows Forms controls to be used in Avalon applications and Avalon controls to be used in Windows Forms applications.</b> This interoperability technology will help customers smoothly transition to Avalon.



                  Microsoft’s roadmap for client UI development has three main phases:



                  1. Today, use Windows Forms v1.1 and observe the Microsoft Patterns and Practices guidance for maintaining clean separation between UI and other application logic.

                  2. When Avalon v1.0 releases (scheduled for mid-2006), we recommend that applications looking to differentiate their user interface such as Web sites and graphically intensive applications such as complex data visualization look closely at Avalon. Other applications should continue using Windows Forms.

                  3. Following the release of Avalon 1.0, the next version of Visual Studio following Visual Studio 2005 will contain tools and designers to support Avalon. At this point, customers should start to move their new development efforts to Avalon and use the Windows Forms/Avalon interoperability features.
                  </i&gt

                  Comment


                  • #10
                    Heißt das das hier ein ähnlich Weg wie mit D8/2005 eingeschlagen wird, wo auch WinForms und VCL.NET-Forms in einer Anwendung gemischt werden (bzw. auch mit <a href="http://www.inchl.nl/delphi/">VCL2NET</a>) auch auf einem Form?<br>
                    Oder wird es Schnittstellenkompatible Avalon-Controls geben, welche den WinForms-Controls entsprechen und transparent ersetzt werden

                    Comment


                    • #11
                      Hallo,

                      &gt;Heißt das das hier ein ähnlich Weg wie mit D8/2005 eingeschlagen

                      nein, denn der Delphi-Weg mixt ja .NET mit Win32, während die "Mischbatterie" von Microsoft in allen Fällen aus MSIL gespeist wird. Da in jedem Fall der JIT greift, kann zur Laufzeit via Reflection bei Bedarf beliebiger Anpassungs-Code (MSIL) dazugemischt werden, so dass keine schmutzigen Kompromisse notwendig werden. Zur Zeit gibt es allerdings meines Wissens nach keine exakte Beschreibung, wie das später technisch umgesetzt werden soll. Es gibt nur die Aussage von Microsoft, dass ein bequemer Migrationspfad bereitgestellt wird (der allerdings nur für die Windows Forms aus der FCL, aber nicht für die VCL.NET verfügbar wäre)

                      Comment


                      • #12
                        Wir werden sehen ob das wirklich elegand umgesetzt wird.<br>
                        MS hat ja schon of was versprochen und erst Jahre verspätet umgesetzt (wenn überhaupt)

                        Comment

                        Working...
                        X