Page 1 of 4 1 2 3 ... LastLast
Results 1 to 15 of 46

Thread: function result : TRect

  1. #1
    Senior Member SaintPier's Avatar
    Join Date
    Nov 2010
    Location
    Etten-Leur
    Posts
    844

    function result : TRect

    Hoi Mensen,

    Ik ben nieuw met Lazarus.
    Ik heb een Delphi unit die ik wil gebruiken in Lazarus.
    Delphi Code:
    1. function TMyHintWindow.CalcHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect;
    2. var
    3.     vLineBreaks :Integer;
    4.     xx          :Integer;
    5.     LongestStr  :string;
    6. begin
    7.   Canvas.Font.Name := SingletonHintTeksten.FontName;
    8.   Canvas.Font.Size := SingletonHintTeksten.FontSize;
    9.   xx:=0;
    10.   LongestStr:=LongestString(AHint);
    11.   vLineBreaks:=Occurrences(sLineBreak,AHint);
    12.   if SingletonHintTeksten.ShowTitle then
    13.     begin
    14.       Result := Rect(0,0,Canvas.TextWidth(LongestStr),((vLineBreaks+2)*Canvas.TextHeight(AHint))+10)  // +2 : 1 extra voor de kop en 1 extra omdat bij 1 enter er twee regels bestaan.
    15.     end
    16.   else
    17.     begin
    18.       Result := Rect(0,0,Canvas.TextWidth(LongestStr),((vLineBreaks+1)*Canvas.TextHeight(AHint))+5)  // +1 : 1 extra omdat bij 1 enter er twee regels bestaan.
    19.     end;
    20. end;

    Bij regel 14 wordt na een build devolgende melding gegeven:
    Code:
     
    F:\lazarus\lcl\uhintteksten.pp(77,23) Fatal: Syntax error, ")" expected but "," found.
    De cursor staat dan op de komma achter de eerste 0 (nul).
    Als ik CTRL-SHIFT-SPACE indruk, staat er dat ik tussen de haakjes inderdaad Left, Top, Right, Bottom moet opgeven.
    Wat doe ik fout?

    Ter aanvulling:
    vLineBreaks = Het aantal linebreaks in de hint tekst.
    LongestString = De langste regel in de hint tekst. Die gebruik ik om de breedte van de hint te bepalen.
    Carpe Diem !
    (Horatius)

  2. #2
    Even een wilde gok.
    je gebruikt Windows in de uses clause, en Windows.Rect is een type (dus Rect(iets) is een typecast)?

    Ctrl+Click eens op Rect en kijk waar je uitkomt?

    Bart

  3. #3
    Senior Member SaintPier's Avatar
    Join Date
    Nov 2010
    Location
    Etten-Leur
    Posts
    844
    Quote Originally Posted by Bart B View Post
    Ctrl+Click eens op Rect en kijk waar je uitkomt?

    Bart
    Dan opent struct.inc.
    Code:
         RECT = record
              case Integer of
                 0: (Left,Top,Right,Bottom : Longint);
                 1: (TopLeft,BottomRight : TPoint);
    De unit uHintTeksten is gemaakt in D2010.
    Ik wilde de unit in Lazarus gebruiken, maar dat is minder simpel dan gedacht begrijp ik.
    De Textformat tfCenter wordt ook niet herkend.
    Ik ga maar eens op zoek naar wat voorbeelden en uitleg.
    Bedankt in ieder geval.
    Carpe Diem !
    (Horatius)

  4. #4
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    En daar zit je probleem (bij het verhaal met Rect).

    In Delphi is TRect een record (identiek aan die RECT record uit struct.inc) en is Rect in Delphi
    een functie waar je Left/Top/Right/Bottom instopt en waar een TRect uitkomt.

    Je zou deze functie zelf kunnen schrijven (als Lazarus deze nog niet kent) als:
    Delphi Code:
    1. Function Rect(ALeft, ATop, ARight, ABottom : Integer) : TRect;
    2. Begin
    3.   Result.Left := ALeft;
    4.   Result.Top := ATop;
    5.   Result.Right := ARight;
    6.   Result.Bottom := ABottom;
    7. End;
    Of regel 14 herschrijven naar:
    Delphi Code:
    1. Begin
    2.   Result.Left := 0;
    3.   Result.Top  := 0;
    4.   Result.Right := Canvas.TextWidth(LongestStr) ;
    5.   Result.Bottom := ((vLineBreaks+2)*Canvas.TextHeight(AHint))+10);
    6. End;
    Vergeet niet dat regel 18 dan ook herschreven moet worden.

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  5. #5
    Ik denk wel dat Bart op het juiste spoor zit.
    Heb je nu wel of geen Windows in je uses staan?
    (en op welke positie, dus hoe ziet de hele uses er uit?)

    Zie hier over hetzelfde probleem:
    http://forum.lazarus.freepascal.org/...p?topic=5383.0

    Je ziet aan het feit dat je in struct.inc terecht komt met Ctrl+Enter dat de RECT geen functie is.

    Zorg ervoor dat de module die WEL "function Rect" heeft als laatste in je uses staat.

    "Make sure that Types and Classes come after Windows in the uses clause."


    Bij lazarus staat "function Rect" in de Classes. Zorg dus dat die achteraan staat in je Uses.
    http://lazarus-ccr.sourceforge.net/d...sses/rect.html

  6. #6
    Senior Member SaintPier's Avatar
    Join Date
    Nov 2010
    Location
    Etten-Leur
    Posts
    844
    Quote Originally Posted by rvk View Post
    Ik denk wel dat Bart op het juiste spoor zit.
    Heb je nu wel of geen Windows in je uses staan?
    (en op welke positie, dus hoe ziet de hele uses er uit?)
    Ik had de uses zo staan:
    Code:
    uses
      Graphics, Controls, Classes, StrUtils, Types, Windows, Forms;
    Inmiddels heb ik de Windows v????r Classes en Types gezet, en gaat het wel goed.
    Er komt verderop in de code tijdens debuggen nog deze foutmelding naar boven.
    Code:
    Project project1 raises exception class 'External: SIGSEGV'.
    At address 403A40
    Zoals ik al zei zal ik Lazarus beter moeten leren kennen.
    Ik was er even in mijn naïviteit vanuit gegaan dat het hetzelfde zou zijn als Delphi.
    Carpe Diem !
    (Horatius)

  7. #7
    Quote Originally Posted by SaintPier View Post
    Er komt verderop in de code tijdens debuggen nog deze foutmelding naar boven.
    Code:
    Project project1 raises exception class 'External: SIGSEGV'.
    At address 403A40
    Daar is heel wat over te vinden:
    https://www.google.com/search?q=exce...hrome&ie=UTF-8

    Dan zou het wel handig zijn als je aan kunt geven waar je de foutmelding krijgt tijdens het debuggen.

  8. #8
    Senior Member SaintPier's Avatar
    Join Date
    Nov 2010
    Location
    Etten-Leur
    Posts
    844
    Quote Originally Posted by rvk View Post
    Dan zou het wel handig zijn als je aan kunt geven waar je de foutmelding krijgt tijdens het debuggen.
    Daar heb je helemaal gelijk in.
    Het was maar even een melding.
    Ik ga eerst maar eens zelf spitten voordat ik de hele code hier upload en dan een pasklare oplossing krijg.
    Daar leer ik ook meer van.
    Als ik er niet uitkom, wat heel waarschijnlijk is , ga ik in dit draadje verder.
    Eerst ff googelen en jouw linkjes bekijken.
    Bedankt.
    Peter.
    Carpe Diem !
    (Horatius)

  9. #9
    Senior Member SaintPier's Avatar
    Join Date
    Nov 2010
    Location
    Etten-Leur
    Posts
    844
    Ik kom er niet uit.
    In uHintTeksten staat

    Delphi Code:
    1. Type
    2.   TMyHintWindow = Class (THintWindow)
    3.   constructor Create (AOwner: TComponent);override;
    4.   protected
    5.     procedure Paint; override;
    6.   public
    7.     function CalcHintRect(MaxWidth: Integer; const AHint: string; AData: Pointer): TRect; override;
    8.     function Occurrences(const Substring, cText: string): integer;
    9.     function LongestString(Substr:string):string;
    10. end;

    In Unit1 onder de click event van een knop staat
    Delphi Code:
    1. Application.ShowHint := false;
    2.   HintWindowClass := TMyHintWindow;
    3.   Application.ShowHint := True;
    4.   Application.HintPause := 500;
    5.   Application.HintHidePause := 10000;
    6.  
    7.   SingletonHintTeksten.FontName:='Comic Sans MS';
    8.   SingletonHintTeksten.Titel:='Hint Titel';
    9.   SingletonHintTeksten.TitleColor:=clMaroon;
    10.   SingletonHintTeksten.TitletxtColor:=clYellow;
    11.   SingletonHintTeksten.HintColor:=clSilver;
    12.   SingletonHintTeksten.HinttxtColor:=clMaroon;

    Zodra ik met debuggen kom op de eerste regel met SingletonHintTeksten verschijnt de foutmelding
    Code:
    Project project1 raises exception class 'External: SIGSEGV'.
    At address
    Het address wil nog wel eens verschillen.
    Zet ik de muiscursor op SingletonHintTeksten dan geeft hij aan dat hij NILL is.

    Als ik in uHintTeksten een breakpoint zet in de constructor
    Delphi Code:
    1. constructor TMyHintWindow.Create(AOwner: TComponent);
    2. begin
    3.   Inherited Create (AOwner);
    4.   if not Assigned(SingletonHintTeksten) then
    5.     SingletonHintTeksten := THintTeksten.Create;
    6. end;
    dan komt de debugger daar niet.
    Dus TMyHintWindow wordt niet gecreate. (Is dit nog nederlands?)

    Ik zie door het bos(pop) de bomen niet meer.
    De bestanden heb ik even toegevoegd.
    BVD
    Peter.
    Attached Files Attached Files
    Carpe Diem !
    (Horatius)

  10. #10
    Code:
      HintWindowClass := TMyHintWindow;
    Deze toekenning triggered toch niet een create?

    Ik zie dus nergens, voordat jij die regels met SingletonHintTeksten gebruikt, een .Create van HintWindowClass (of TMyHintWindow)
    Dus blijft SingletonHintTeksten nil.

  11. #11
    Senior Member SaintPier's Avatar
    Join Date
    Nov 2010
    Location
    Etten-Leur
    Posts
    844
    Quote Originally Posted by rvk View Post
    Code:
      HintWindowClass := TMyHintWindow;
    Deze toekenning triggered toch niet een create?

    Ik zie dus nergens, voordat jij die regels met SingletonHintTeksten gebruikt, een .Create van HintWindowClass (of TMyHintWindow)
    Dus blijft SingletonHintTeksten nil.
    Ik neem het direct van je aan.
    Punt is, dat ik deze uHintTeksten ooit ook met hulp van NLDelphi gemaakt heb in D2010 waar het gewoon werkt.
    Dus daarom begrijp ik niet wat ik fout doe.
    Carpe Diem !
    (Horatius)

  12. #12
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    SIGSEGV is Unix speak voor wat GPF of "Acces Violation" is onder Windows.

  13. #13
    Ik denk dat er intern iets "anders" gedaan wordt in Lazarus.

    Ik denk dat (gelezen in de Delphi Help) de HintwindowClass .created wordt als de Hint zichtbaar gemaakt wordt. Dat zou in Delphi best al kunnen gebeuren bij de ShowHint := True; en bij Lazarus bijvoorbeeld pas bij het zichtbaar maken van de Hint.

    Je kunt proberen de Create naar de Button.event te halen want dan werkt het wel:

    Code:
      if not Assigned(SingletonHintTeksten) then
        SingletonHintTeksten := THintTeksten.Create;
      SingletonHintTeksten.FontName:='Comic Sans MS';
      SingletonHintTeksten.Titel:='Hint Titel';
      SingletonHintTeksten.TitleColor:=clMaroon;
      SingletonHintTeksten.TitletxtColor:=clYellow;
      SingletonHintTeksten.HintColor:=clSilver;
      SingletonHintTeksten.HinttxtColor:=clMaroon;
    Pffff. Lang geleden dat ik Lazarus opgestart (en gedebuged heb).

    Overigens stond bij mij de ShowHint van de Form nog uit.
    Dus ik moest er ook even het volgende van maken:

    Delphi Code:
    1. procedure TForm1.FormCreate(Sender: TObject);
    2. begin
    3.   Self.ShowHint:= true;
    4.   Self.Hint:='Hint regel 1'+sLineBreak+'Hint regel 2'+sLineBreak+'Hint regel 000000003';
    5. end;


    Edit: Yep. Bij Lazarus wordt de Create van je HintClass pas uitgevoerd bij het WEERGEVEN van de Hint.

    Edit2: Net in de source gekeken van Lazarus en Delphi.
    Bij delphi wordt je FHintwindow al bij ShowHint:=true aangemaakt en bij Lazarus pas bij er aanmaken en WEERGEVEN van de Hint (ShowHintWindow)
    Last edited by rvk; 04-Jul-13 at 20:43.

  14. #14
    Senior Member SaintPier's Avatar
    Join Date
    Nov 2010
    Location
    Etten-Leur
    Posts
    844
    Quote Originally Posted by rvk View Post
    Overigens stond bij mij de ShowHint van de Form nog uit.
    Dat is vreemd, want die stond bij mij echt op true.
    Code:
    object Form1: TForm1
      Left = 1977
      Height = 240
      Top = 466
      Width = 320
      Caption = 'Form1'
      ClientHeight = 240
      ClientWidth = 320
      Color = clGreen
      OnCreate = FormCreate
      ShowHint = True
      LCLVersion = '1.0.10.0'
      object Button1: TButton
        Left = 16
        Height = 25
        Top = 16
        Width = 75
        Caption = 'Button1'
        Color = 16512
        OnClick = Button1Click
        TabOrder = 0
      end
    end
    OK.
    Het lukt nu inderdaad om de hint weer te geven, maar niet zoals hij het zou moeten doen. Zie screenshot.
    Ik stoei weer ff verder.
    Bedankt zover.
    Greets,
    Peter.
    Attached Images Attached Images  
    Carpe Diem !
    (Horatius)

  15. #15
    Quote Originally Posted by SaintPier View Post
    Dat is vreemd, want die stond bij mij echt op true.
    Ja, ik zat een beetje met de form te klungelen waardoor die ShowHint weggevallen was. (te lang niet met Lazarus gewerkt )

    Quote Originally Posted by SaintPier View Post
    ... maar niet zoals hij het zou moeten doen. Zie screenshot.
    Ik zou in ieder geval je "inherited" uit je Paint-procedure weg halen want die zorgt voor die dubbele (oud en nieuw) hint. Verder gaat het nog mis met het berekenen van de TRect want die is elke keer anders.

Page 1 of 4 1 2 3 ... LastLast

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
  •