2 TMemo Felder gleichzeitig scrollen



  • Hi!

    Ich habe 2 TMemo Felder und möchte diese so miteinander "verknüpfen" dass ich wenn ich bei einem TMemo-Feld die Scrollbalken verschiebe sich auch im anderen TMemo-Feld die Scrollbalken verschieben. Der Inhalt natürlich ebenfalls. ICh habe so ein Codebeispiel hier schon mal gesehen glaube ich, nur ist die momentane Suchfunktion rein gar nicht zu gebrauchen. Danke im vorraus!

    Sebo


  • Mod

    Hallo

    fang die Botschaften des einen TMemos ab und mach dasselbe mit dem anderem TMemo

    MfG
    Klaus



  • Jo, des ist mir klar, aber mir ist nicht klar wie ich das mache. 🙂 Hat jemand einen Tip oder ein Codebeispiel? Thanks a lot!

    Sebo


  • Mod

    Hallo

    zB

    void __fastcall TForm1::NewWndProcMemo1(TMessage &AMsg)
    {
    switch (AMsg.Msg)
        {
        case WM_BOTSCHAFT :
                 Mach_irgandWas_mit-Memo2();
    
        default : OldWndProcTrackBar(AMsg);
        }
    

    So ca. in der Art

    MfG
    Klaus



  • Zur Botschaftsbehandlung findest du hier Unmengen im Forum. Einfach mal die Suche/FAQ bemühen.
    Wahrscheinlich heißt die dich interessierende Botschaft WM_SCROLL.

    Gruß, Oli



  • Jo, Danke an alle!

    Sebo



  • hi,

    anstatt nur hilflose kommentare hier mal ein ausführliches beispiel. du hast zwei memos auf deinem formular. beim scrollen eines memos wird das andere jeweils angepasst.

    im header des formulares:

    private:
    
      TWndMethod  OldWndProcMemo1;
      TWndMethod  OldWndProcMemo2;
    
      void __fastcall NewWndProcMemo1(TMessage &Msg);
      void __fastcall NewWndProcMemo2(TMessage &Msg);
    

    in der cpp des formulares:

    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      // alte Fensterprozeduren merken
      OldWndProcMemo1   = Memo1->WindowProc;
      OldWndProcMemo2   = Memo2->WindowProc;
    
      // neue Fensterprozeduren setzen
      Memo1->WindowProc = NewWndProcMemo1;
      Memo2->WindowProc = NewWndProcMemo2;
    }
    
    //---------------------------------------------------------------------------
    // Fensterprozedur fuer Memo1
    // -> hier kommen alle Windowsbotschaften an
    //---------------------------------------------------------------------------
    void __fastcall TForm1::NewWndProcMemo1(TMessage &Msg)
    {
      switch (Msg.Msg)
      {
        // auf Scrollen reagieren und Memo2 anpassen
        case WM_HSCROLL :
        case WM_VSCROLL :
        {
          // die Botschaft kommt von Memo2
          // -> nicht erneut eine Message an Memo2 senden
          //    sondern die Verarbeitung abbrechen
          if ((HANDLE) Msg.LParam == Memo2->Handle)
          {
            Msg.LParam = 0;
            break;
          }
    
          // Message an Memo2 weiterleiten
          // -> LPARAM wird nur von ScrollBar-Controls verwendet
          // -> wir speichern dort das Handle vom Memo ab, das das
          //    Scrollen ausloest
          PostMessage(Memo2->Handle, Msg.Msg, Msg.WParam, (LPARAM) Memo1->Handle);
          break;
        }
      }
    
      // Original-Windowsprozedur aufrufen
      // -> damit Message auch bei Memo1 ankommt
      OldWndProcMemo1(Msg);
    }
    
    //---------------------------------------------------------------------------
    // Fensterprozedur fuer Memo2
    // -> hier kommen alle Windowsbotschaften an
    //---------------------------------------------------------------------------
    void __fastcall TForm1::NewWndProcMemo2(TMessage &Msg)
    {
      switch (Msg.Msg)
      {
        // auf Scrollen reagieren und Memo1 anpassen
        case WM_HSCROLL :
        case WM_VSCROLL :
        {
          // die Botschaft kommt von Memo1
          // -> nicht erneut eine Message an Memo1 senden
          //    sondern die Verarbeitung abbrechen
          if ((HANDLE) Msg.LParam == Memo1->Handle)
          {
            Msg.LParam = 0;
            break;
          }
    
          // Message an Memo1 weiterleiten
          // -> LPARAM wird nur von ScrollBar-Controls verwendet
          // -> wir speichern dort das Handle vom Memo ab, das das
          //    Scrollen ausloest
          PostMessage(Memo1->Handle, Msg.Msg, Msg.WParam, (LPARAM) Memo2->Handle);
          break;
        }
      }
    
      // Original-Windowsprozedur aufrufen
      // -> damit Message auch bei Memo2 ankommt
      OldWndProcMemo2(Msg);
    }
    

    viel spass


  • Mod

    Hallo

    was sollte er denn daraus lernen -> wie man Code kopiert

    Sorry, aber ich gehe davon aus "SeboStone" wollte hier etwas lernen
    (und ich gehe auch davon aus er hat es getan)
    siehe sein Posting

    MfG
    Klaus



  • 🙂

    Ja, ich habe noch ein bisschen recherchiert und rumprobiert. funzt. Aber trotzdem Danke auch für den Code! 🙂

    @KlausB: Ausserdem hat es doch gut gemeint und auch gut dokumentiert. Der nächste freut sich drüber liest die Doku dazu und hat auch was gelernt, wahrscheinlich schneller als ich, dafür vergisst er es vielleicht schneller wieder, aber egal.

    Ziel und Sinn erfolgreich erreicht! 🙂

    Sebo



  • Hallo,
    ich bin Sunday mehr als sehr dankbar für die ausführliche Variante. Sehr nett!
    Eine knappe Beantwortung hilft mir meistens, jedoch führt sie mich nicht zum Ziel.
    Wahrscheinlich hätte ich es nicht erreicht und wäre dann frustriert gewesen. Meist stehe ich ja auch noch vor anderen Problemen, die mich herausfordern. Deswegen wünschte ich mir eine Antwort wie die von Sunday, damit ich mich wieder um die anderen Probleme kümmern kann.

    Vielen Dank für eure Hilfe, schreibt sie stets ausführlich, wenn möglich!
    Gruß,
    HS-Klaus


Anmelden zum Antworten