Announcement

Collapse
No announcement yet.

Zeichen in TMemo anfügen ohne flackern

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

  • Zeichen in TMemo anfügen ohne flackern

    Hallo Leute,

    ich programmiere mit Delphi Version 4.0 und suche eine Möglichkeit um in eine TMemo Komponente einen String anzufügen ohne das diese dann flackert !

    Ich habe es mit folgener Anweisung probiert und da flackert die ganze TMemo Komponente
    <br>
    ...<br>
    for n:=0 to 255 do begin<br>
    Memo1.Text:=Memo1.Text+strSource;<br>
    end;<br>
    ...<br>
    <br>
    (dies simuliert das flackern !!!)

    Ich kann nicht mit der Function Memo1.Add oder ähnlich arbeiten weil man zur Programmlaufzeit nicht weiß ob es wirklich ein string ist der in eine Zeile gehört.

    hier mal ein Beispiel für drei Strings die eingefügt werden sollen...
    <br><br>
    strEins:='DAS IST DER ERSTE STRING'+#13#10+'TEST'<br>
    strZwei:='-TEST-TEST'<br>
    strDrei:=' für die MemoKomponente';<br>
    <br>
    das ergebniss soll nach dem anfügen wie folgt aussehen...

    DAS IST DER ERSTE STRING<br>
    TEST-TEST-TEST für die MemoKomponente<br>

    So sieht ja auch das Ergebniss aus wenn man es mit der Anweisung wie oben beschrieben macht allerdings flackert das gesamte MemoFenster und das sieht nicht schön aus !!!

    Ich hätte ja auch eine Idee wie man es lösen kann allerdings weiß ich dazu nicht wie man einen Tastendruck simulieren kann denn dann könnte man den String den man einfügen möchte einfach in einzelne "Char's" zerlegen und diese in einer Schleife als Tastendrücke zur MemoKomponente weiterleiten.

    Denn wenn man eine Taste drückt flackert das MemoFeld ja auch nicht !

    oder einfach die AddFunktion zu überschreiben das diese nicht gleich das CR anfügt.

    Ich hoffe mir kann da jemand weiterhelfen...

    Viel Spass beim Programmieren wünscht Benny...

    >>> [email protected] <<<

  • #2
    Hi

    Schau mal bei TMemo.Lines.BeginUpdate und .EndUpdate.

    Gruß Hage

    Comment


    • #3
      Hallo zusammen,<br>
      <br>
      BeginUpdate, EndUpdate führen nicht zum gewünschten ergebniss den das Memofeld wird dann wieder vollständig aktualisiert ! ;((( (flackert).
      <br>
      Vielen Dank Hagen für den Tip leider ungeeignet... denn im Programm läuft eine Schleife die ständig Zeichen in das TMemo anfügt (auch das ENTER-Zeichen kommt automatisch).<br><br>
      ich hoffe es gibt eine Lösung für das "Problem"...<br><br>
      Gruß Benn

      Comment


      • #4
        Hallo zusammen,

        BeginUpdate, EndUpdate führen nicht zum gewünschten ergebniss den das Memofeld wird dann wieder vollständig aktualisiert ! ;((( (flackert).
        Vielen Dank Hagen für den Tip leider ungeeignet... denn im Programm läuft eine Schleife die ständig Zeichen in das TMemo anfügt (auch das ENTER-Zeichen kommt automatisch).

        ich hoffe es gibt eine Lösung für das "Problem"...

        Gruß Benn

        Comment


        • #5
          Hi Benny

          Beginupdate und Endupdate KÖNNEN eine Lösung sein. ABER !!
          Das von Dir angesprochene Flackern kommt durch die interne Zeichenroutine des TMemos, oder bessser Windows-API's.
          Dabei wird eine wm_EraseBkGnd Message gesendet die den Hintergrund ausfüllt. Nachfolgen die wm_paint Message die dann den inhalt neu darstellt.
          Mein Hinweis auf Begin-/Endupdate hatte aber einen anderen Hinergrund.
          Intern nutzen diese Funktionen die Message wm_SetRedraw die ans Editcontrols gesendet wird. Allerdings stellt die Borland Endupdatefunktion das Editcontrol komplett neu dar. Dieses Verhalten gibt es mit der Message wm_Setredraw NICHT. Du mußt dann aber selber veranlassen das der neuzuzeichnenden Bereich invaildiert wird, und somit neugezeichnet wird.

          Abschließend: Willst Du dieses Flackern beseitigen sind einige Arbeiten nötig die API-Funktionen/Messages nutzt.
          Ich kann Dir aber versichern das es machbar ist :-)

          Gruß Hage

          Comment


          • #6
            Hallo,

            als Ergänzung zur Antwort von Hagen würde ich folgendes ausprobieren:
            <pre>
            ComponentStyle := ComponentStyle + [csOpaque] ;
            </pre>
            Ist <b>csOpaque</b> gesetzt, sollte Invalidate nicht mehr als Nebenwirkung die Botschaft WM_ERASEBKGRND auslösen. Damit im Control dann allerdings nicht nur "Müll" zu sehen ist, muss auch der Hintergrund in der Paint-Methode in eigener Regie gezeichnet werden.

            Hilft csOpaque nicht weiter, würde ich direkt WM_ERASEBKGRND auswerten. Das folgende Beispiel habe ich jedoch noch nie ausprobiert:
            <pre>
            TWinControlEx = class(TWinControl)
            private
            procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
            end;

            procedure TWinControlEx.WMEraseBkgnd(var Message: TWMEraseBkgnd);
            var
            i, Clip, SaveIndex: Integer;
            begin
            with Self do
            if not DoubleBuffered or
            (TMessage(Message).wParam = TMessage(Message).lParam) then
            begin
            SaveIndex := SaveDC(Message.DC);
            Clip := SimpleRegion;
            if ControlCount > 0 then begin
            for i := 0 to ControlCount - 1 do
            if not (Controls[i] is TWinControl) then
            with Controls[i] do begin
            if (Visible or (csDesigning in ComponentState) and
            not (csNoDesignVisible in ControlStyle)) and
            (csOpaque in ControlStyle) then
            begin
            Clip := ExcludeClipRect(Message.DC, Left, Top, Left + Width, Top + Height);
            if Clip = NullRegion then
            Break;
            end;
            end;
            end;
            if Clip <> NullRegion then
            FillRect(Message.DC, ClientRect, Brush.Handle);
            RestoreDC(Message.DC, SaveIndex);
            end;
            Message.Result := 1;
            end;
            </pre&gt

            Comment


            • #7
              Es ist zwar nur ein "work around" - aber hilft häufig in solchen Situationen:
              <pre>
              LockWindowUpdate(MyEdit.Handle);
              try
              for i:=0 to 100 do // damit's auch richtig flackern würde...
              begin
              MyEdit.Text:=MyEdit.Text+'1';
              Delay(30);
              end;
              finally
              LockWindowUpdate(0);
              end;
              </pre>
              (Ich bin einverstanden mit Hagen - ich habe mir die Mühe für das Richedit-Control sogar genommen - aber der Aufwand war ziehmlich gross und ich habe noch ein paar Neuzeichnungsprobleme)
              Gruss, Ren&#233

              Comment


              • #8
                Uups - Delay gibt's nicht mehr in Delphi - sollte natürlich Sleep heissen..

                Comment

                Working...
                X