Announcement

Collapse
No announcement yet.

Den Empfänger einer Message finden

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

  • Den Empfänger einer Message finden

    Hallo zusammen.
    Ich möchte gerne die WM_SETFOCUS abfangen, und herausfinden, an wen die Message geschickt wurde. Im Winsight32 (Ist ja bei Delphi dabei) bekomme ich wunderbar angezeigt "WM_SETFOCUS gesendet an EDIT2". Wie bekomme ich den Empfänger der MSG ausgelesen.
    So wie ich es bisher interpretiere, ist ja "msg.wparam" das Handle des Absenders. Wo finde ich in der Message den Empfänger ??
    Schon mal vielen Dank für eure Hilfe.

  • #2
    Hallo Michael,

    versuchs mal mit WM_KILLFOCUS. Laut Hilfe wird dort im wParam das Handle für das Fenster übergeben, das den Focus dann erhält.

    Grüße

    Juli

    Comment


    • #3
      Danke für den Tipp. Aber leider nutzt mir das nichts. Ich muss aus einer Message Sender und Empfänger rausbekommen.
      Der Sinn ist, ich will herausfinden welches Editfeld (von ca. 3000) gerade den Fokus hat, und dann von dem Edit die Farbe ändern.
      Ich habe im Internet auch Source gefunden, mit dem ich die Messages eines Controlls abfangen kann. Nur da ist die Message als Typ TMessage deklariert, weil der Code "FControl.WindowProc" aufruft. Diese Funktion kann aber nur mit TMessage arbeiten. Ansonsten wäre es ja einfach über "Message.HWND" zu lösen. Dann muss aber die Message vom Typ "TMsg" sein.
      Solangsam bin ich am verzweifeln *heul

      Comment


      • #4
        Ich hab den Knackpunkt gefunden. Wenn ich im FormShow mit ActiveControl das Handle abfrage, kann ich über die SET bzw. KILLFOCUS das Problem lösen.

        Jetzt steh ich nur geradem auf dem Schlauch. Wie kann ich über das Handle den Name der Komponente herauslesen ?

        Comment


        • #5
          Hallo,

          Du kannst alle Messages Deiner Applikation abfangen, indem Du eine Funktion schreibst, die das ganze managt und dann diese Application.OnMessage zuweist.
          Also ungefähr so:

          Im Mainform:
          public:
          procedure GetMsg(var Message :TMsg; var handled :Boolean);

          OnShow:
          Application.OnMessage := GetMsg;

          So habe ich das zumindest schon mal geregelt. Da bekommst du dann auch ein TMsg, und zwar für ALLE Messages.
          Bei mir waren die interessanten Messages allerdings benutzerdefiniert...

          Grüße

          Juli

          Comment


          • #6
            Hmm, warum arbeitest du nicht mit TEdit.OnEnter und TEDit.OnExit?
            Wäre das nicht doch etwas einfacher?

            Ansonsten kannst du alle controls durchgehen und nach dem Handle suchen, dann bekommst Du auch den Namen

            Comment


            • #7
              Ich machs nicht mit ONExit bzw. OnEnter, da wir in unserer Anwendung ca. 3000 Edits haben. Und da überall das einzubauen, da habe ich keine Lust zu. Das mit onmessage werde mich mal testen.

              Danke

              Gruß aus dem schönen Saarland

              Michae

              Comment


              • #8
                Leider gehts nicht mit

                Application.onmessage

                Ich habs im GetMSg versucht mit

                <PRE>
                if Message.Message = WM_SETFOCUS then
                </PRE>

                aber es geht nicht. Er erkennt die Message nicht

                Comment


                • #9
                  Das OnEnter und OnExit kann man doch auch im Programm zuweisen

                  Comment


                  • #10
                    Mal eine andere Frage: Wozu sind 3000 Edits gut?

                    Am einfachsten ist es tatsächlich die OnEnter / OnExit der Edits zu überschreiben.
                    Das kann man folgendermaßen lösen (leider habe ich nur den BCB, ich hoffe Du kannst es übersetzen):<BR>
                    Im TForm Header Funktion deklarieren;
                    <PRE>
                    void __fastcall GenEnter(TObject *Sender);
                    void __fastcall GenExit(TObject *Sender);
                    </PRE>
                    Die Funktionen dazu;
                    <PRE>
                    void __fastcall TForm1::GenEnter(TObject *Sender)
                    {
                    TEdit* ed = (TEdit*) Sender;
                    ed->Color = clYellow;
                    }
                    void __fastcall TForm1::GenExit(TObject *Sender)
                    {
                    TEdit* ed = (TEdit*) Sender;
                    ed->Color = clWhite;
                    }
                    </PRE>
                    Dann muß man die Funktionen natürlich noch den Edits zuweisen. Im Konstruktor des Forms:
                    <PRE>
                    TControl* tc;
                    for (int i = 0; i < Form1->ControlCount; i++)
                    {
                    tc = Form1->Controls[i];
                    if (tc->ClassNameIs("TEdit"))
                    {
                    TEdit* ted = (TEdit*) tc;
                    ted->OnEnter = GenEnter;
                    ted->OnExit = GenExit;
                    }
                    }
                    </PRE>
                    Hierbei bin ich davon ausgegangen, daß die Edits direkt auf dem Form liegen, sollten sie auf einem Panel liegen, müssen natürlich die Controls des Panels durchiteriert werden.

                    Grüße Joche

                    Comment


                    • #11
                      Die 3000 Edits sind in der Anwendung verteilt auf verschiedenen Instanzen einer selbst entwickelten Form. Ich muss also nur eine Komponente entwickeln, und diese auf die selbstentwickelte Form legen.
                      Ich hab das Prob schon gelöst, stehe aber schon vor dem nächsten.
                      Ich habe ein Handle, und möchte die Komponente zu diesem Handle haben.
                      Mit FindControl() geht das, aber nicht bei ner Combobox. Wie kann ich das bei einer Combobox lösen. Am besten wäre eine Lösung die bei allen Komponenten funktioniert.

                      Gruß

                      Michae

                      Comment


                      • #12
                        Na ja, man kann doch nur die auf dem Form liegenden Edits zählen, nicht die aller Instanzen der Form. Sonst sind es ja schon 6000, wenn ich die Anwendung 2 x starte. Sowas nenne ich Milchmädchenrechnung.

                        Das Problem mit der ComboBox kann ich nicht nachvollziehen. Funktioniert bei mir einwandfrei:
                        <PRE>
                        HWND hCB = ComboBox1->Handle;
                        TWinControl* wc = FindControl(hCB);
                        if (wc)
                        {
                        RichEdit1->Lines->Add(wc->ClassName());
                        RichEdit1->Lines->Add(wc->Name);
                        }
                        </PRE>

                        Grüße Joche

                        Comment


                        • #13
                          Ich habs ganz einfach gelöst bekommen.
                          Ich könnte mir in den A**** beisen.
                          Man muss einfach auf

                          Application.ONActiveControlChange

                          reagieren. Da brauch man nix mit handle oder ähnlichem.
                          Naja, wenigstens hab ich hierbei auch was gelernt. Trotzdem danke für eure Hilfen

                          Gruß

                          Michae

                          Comment


                          • #14
                            öh, jetzt wo Du es sagst... Manchmal sieht man den Wald vor lauten Bäumen nicht.

                            Grüße

                            Joche

                            Comment


                            • #15
                              Genau so hatte ich auch gedacht.
                              Trotzdem Danke

                              Gruß

                              Michae

                              Comment

                              Working...
                              X