Results 1 to 10 of 10

Thread: TStatusBar met twee regels tekst

  1. #1

    TStatusBar met twee regels tekst

    Is het mogelijk om in een statusbar twee regels neer te zetten. Ik update de statusbar regelmatig met tekst. Maar soms is de tekst langer dan een regel. Nu dacht ik, ik maak de hoogte van de statusbar dubbel zo hoog, dan breekt de tekst wel af. Maar de tekst centreert zich in hoogte . Dus dat lost niets op.

    Is dit wel mogelijk, of is een statusbar altijd maar een tekstregel hoog?

  2. #2

  3. #3
    Quote Originally Posted by mzwollo View Post
    Hartelijk dank, ik heb nu een status bar van twee regels hoog gemaakt. Vervolgens verschijnt tijdens het starten de tekst in de status bar.
    Vervolgens wil ik de tekst in de statusbar at runtime updaten maar dat lukt me nog niet. Ik heb de tekst in het voorbeeld, 'Hi Nijazi' en 'This is Line 2' vervangen door twee variabelen, Str1 en Str2. Maar als ik at runtime de twee strings wijzig wordt de tekst niet gewijzigd in de status bar. Eigenlijk moet
    Delphi Code:
    1. procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar;Panel: TStatusPanel; const Rect: TRect);
    weer opnieuw worden aangeroepen, denk ik, als ik de twee variabelen Str1 en Str2 at runtime heb gewijzigd, maar hoe doe ik dit ?

  4. #4
    Senior member mzwollo's Avatar
    Join Date
    Oct 2004
    Location
    Larserbos
    Posts
    155
    Door na het wijzigen van str1 en/of str2 repaint aan te roepen.
    Delphi Code:
    1. str1 := 'Dit is lijn 1';
    2. str2 := 'Dit is lijn 2';
    3. StatusBar1.Repaint;

  5. #5
    Meestal is dit beter, tenzij je heel hard direct een paint wilt forceren, voorbijgaand aan de standaard messaging daarvoor. Normaliter zou dat niet nodig moeten zijn.
    Code:
    StatusBar1.Invalidate;
    1+1=b

  6. #6
    Hallo mzwollo en GolezTrol,

    Beide oplossingen werken inderdaad. Bedankt voor de reactie. Maar nu loop ik nog tegen een ander probleempje aan.
    Ik heb dus twee lijnen in de status bar gedefinieerd.

    pDiversen.TextLine1 en
    pDiversen.TextLine2

    De status bar heeft 1 panel die de hoogte heeft van twee lijnen, Textline1 en textline2.

    Als er eerst en relatief korte tekstlijn wordt weergegeven voordat er tekst heeft gestaan dus bij het starten van het programma, wordt de tekst goed weergegeven.
    Echter, als er een lange tekst wordt weergegeven die de hele lengte van het statuspaneel vult en vervolgens er een kortere regel wordt weergegeven, blijft er rechts het restant van de lange regel staan. Nu dacht ik, dat kan toch geen probleem zijn, dan wis ik vooraf de regel.
    Maar dat lukt me niet.

    Ik heb het volgende geprobeerd, maar niets werkt.

    Delphi Code:
    1. StatusBar1.Panels[0].Text := '';
    Delphi Code:
    1. pDiversen.TextLine1 := '';
    2. StatusBar1.Invalidate;

    Hoe kan ik nu de twee regels of het hele status panel netjes wissen voordat ik weer tekst weergeef?
    Attached Thumbnails Attached Thumbnails Click image for larger version. 

Name:	Capture2.JPG 
Views:	126 
Size:	12.4 KB 
ID:	7760   Click image for larger version. 

