Results 1 to 6 of 6

Thread: Letters tonen op Canvas

  1. #1

    Letters tonen op Canvas

    Hallo,

    Met onderstaande code worden de letters weergegeven. Als de regel : Label1.Canvas.Brush.Color := clAqua;
    niet aanwezig is dan worden de letters goed weergegeven. Wordt deze regel toegepast dan wordt de letter 'i' niet weergegeven.
    Is hier een oplossing voor of is het een bug in lazarus? Ik gebruik hier Lazarus 1.8.0 en 2.0rc3.

    Met een vriendelijke groet, Frans.


    Code:
     
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      Ch : String;
      X : Integer;
      I : Integer;
    
    begin
      X := 30;
      Label1.Font.Size := 14;
      Ch := 'abcdefghijklmnopqrstuvwxyz';
      For I := 1 to Length(Ch) do
      Begin
        Label1.Canvas.Brush.Color := clAqua;
        Label1.Canvas.TextOut(X,30,Ch[I]);
        X := X + Label1.Canvas.TextWidth(Ch[I]);
      end;
    end;

  2. #2
    Ik zie helemaal niets verschijnen op het canvas van Label1.
    Idem in Delphi 7.

    Painten op het canvas van From1 werkt gewoon (ook met clAqua).

    PS. Waarom geef je een string variabele de naam "Ch", beetje verwarrend in mijn ogen.

    Bart

  3. #3
    Bart,

    Programma aangepast zodat probleem beter zichtbaar wordt. Er treed nog een ander probleem op dat je om het zichtbaar te maken tweemaal de button moet aanklikken.

    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      Str : String;
      X : Integer;
      I : Integer;
    
    begin
      X := 30;
      Label1.Font.Size := 14;
      Label1.AutoSize := false;
      Label1.Height := 100;
      Label1.Align := alBottom;
    
      Str := 'abcdefghijklmnopqrstuvwxyz';         // dit gedeelte geeft het probleem van het niet laten zien van de letter 'i' 
      For I := 1 to Length(Str) do
      Begin
        Label1.Canvas.Brush.Color := clAqua;
        Label1.Canvas.TextOut(X,30,Str[I]);
        X := X + Label1.Canvas.TextWidth(Str[I]);
      end;
    
      X := 30;
      Str := 'abcdefghijklmnopqrstuvwxyz';
      For I := 1 to Length(Str) do
      Begin
        //Label1.Canvas.Brush.Color := clAqua;
        Label1.Canvas.Brush.Style := bsClear;     // <=== deze regel is noodzakelijk
        Label1.Canvas.TextOut(X,60,Str[I]);
        X := X + Label1.Canvas.TextWidth(Str[I]);
      end;
    
    end;

  4. #4
    Ik begrijp niet helemaal waarom je op het canvas van een TLabel probeert te schrijven. Al helemaal niet in een buttonckick.

    De TLabel.Canvas is helemaal niet van jou maar van TLabel om op te schrijven. Dat is ook de reden dat je twee keer moet klikken, omdat TLabel het canvas gewoon weer overschrijft.

    Als je zonodig wilt schrijven op het TLabel.Canvas moet je eigenlijk de TLabel.Paint afvangen (via inheritence) en het daar in doen.

    Of pak een werkelijke TCanvas die je neerzet waarop je gaat tekenen. Het tekenen op elke TComponent.Canvas kan weer ongedaan worden die de paint van het component.

  5. #5
    Rik,

    Dit is maar een test programma. In werkelijkheid maakt een deel van deze procedure deel uit van een component, welke is afgeleid van TLabel. En daar wordt wel de procedure Paint gebruikt.

    Ik ben er intussen achter dat Label1.Hieght, e.d. niet hier horen te staan. Deze heb ik in Form create gezet en daarmee was het dubbel klikken van de muis op de button verleden tijd. De oplossing van het probleem dat een bepaalde letter ( de 'i') niet zichtbaar was is opgelost door deze regel toe te voegen : Label1.Canvas.Brush.Style := bsClear;

    Probleem is opgelost en iedereen bedankt voor het meedenken.


    H.G. Frans

  6. #6
    Het is ook handig even uit te vogelen waarom die i niet goed afgedrukt wordt.
    Met jouw oplossing nu kun je dus niet in clAqua afdrukken, toch?

    Als je bijvoorbeeld dit probeert dan gaat het goed.
    Delphi Code:
    1. Str := 'abcdefghi jklmnopqrstuvwxyz';

    Dit komt omdat een gedeelte van de J 'over' de I afgedrukt wordt als jij X := X + Self.Canvas.TextWidth(Str[I]); doet.

    Volgens mij is TextWidth dan niet voldoende.
    Je ziet dat bijvoorbeeld ook als je For I := Length(Str) downto 1 do doet (dus omgekeerd).
    Dan zie je dat de K niet geheel afgedrukt wordt omdat de J 'eroverheen' zit.

    Name:  HpFhahQ.png
Views: 147
Size:  3.1 KB

    Met de bsClear zorg je ervoor dat je transparant afdrukt en de letters dus 'over elkaar' afgedrukt kunnen worden.

    Als je letters dus achter elkaar af wilt drukken alsof het één woord is dan kun je dit ook het beste als hele string in Canvas.TextOut doen.

    Ander leesvoer: https://en.wikipedia.org/wiki/Kerning

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
  •