Długość tekstu w jednym wierszu memo w pikselach

0

Potrzebuję pomocy. Jest taka funkcja canvas.textwidth('jakis tekst') która zwraca długość podanego tekstu w pikselach... Problem w tym, że jest to zależne od ustawionej czcionki na formie czyli form1.font a jeżeli ustawię inną czcionkę dla memo to jak sprawdzić faktyczną długość jakiegoś wiersza w memo (w pikselach oczywiście)??
Bardzo proszę o szybką pomoc
[???]

0

Hmm no chyba, że znacie jakąś funkcję/procedurę, która automatycznie dopasuje wys i szer memo do tekstu, który się w nim znajduję albo może jest taka właściwość?

Czyli np jak piszę tekst to memo się poszerza w prawo a jeżeli przechodzę do nowej linii to zwiększa swoją wysokość.. Jest takie coś?

0

Zastosuj TRichEdit zamiast TMemo i oprogramuj zdarzenie OnResizeRequest.

0

Memo1.canvas.textwidth() ? Zawsze zostaje stworzyć dodatkowy canvas, który nie będzie nigdzie widoczny, a będzie służyć do pobierania szerokości tekstu.

0

Uhh mam takie coś:

procedure TForm1.RichEdit1ResizeRequest(Sender: TObject; Rect: TRect);
begin
 if Rect.Bottom>RichEdit1.BoundsRect.Bottom then
   //zmianawysokosci;
end;

Znalazłem to ale nie wiem jak sprawdzić czy podczas pisania litery doszły już do prawej granicy richedita. Pomoże ktoś? Jak zamiast bottom wpiszę right to nie działa.. Nie wiem o co chodzi z tymi prostokątami..

Ani memo ani richedit nie mają właściwości canvas a nie mam pojęcia jak można zrobić żeby miały :P

0

A na ch... mu RichEdit do tego?

Już ktoś Ci napisał:

memo.canvas.textWidth(memo.lines[0]) - długość pierwszego wiersza w pikselach.
Oczywiście, jeśli wiersz istnieje :)

0

Nie ma takiego czegoś jak memo1.canvas !! Sprawdź sobie jak chcesz...

0

Juhas
Już Ci Quak napisał, że Memo i RichEdit nie mają Canvasa.

0
Quak napisał(a)

Nie wiem o co chodzi z tymi prostokątami.

TRect określa prostokąt, w którym będzie zmieszczony tekst.
Przykładowo w OnResizeRequest możesz automatycznie dopasowywać, przy stałej szerokości, wysokość RichEdit tak aby cały tekst się zmieścił:

RichEdit1.ClientHeight:=Rect.Bottom-Rect.Top;
0

Spoko na wysokość znalazłem już coś takiego:

with (Sender as TRichEdit) do begin
BoundsRect := Rect;
end;

Gorzej z szerokością... Na razie na szybko obsłużę onkeypress żeby ręcznie zmniejszać i zwiększać szerokość a jak będzie więcej czasu to coś pokombinuję.

0

Witaj,

Proponuje utworzyc sobie jakiegos Canvasa (np Bitmape) i tam ustawic czcionke taka, jaka jest ustawiona w memo, a nastepnie korzystajac z bmp.canvas.textwidth(memo.lines[0]) sprawdzac, ile zajmuje ktora linia a nastepnie brac maksimum sposrod dlugosci wszystkich linii.

bmp : TBitmap;
bmp := TBitmap.create();
bmp.canvas.font := memo.font;
int szer;
for i:= 0 to memo.lines.count-1 do
szer := max(szer, bmp.canvas.textwidth(memo.lines[i]);

bmp.Free();
// nie wiem, czy jest f-cja max, ale ja chyba umiesz sam napisac, jakby co ;p

0

OK, pisałem z pamięci, tak więc nie widziałem, że źli ludzie ukradli Canvasa Memo ;>

Ale po co kombinowanie z bitmapą? To trochę poronione. Wystarczy samego canvasa stworzyć. Tylko, jak się tworzy samego Canvasa, to trzeba mu dać coś, "po czym ma rysować", tak więc musisz przekazać handle'a za pomocą: GetWindowDC, czy GetDCHandle, czy coś takiego. Nie pamiętam, musiałbyś sprawdzić na msdn'ie, względnie w helpie.

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