Specyficzne dzielenie stringa

0

Witam. Męcze się z tym i męcze i nie mogę znaleźć sposobu jak zawinać wiersze w Canvasie w taki sposób, że:

  1. w stringu S mam tekst w postaci 'Ale ma kota, kota ma ale bla bla pies zjadl kota.'
  2. w integerze mam maksymalny rozmiar testu. jak string go przekroczy to ma go uciac i <ort>przezucic </ort>do drugiej linijki i tym sposobem czym tekst jest dluzszy, tym wiecej bedzie linijek
  3. na koncu chce namalowac Canvasem przez TextOut tekst, w którym będą np. 2 pierwsze linijki (może to być jeden string oddzielony #13)

Czy ktoś ma jakiś pomyśł? Z góry dzięki ;)

0

Ad1 i Ad2.: Analizuj rozmiary tekstu za pomocą funkcji TextWidth znajdującej się w klasie TCanvas.

0

No tak, ale jak dam: "if Canvas.TextWidth(S) > i then" to jak to dalej uciąć?

0

Np robiąc pętelkę w której obcinasz od końca po kolei znaki az dlugosc lancucha bedzie odpowiednia.

0

Właśnie tak próbowałem, ale mi nie wyszło nie wiem dlaczego :(

0

Może funkca DrawText z unitu Windows? Moim zdaniem najprostszy i najlepszy sposób do takich zastosowań. Jest dobrze opisana w plikach pomocy, jak i w internecie. Pozwala zaróno na rysowanie (w jednej i kilku liniach), jak i obliczanie wymiarów tekstu do narysowania.

0

Doszełem do takiego czegoś:

procedure TForm1.Button1Click(Sender: TObject);
var
 s: string;
 MyRect: TRect;
begin
 s := 'Create a temporary canvas to calculate the height, not to by 1.';

 MyRect := Rect(0, 0, 150, 10);

 DrawText(Form1.Canvas.Handle, PChar(s), -1, MyRect, DT_CALCRECT or DT_WORDBREAK);

 DrawText(Form1.Canvas.Handle, PChar(s), -1, MyRect, DT_WORDBREAK);
end;

Ale nie wiem dlaczego, mimo, że mam ustawiony w MyRect maksymalny Height na 10 to tekst i tak będzie taki długi, dopóki się nie skończy :/ W przypadku Width to działa, ale dlaczego nie w Height :/ Ma ktoś ma jakiś pomysł jak to uciąć np. do drugiej linjki?

0

nie -1 tylko Length(s)
co ma wysokość Recta do długości textu???

0

A wiesz może jak uciać ten tekst w pionie ustalając jakiś Height? Coś jak w Labelu jak da się AutoSize na False i będzie za dużo tekstu to go ucina :)

0
 DrawText(Form1.Canvas.Handle, PChar(s), -1, MyRect, DT_CALCRECT or DT_WORDBREAK);

DT_CALCRECT służy nie do rysowania a obliczania wymiarów tekstu. Czyli po wywołaniu DrawText w ten sposób twoje MyRect, zmienia swoją wysokość, tak żeby cały tekst w nim się zmieścił. :P Jeżeli chcesz żeby wyskokość maksymalna była określona przez ciebie, po prostu nie wywołuj DrawText z opcją DT_CALCRECT.

0

Zrobiłem to troche inacze, ale wazne ze dziala, tzn stworzylem bitmape i na niej rysowalem :)

0

jak chcesz żeby nie zawijał to bez WORDBREAK i po sprawie

1 użytkowników online, w tym zalogowanych: 0, gości: 1