Results 1 to 8 of 8

Thread: StringGrid1 laat inhoud cellen zien op Laptop maar niet op Tablet

  1. #1

    StringGrid1 laat inhoud cellen zien op Laptop maar niet op Tablet

    Hallo allemaal,

    Ik draai op de laptop een programma dat goed werkt. De tekst in de Cellen van StringGrid1 is goed leesbaar.
    De StringGrid1 staat op een Panel en deze heeft als achtergrond kleur : clLime.

    Vervolgens start ik het zelfde programma
    op een Tablet (Microsoft) en dan is de tekst in StringGrid1 niet zichtbaar. Beide draaien op Windows 10

    Als ik DrawCell niet gebruik blijft het probleem bestaan.
    Wat kan hier de oorzaak van zijn en hoe los je dit op?

    Met een vriendelijk groet, Frans.

    Code:
    procedure Tafasie_tegenstelling_uitvoering_frm.
    StringGrid1DrawCell(Sender: TObject; aCol, aRow: integer; aRect: TRect;
      aState: TGridDrawState);
    
    begin
      if (gdSelected in aState) then
      begin
        with TStringGrid(Sender), Canvas do
        begin
          Font.Name := 'SEGOE UI';
          Brush.Color := $00E9AF7C;
          Pen.Color := $00C08000;
          Pen.Width := 3;
          FillRect(ARect);
          Font.Color := clRed;
          Font.Size := 18;
          Rectangle(ARect.Left + 2, ARect.Top + 1, ARect.Right - 2, ARect.Bottom - 2);
          TextRect(ARect, ARect.Left + 10, ARect.Top + 2, Cells[aCol, aRow]);
        end;
      end
      else
      begin
        StringGrid1.Canvas.Font.Name := 'SEGOE UI';
        StringGrid1.Canvas.Font.Color := clBlack;
        StringGrid1.Canvas.Pen.Style := psClear;
        StringGrid1.Canvas.Rectangle(ARect.Left + 2, ARect.Top + 1,
          ARect.Right - 2, ARect.Bottom - 2);
        StringGrid1.Canvas.Font.Color := clGreen;
        StringGrid1.Canvas.Font.Size := 18;
        StringGrid1.Canvas.TextOut(ARect.Left + 10, ARect.Top + 2,
          StringGrid1.Cells[aCol, aRow]);//HStr);
      end;
    end;

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Welke Windows versie draait er op de tablet?

    Ik heb al jaren geen Windows tablet meer in de kast liggen, dus kan het niet testen, maar het eerste dat ik na zou kijken is hoe scaling staat ingesteld.
    Indien deze > 100% is, dan eens proberen op 100%
    TMemoryLeak.Create(Nil);

  3. #3
    Quote Originally Posted by Dubbeld View Post
    Als ik DrawCell niet gebruik blijft het probleem bestaan.
    Wat kan hier de oorzaak van zijn en hoe los je dit op?
    Dan zal het probleem dus wel niet in DrawCell zitten.

    Ik zie daar wel dat je de kleur van de font op groen wil zetten. Heb je dat ook in de object inspector gedaan. Want groen op lime zal misschien niet op alle beeldschermen even goed overkomen. Zeker op laptopschermen wil dat nog wel eens afwijken.

    Wat gebeurd er als je gewoon een witte achtergrond met zwarte tekst instelt?

  4. #4
    Het probleem zat niet in boven getoonte procedure. Dat er voor een kleur clLime is toegepast was alleen maar om te testen, moet clBlack
    Het probleem zat in StringGrid1.ColWidths[0] := 0. Deze stond in ...FormCreate. Na verplaatsing naar ...FormActive is het probleem verholpen. Er is nu een andere vraag wanneer zet je iets in ...FormCreate zet en wanneer in ...FormActive?

    H.G. Frans

  5. #5
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Hahaha, altijd leuk dit soort problemen: bedankt voor de terugkoppeling!

    Mijn regel is altijd om in de constructor (en ook de OnFormCreate) alleen zaken te initialiseren, dus het aanmaken van een stringlistje, het default zetten van een property, ... dat soort werk; geen visuele zaken en ook geen zaken die kunnen falen of veel tijd kosten (want dan denkt de gebruiker dat het programma nog niet opgestart is en start hij het nogmaals... en nogmaals, en... draait je programma zes keer).

    Alle andere zaken gaan ergens anders, afhankelijk van wat er moet gebeuren.
    OnActivate en OnShow zijn doorgaans niet geschikt, omdat deze meermaals aangeroepen kunnen worden (bijvoorbeeld als je een form minimized en weer terughaalt), maar dat zou je kunnen ondervangen door een "RunOnce"-variabele bij te houden:
    Delphi Code:
    1. type
    2.   TMyForm = class(TForm)
    3.   // BlahBlah
    4.   private
    5.     FRunOnce: Boolean;
    6.   // BlahBlah
    7.   end;
    8.  
    9. implementation
    10.  
    11. procedure TMyForm.FormCreate(Sender: TObject);
    12. begin
    13.   FRunOnce := False;
    14. end;
    15.  
    16. procedure TMyForm.FormActivate(Sender: TObject);
    17. begin
    18.   if FRunOnce then
    19.     Exit;
    20.   FRunOnce := True;
    21.   Label1.Caption := 'Deze caption wordt maar een keer gezet';
    22. end;

    Het nadeel van deze oplossing (of bijvoorbeeld het gebruik van OnFormShow) is echter dat deze events worden aangeroepen voordat de form (althans: bij Delphi) daadwerkelijk getoond wordt en da's eigenlijk te vroeg bij tekenzaken.
    Dit kun je oplossen door gebruik te maken van, wat ik noem, een eenmalige "Start-up"-message:
    Delphi Code:
    1. const
    2.   PM_STARTUP = WM_USER + 1234;
    3.  
    4. type
    5.   TMyForm = class(TForm)
    6.   // BlahBlah
    7.   private // of protected
    8.     procedure PMStartUp(var AMsg: TMessage); message PM_STARTUP;
    9.   // BlahBlah
    10.   end;
    11.  
    12. implementation
    13.  
    14. procedure TMyForm.FormCreate(Sender: TObject);
    15. begin
    16.   // Stel je andere zaken in en als allerlaatste:
    17.   PostMessage(Handle, PM_STARTUP, 0, 0);
    18. end;
    19.  
    20. procedure TMyForm.PMStartUp(var AMsg: TMessage);
    21. begin
    22.   MyIngewikkeldeGrid.VulMetTekeningen; // <=== Je code die pas uitgevoerd moet worden nadat je form zichtbaar is en niet ervoor
    23. end;
    TMemoryLeak.Create(Nil);

  6. #6
    Quote Originally Posted by VideoRipper View Post
    en ook geen zaken die kunnen falen of veel tijd kosten (want dan denkt de gebruiker dat het programma nog niet opgestart is en start hij het nogmaals... en nogmaals, en... draait je programma zes keer).
    Hadden we daar niet het 'Splashscreen' voor? Iets met 'Wilt u even wachten ... ?'.
    Dus even een klein onschuldig form openen, wachten tot het andere gereed is en het onschuldig form om zeep helpen om het gewenste form te laten zien.

  7. #7
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Een splashscreen? Dat is zo jaren '90...

    Nee hoor, dat kan natuurlijk ook en het hangt ook helemaal van de situatie af waarin je uit je mogelijkheden kiest.

    Je hebt ook ongeduldige gebruikers die al ín je programma zitten en dan form X openen en als er dan binnen 0.5 seconden niets gebeurd, dan raken ze in paniek.
    Als je ze dan gewoon alvast het form laat zien, dan weten ze in ieder geval dat hun actie effect heeft gehad.

    De alternatieve oplossing, die ik werkelijk bij ieder bedrijf voorbij heb zien komen, (een timertje op 1 seconde zetten, vooral gebruikt op formpjes met alleen een progress bar) vind ik persoonlijk zo knullig, dat ik de voorkeur geef aan een PostMessage; dan weet ik zeker dat het bericht pas afgehandeld wordt wanneer alle andere berichten aan de beurt zijn geweest.
    Last edited by VideoRipper; 13-Aug-21 at 18:41.
    TMemoryLeak.Create(Nil);

  8. #8
    Member Duiker's Avatar
    Join Date
    May 2020
    Location
    Hamont-Achel (Belgie), Pattaya (Thailand)
    Posts
    55
    Hmm, dat had ik dus mooi met een timertje opgelost. Maar nu zie ik dus dat dat ook anders kan. Thanks!

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
  •