Results 1 to 4 of 4

Thread: Hoogte bepalen van tekst in een afbeelding.

  1. #1
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747

    Hoogte bepalen van tekst in een afbeelding.

    Ik probeer een soort messagebox te maken, waardoor de hoogte van een image bepaald wordt door de ingevoerde tekst. Ik probeer de hoogte te bepalen van de tekst. Maar de tekst is te lang en wordt d.m.v. TextRect() in de afbeelding geplaatst. Met de textformat() wordt de regel afgebroken en geplaatst op de volgende regel. Ik probeer met de functie createballoon() de teksthoogte te bepalen, maar die komt altijd terug met een vaste waarde.

    Het enige wat ik op het formulier heb geplaatst is een scrollbox, panel, button en een memoveld.

    Kan het wel wat ik graag zal willen. Met HTML en TABLE settings wordt de hoogte van de cel bepaald door de tekst.

    Delphi Code:
    1. procedure TForm3.Button1Click(Sender: TObject);
    2. var TmpImg : TImage;
    3.     Rect   : TRect;
    4.     Textstyle : TTextFormat;
    5.     TekstHoogte : integer;
    6. begin
    7.   MyTekst := memo1.lines.Text;
    8.   TmpImg := TImage.Create(Self);
    9.   TmpImg.Parent := ScrollBox1;
    10.   TmpImg.Align := alTop;
    11.   Rect := TmpImg.ClientRect;
    12.   TekstHoogte := createballoon(MyTekst,Rect);
    13.   Rect.Left := Rect.Left + 7;
    14.   Rect.Top := Rect.Top + 7;
    15.   Rect.Width := Rect.Width - 10;
    16.   TmpImg.Canvas.Brush.Color := clYellow;
    17.   TmpImg.Canvas.Rectangle(5,5,scrollbox1.ClientWidth - 5, Teksthoogte + 5);
    18.   TextStyle := [tfWordBreak];
    19.   TmpImg.Canvas.TextRect(Rect,MyTekst,TextStyle);
    20.   TmpImg.Height := TmpImg.Canvas.TextHeight(MyTekst) + 50;
    21.   memo1.lines.clear;
    22. end;
    23.  
    24.  
    25. function TForm3.createballoon(var aTekst : string; var aRect : TRect) : integer;
    26. var Img : TImage;
    27. begin
    28.   Img := TImage.Create(nil);
    29.   try
    30.     Img.Top := 0;
    31.     Img.Left := 0;
    32.     Img.Width := aRect.Width;
    33.     Img.Height := 1000;
    34.     Img.Canvas.TextRect(aRect,aTekst,[tfWordBreak]);
    35.     result := Img.Canvas.TextHeight(aTekst);
    36.   finally
    37.      Img.free;
    38.   end;
    39. end;
    Delphi is great. Lazarus is more powerfull

  2. #2
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Oke. Ik ben al iets verder. Ik heb iets aangepast en werkt bijna zoals het moet.
    Dit is de aangepaste code:
    Delphi Code:
    1. procedure TForm3.Button1Click(Sender: TObject);
    2. var TmpImg : TImage;
    3.     Rect   : TRect;
    4.     Textstyle : TTextFormat;
    5.     MySize    : TSize;
    6.     TekstHoogte : integer;
    7. begin
    8.   MyTekst := memo1.lines.Text;
    9.   TmpImg := TImage.Create(Self);
    10.   TmpImg.Parent := ScrollBox1;
    11.   TmpImg.Align := alTop;
    12.   Rect := TmpImg.ClientRect;
    13.   TekstHoogte := createballoon(MyTekst,Rect);
    14.   TmpImg.Height := TekstHoogte + 10;
    15.   Rect.Left := Rect.Left + 7;
    16.   Rect.Top := Rect.Top + 7;
    17.   Rect.Width := Rect.Width - 10;
    18.   TmpImg.Canvas.Brush.Color := clYellow;
    19.   TmpImg.Canvas.Rectangle(5,5,scrollbox1.ClientWidth - 5, Teksthoogte + 5);
    20.   Rect.Height := TekstHoogte;
    21.   TextStyle := [tfWordBreak];
    22.   TmpImg.Canvas.TextRect(Rect,MyTekst,TextStyle);
    23.   memo1.lines.clear;
    24. end;
    25.  
    26.  
    27. function TForm3.createballoon(var aTekst : string; var aRect : TRect) : integer;
    28. var Img : TImage;
    29.     pxLengte, pxHoogte : integer;
    30.     aantallijnen : integer;
    31. begin
    32.   Img := TImage.Create(nil);
    33.   try
    34.     Img.Top := 0;
    35.     Img.Left := 0;
    36.     Img.Width := aRect.Width;
    37.     Img.Height := 1000;
    38.     Img.Canvas.TextRect(aRect,aTekst,[tfWordBreak]);
    39.     pxLengte := Img.Canvas.TextWidth(aTekst);
    40.     pxHoogte := Img.Canvas.TextHeight(aTekst);
    41.     aantallijnen := pxlengte div aRect.Width + 1;
    42.     result := aantallijnen * pxHoogte + 20
    43.   finally
    44.      Img.free;
    45.   end;
    46. end;
    Maar het lijkt erop dat hier geen rekening wordt gehouden met de lengte van de regel als er eerder een return wordt gegeven.
    Delphi is great. Lazarus is more powerfull

  3. #3
    Je kan ook DrawText gebruiken met DT_CALCRECT, deze geeft dan netjes een TRect terug met de afmetingen.. Een goed voorbeeld kan je hier vinden.

  4. #4
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Dank je Reidinga. Is een heel goed voorbeeld.
    Werkt goed. Maar ik ga deze principe een beetje aanpassen, zodat ik nog extra info kwijt kan en e.v.t. de tekst kan selecteren als reply.
    Delphi is great. Lazarus is more powerfull

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •