2017-07-01 2 views
-1

J'ai besoin d'obtenir le nombre de lignes affichées dans TMemo (ceci inclut les lignes qui ont été encapsulées parce que WordWrap a la valeur true). J'ai besoin de cela pour ajuster automatiquement la hauteur du Tememo à son contenu.Comment obtenir le nombre de lignes affichées dans TMemo?

lines.count bien sûr ne se soucient pas des lignes emballées donc je ne peux pas l'utiliser. étrangement TextPosToPos aussi ne se soucient pas de lignes enveloppées je ne peux pas l'utiliser trop ...

I m sous FireMonkey et delphi Berlin

Répondre

1

Je ne sais pas pourquoi l'utilisation de ContentBounds n'est "pas vraiment idéale". Voilà comment je le fais:

uses 
    FMX.TextLayout, FMX.Graphics; 

function MeasureTextHeight(const AFont: TFont; const AText: string): Single; 
var 
    LLayout: TTextLayout; 
begin 
    LLayout := TTextLayoutManager.DefaultTextLayout.Create; 
    try 
    LLayout.BeginUpdate; 
    try 
     LLayout.WordWrap := False; 
     LLayout.Font.Assign(AFont); 
     LLayout.Text := AText; 
    finally 
     LLayout.EndUpdate; 
    end; 
    Result := LLayout.TextHeight; 
    finally 
    LLayout.Free; 
    end; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    LTextHeight: Single; 
    LLines: Integer; 
begin 
    LTextHeight := MeasureTextHeight(Memo1.TextSettings.Font, Memo1.Text); 
    LLines := Round(Memo1.ContentBounds.Height/LTextHeight); 
end; 
+0

Qu'en est-il de l'enveloppe de mot? Cela ne prend pas en compte la restriction de largeur. En fait, votre code le désactive explicitement, ce qui est le contraire de ce que OP recherche. –

+0

@JerryDodge Je ne désactive pas WordWrap dans le mémo; vérifiez à nouveau le code. Quand j'ai dit "voici comment je fais", je veux dire que je l'utilise déjà. Si ça ne marchait pas, je ne l'aurais pas posté –

+0

merci Dave! oui c'est du travail comme ça. Cependant, je le fais d'une manière un peu différente (j'ai posté ma réponse plus tard). – loki

2

Modifier après avoir appris ContentsBounds. Ma réponse originale (et obsolète) est toujours visible dans les révisions.

Pourquoi avez-vous besoin du nombre de lignes affichées pour ajuster la hauteur du TMemo? Cette redimensionne la TMemo à son contenu:

Memo1.Height := Memo1.ContentBounds.Height + 5; // Small const to allow for rendering margins 

Il prend également mot-wrap en considération.

+0

merci tom, je fais en fait contentbounds/texte. taille mais pas vraiment idéal – loki

+0

merci tom, oui il serait facile de jouer avec contentBounds, mais je veux limiter la hauteur du mémo à 4 lignes, ce pourquoi j'ai besoin du nombre de lignes – loki

-1

C'est la façon approximative j'utiliser pour calculer le nombre de lignes d'un TMemo (style) sous FireMonkey:

type 
    _TStyledMemoProtectedAccess = class(TStyledMemo); 

procedure TALStyledMemo.OnApplyStyleLookupImpl(sender: Tobject); 
Var I, j, k, l: integer; 
begin 

    // TALStyledMemo 
    // TStyledMemo 
    //  TLayout 
    //   TActiveStyleObject 
    //   TLayout 
    //   TScrollBar 
    //   TScrollBar 
    //   TLayout 
    //    TSmallScrollBar 
    //    TSmallScrollBar 
    // TScrollContent 
    for I := 0 to controls.Count - 1 do begin 
    if (controls[i] is TStyledMemo) then begin // << TStyledMemo 
     fStyledMemo := TStyledMemo(controls[i]); 
    end; 
    end; 

end; 

function TALStyledMemo.getLineHeight: Single; 
begin 
    if fStyledMemo <> nil then result := _TStyledMemoProtectedAccess(fStyledMemo).GetLineHeight 
    else result := 0; 
end; 

function TALStyledMemo.getLineCount: integer; 
var aLineHeight: Single; 
begin 
    aLineHeight := getLineHeight; 
    if compareValue(aLineHeight, 0, Tepsilon.Position) > 0 then result := round(ContentBounds.Height/aLineHeight) 
    else result := 0; 
end;