Name:	Capture1.JPG 
Views:	104 
Size:	18.4 KB 
ID:	7761  

  7. #7
    Ahhhhh, opgelost.

    Misschien niet de netste methode maar ik heb het als volgt opgelost:
    Ik vul voordat de nieuwe tekst wordt ingevuld steeds de achtergrondkleur opnieuw in.

    Delphi Code:
    1. procedure TMainForm.StatusBar1DrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect);
    2. begin
    3.   begin
    4.   with StatusBar1.Canvas do
    5.     begin
    6.       StatusBar1.Canvas.Brush.Color := clBtnFace; // Toegevoegd
    7.       StatusBar1.Canvas.FillRect(Rect);            // Toegevoegd
    8.  
    9.       TextOut(Rect.left + 5, Rect.top + 2,  pDiversen.TextLine1);
    10.       TextOut(Rect.left + 5, Rect.top + 16, pDiversen.TextLine2);
    11.  
    12.     end;
    13.   end;
    14. end;

  8. #8
    Lijkt me een niet onredelijke manier om het op te lossen. Je tekent tenslotte steeds op hetzelfde canvas, dus is het logisch dat je eerst moet uitgummen wat er staat.

    Overigens, als je toch zelf het panel tekent, dan kan je eventueel ook de gewone text van de statusbar nemen, de string splitten op enters, en de afzonderlijke regels tekenen zoals je nu doet. Je hebt dan geen losse en geen losse variabelen nodig voor het zetten van de tekst. Je regelt alleen het tekenen van de tekst, 'netjes' binnen het event van de statusbalk, bijna alsof je een eigen TMultiLineStatusBar zou hebben gemaakt.
    1+1=b

  9. #9
    Hallo GolezTrol,

    Dank voor je reactie. Ik moest even goed nadenken wat je precies bedoelde, maar ik hoop dat ik het goed heb begrepen.
    Ik heb het nu als volgt aangepast:

    Delphi Code:
    1. procedure TMainForm.StatusBarDrawPanel(StatusBar: TStatusBar; Panel: TStatusPanel; const Rect: TRect);
    2. var
    3. RectForText : TRect;
    4. begin
    5.   with StatusBar.Canvas do
    6.     begin
    7.       // StatusBar.Canvas.Brush.Color := clBtnFace;
    8.       // StatusBar.Canvas.FillRect(Rect);
    9.  
    10.       //  TextOut(Rect.left + 5, Rect.top + 2,  pDiversen.TextLine1);
    11.       //  TextOut(Rect.left + 5, Rect.top + 22, pDiversen.TextLine2);
    12.  
    13.       StatusBar.Canvas.Font.Color := clGreen;
    14.       RectForText                 := Rect;
    15.       StatusBar.Canvas.FillRect(RectForText);
    16.       DrawText(StatusBar.Canvas.Handle, PChar(Panel.Text), -1, RectForText, DT_WORDBREAK or DT_TOP or DT_LEFT);
    17.     end;
    18. end;

    En ik roep nu gewoon de StatusBar als volgt aan:

    Delphi Code:
    1. if strtoFloat(ePresureDifference.Text) <= (PD[IndexLaagsteWaarde]) then
    2.         begin
    3.          aStr := aStr + ' The Meassurred Presure Difference [' + ePresureDifference.Text + '] is lower than the minimum required Pressure Difference [' + floattostr((PD[IndexLaagsteWaarde]));
    4.          aStr := aStr + ']. Adjust the balancing valve to achieve the Minimum Pressure Difference.';
    5.          bStr := 'Additional adjustment is required. The system water flow is NOT balanced. The Meassurred Presure Difference [' + ePresureDifference.Text + '] is lower than the minimum required Pressure Difference [' + floattostr((PD[IndexLaagsteWaarde])) + ']';
    6.          bStr :=  bStr + ' Adjust the balancing valve to achieve the Minimum Pressure Difference.';
    7.          StatusBar.Panels[0].Text := bStr;
    8.  
    9.          pDiversen.PressureBalanced    := false;
    10.          ePresureDifference.Font.Color := clRed;
    11.         end else
    12.         begin
    13.           pDiversen.PressureBalanced    := true;
    14.           ePresureDifference.Font.Color := clWindowText;
    15.         end;
    16.  
    17.         InformeerGebruiker(aStr, mtWarning, [mbOK], [mbOK]);
    18.         pDiversen.Balanced := false;
    19.        end;

    Het aanroepen van de status bar is nu ook handiger door:

    Delphi Code:
    1. StatusBar.Panels[0].Text := bStr;
    in plaats van:
    Delphi Code:
    1. pDiversen.Str1 := 'Enter the water temperature in degrees Celcius.';
    2. pDiversen.Str2 := 'Enter the water temperature in degrees Celcius.';
    3. StatusBar1.Invalidate;

    En met de opties van DrawText kun je aangeven of de StatusBar 1 lijn moet worden of multiLine. Tevens kun je aangeven of de regels automatisch aan het eind moeten worden afgebroken.

    Dank,

    Johan

  10. #10
    Exact wat ik bedoelde. Netjes
    1+1=b

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
  •