Scrollbar aktualisiert nicht

  • Hallo,

    ich erzeuge per Code in einer Tabelle 100 Zeilen.

    Nach dieser Operation stehe ich z.B. auf Seite 3, die letzte neue Zeile ist sichtbar.

    Der vertikale Scrollbalken aber ist immer noch ganz oben (also nicht passend zum gerade angezeigten Inhalt).

    Wie kann ich diesen auf die aktuelle Position bewegen damit Übereinstimmung besteht und nicht das Dokument beim ersten Anfassen des Scrollbalkens springt?

    Nachtrag : ich habe immer DelayedReformat benutzt, mit Reformat(false,true) ist die Scrollbar korrekt!

    Wo liegt der Unterschied zwischen beiden Reformat-Varianten?

    Zusatzfrage:

    Wenn ich nun direkt nach der Tabellenerzeugung wie im anderen Thread beschrieben ein TWPTextObj einfüge, wird es auf der aktuellen letzten Seite eingefügt.

    Ich möchte es aber auf Seite 1 haben, WPRichText1.Memo.ScrollPosition := 0 funktioniert so nicht.

    Ciao

    Stefan

    Einmal editiert, zuletzt von skoschke (24. Januar 2018 um 08:32) aus folgendem Grund: Erweiterung

    • Offizieller Beitrag

    DelayedReformat formatiert wenn die Applikation Zeit hat, das ganze wird intern über PostMessage implementiert.

    ReformatAll sollte man normalerweise verwenden und zwar ganz zum Schluss, wenn alles gemacht ist.

    Mit CPPosition wird die Cursor position geändert, wenn Sie also ein Objekt am Anfang des Textes einfügen wollen, brauchen Sie CPPosition := 0 - was dann auch wieder nach oben scrollt.

    Um die Scrollbar zu sperren gibt es LockScreen/UnLockScreen - man kann aber auch die Eigenschaft TopOffset auslesen bzw. beschrieben umd die scrollposition zu ändern.

  • Zitat

    Mit CPPosition wird die Cursor position geändert, wenn Sie also ein Objekt am Anfang des Textes einfügen wollen, brauchen Sie CPPosition := 0 - was dann auch wieder nach oben scrollt.

    Vor dem Einfügen eines TWPTextObj führe ich CPPosition := 0 aus, die Textbox wird jetzt auf Seite 1 korrekt eingefügt auch wenn ich gerade auf Seite 3 bin, das Dokument scrollt aber nicht wie beschrieben nach oben, es bleibt stehen wo es gerade ist, die Scrollbar bleibt auch unverändert!

    "Was dann auch wieder nach oben scrollt" funktioniert also nicht wie erwartet!

    Ciao

    Stefan

    Nach einigem "Spielen" bin ich zu folgendem Code gekommen:

    Code
      WPRichTextArbeit.Memo.TopOffset := 0;
      WPRichTextArbeit.ReformatAll(false,true);
      WPRichTextArbeit.CPPosition := 0;
    ... und jetzt Textboxen erzeugen

    jetzt wird nach oben gescrollt und die Textbox wie gewünscht eingefügt.

    Das Dokument besteht jetzt aus einer Tabelle mit 2 Zeilen, darüber die Textbox.

    Wenn ich aber jetzt eine weiter unten auf der Seite liegende Tabelle verlängere ( neuezeile := zeile.Duplicate(false, false); )

    dann wird meine Textbox auf allen dabei entstandenen Seiten wiederholt!

    Was ist denn nun los?

    2 Mal editiert, zuletzt von skoschke (24. Januar 2018 um 13:56)

    • Offizieller Beitrag

    Ich habe so den Verdacht die Textbox ist in einer wiederholten Header Zelle gelandet. Dann müsste sie in der Tat wiederholt angezeigt werden.


    Wie bei der Textbox frage bereits gesagt - ich halte dies für eine sehr komplizierte Art um eine Adresse einzufügen und würde das selber nicht so machen.

    Wenn Sie die Adresse geschützt im Dokument unterbringen wollen, dann bietet sich hier auch ein Kopftext nur für Seite 1 an. Dieser Bereich könnte dann auch gesperrt sein.

    Man braucht also vor der Tabelle zumindest eine Zeile (also einen Absatz) welcher den Anker der Textbox aufnehmen kann.

    Die Sache mit dem Scrollen kann ich so nicht nachvollziehen. Ich würde nach der Erstellung des Textes, wenn man also fertig ist, ReformatAll aufrufen, die Cursor Position setzen mit CPPosition und dann auch den Focus reinsetzen - SetFocus.

    Die Bildschirmposition müsste dann entsprechend upgedatet werden.

    Während der automatischen Erstellung scrollt WPTools meist nicht mit - das ist natürlich Absicht und führt zu der hohen Performance die man bei WPTools beobachten kann.

  • Danke für die Info's!

    Zum Hintergrund meiner Textboxen:

    Ich muss ein Dokument erstellen, welches aus vielen frei positionierbaren Texten besteht (deren Position durch eine Vorlage festgelegt ist) und das aussieht wie z.B. ein Lieferschein...

    Der hat oben Felder wo die Adresse steht, ein Firmenlogo, Auftragsnummer, Bestelldatum etc.

    Darunter kommt dann die Tabelle mit den Rechnungspositionen, die auf der ersten Seite in ca. Seitenmitte beginnt und auf den Folgeseiten dann oben auf der Seite.

    Das habe ich in MeasureTextPage über die Margins gelöst. Die Tabelle wächst wie gewünscht...

    Das mit dem Text vor der Tabelle habe ich versucht:

    Code
        CheckHasBody;
        par := Activepar;
        par := par.appendnewPar;
        par.SetText('some text');
        ActiveParagraph := par;
        Table := TableAdd(Vorlage.Tabellenkopf.AnzahlSpalten, 1, Mode, nil,
          CreateTableCellCallBackHF);

    aber im Dokument kommt erst die Tabelle und danach die Zeile mit 'some text'...

    Wenn es einen besseren Weg gibt solche Textfelder frei zu positionieren (Premium WPTools 8) dann werde ich das natürlich gern probieren!

    Ciao

    Stefan

    • Offizieller Beitrag

    In diesem Fall machen die Textboxen natürlich SInn. Das Beispiel verwendet ja eine Variable txtobj, man kann also die Textbox auf der Seite genau platzieren:

    Code
        txtobj := WPRichText1.InputTextbox('', w,h,true);
        txtobj.PositionMode := wpotPage;
        txtobj.RelY := WPCentimeterToTwips(4);
        txtobj.RelX := WPCentimeterToTwips(1);

    TableAdd fügt die Tabelle an der Cursor Position ein, diese ist nach ActiveParagraph := par am Anfang dieser Zeile. Die Tabelle wird also richtigerweise davor eingefügt.

    Damit sollte es dann gehen:

    Code
       WPRichText1.Clear;
       WPRichText1.InputString(#13);
       WPRichText1.TableAdd(3,1,[wptblActivateBorders]);

    InputString(#13) simuliert hier die Betätigung der Return taste und man landet am Anfang einer neuen Zeile.