Results 1 to 5 of 5

Thread: RMemo tekst overschrijven

  1. #1

    RMemo tekst overschrijven

    Hallo,

    Wat ik wil dat het eerste karakter van een woord een hoofdletter is. Er zijn twee problemen :

    1. van een ingetikt woord wordt na een spatie de laatste letter weggehaald;
    2. en de Temp_Tekst wordt correct weergegeven bij Label1.Caption maar niet in RMemo.

    De bedoeling is om de tekst uit Temp_Tekst op de juiste plaats in RMemo te krijgen maar dat werkt niet.


    Is er een oplossing voor beide problemen?

    met een hartelijke groet, Frans

    Code:
    procedure TForm1.RMemo1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      Temp_Tekst := Temp_Tekst + Chr(Key);
      If Key = 32 then
      begin
        Temp_Tekst := LowerCase(Temp_Tekst);
        Temp_Tekst[1] := UpCase(Temp_Tekst[1]);
        Label1.Caption := Temp_Tekst;
        RMemo1.SelStart := UTF8Length(PChar(RMemo1.Text), RMemo1.SelStart - 1);
        RMemo1.SelLength := UTF8Length(Temp_Tekst);
        RMemo1.SetRangeParams(RMemo1.SelStart, RMemo1.SelLength,[tmm_Styles, tmm_Color],'',0,clRed,[fsUnderLine],[]);
        Temp_Tekst := '';
      end;
    end;

  2. #2
    Je doet daar een SelStart - 1. Maar op moment van KeyDown is de Key nog niet verwerkt in de RMemo1.
    Dus je doet dan 1 character te weinig (resulterend in een verdwijnend character).
    Je werkt daar met een Temp_Tekst en dat gaat dus grandioos mis bij cursor toetsen.

    Een betere oplossing zou zijn om gewoon te controleren of je achter een spatie staat en dan de Key te forceren naar UpCase(Key).

    Maar ik heb eigenlijk het gevoel dat je hier helemaal verkeerd bezig bent.
    Het lijkt mij veel handiger om niet de key aan te passen bij het toetsten maar om CapsLock te manipuleren VOOR het moment van tikken.
    Zo kun je de CapsLock aanzetten wanneer je achter een spatie staat.
    De gebruiker heeft dan nog de mogelijkheid om CapsLock uit te zetten indien gewenst.
    Zo doet een virtueel keyboard op een mobiel het ook.

  3. #3
    Hallo allemaal,

    In onderstaande code werkt het redelijk om van de eerste letter van een zin een hoofdletter te maken. Er is echter een bezwaar de toets
    Caps Lock is niet meer te gebruiken. Is dat op te lossen?

    H.G. Frans

    Code:
    PROCEDURE aKeyDown(VAR Key: WORD);
    
      PROCEDURE SetCapsLock_(bOn: BOOLEAN);
      VAR
        KBState: TKeyboardState;
      BEGIN
        GetKeyboardState(KBState);
        KBState[VK_CAPITAL] := Ord(bOn);
        SetKeyboardState(KBState);
      END;
    
    BEGIN
      If Chr(Key) = #46 then Exit;
      IF (Chr(Key) = #190) then Sw := True;
      IF (Chr(Key) = #32) AND (Sw = True) THEN
      BEGIN
        SetCapsLock_(True);
        Sw := False;
        Exit;
      END;
      CASE Chr(Key) OF
        #13, #8:
        BEGIN
          SetCapsLock_(True);
          Sw := False;
        END
        ELSE
          SetCapsLock_(False);
      END;
    END;

  4. #4
    Hier zet jij de capslock aan op moment dat je een spatie tikt of enter. Ik heb al gezegd dat mij dat niet de handigste manier lijkt (omdat je best je cursor kunt verplaatsen).

    Ik zou bij elke wijziging van cursor kijken waar je je in de tekst bevindt en als dat achter een spatie, of begin van de regel is, dan caps lock aanzetten (gebruiker kan hem dan ook nog uitzetten). En dat is niet in keydown (want je kunt ook met de muis je cursor verplaatsen).

    Maar wat is het probleem nu?
    Waarin kun je de caps lock niet meer gebruiken?

  5. #5
    Hier het eind resultaat

    Code:
    VAR
      Form1: TForm1;
      SpatieSw: BOOLEAN = True;
      PuntSw  : BOOLEAN = True;     
    
    PROCEDURE Hoofdletter_in_Zin(Actie: STRING; VAR Key: CHAR);
    {
     Actie           Omschrijving
     -----------     -------------------------------------------------------
     AlleWoorden     Elk woord begint met een hoofdletter
     EersteWoord     Eerste woord begint met een hoofdletter
    
     Voorwaarden voor een Hoofdletter van elk woord
       - Test op spatie, als Key karakter gelijk is aan een Spatie (32)
         dan SpatieSw op True zetten en bij het volgende karakter
         weer op False zetten.
       - Test op Enter, als Key karakter gelijk is aan een Enter (13)
         dan SpatieSw op True zetten en bij het volgende karakter
         weer op False zetten.
    
     Voorwaarden voor een Hoofdletter aan het begin van elke zin
       - Test op een Punt (46) of Enter (13) dan wordt SpatieSw = True
         en PuntSw blijft False.
       - Test op Spatie en Enter als SpatieSw = True met als gevolg
         dat PuntSw = True. Daar bijde SpatieSw en PuntSw de waarde
         True hebben wordt er een Hoofdletter gezet aan het begin van een zin.
    
     Beide mogelijkheden kunnen worden toegepast in de procedure ...KeyPress(...)
     en natuurlijk ook worden uitgezet.
     Moet in het hoofdprogramma worden uitgevoerd.
    
    }
    BEGIN
      Actie := UpperCase(Actie);
      IF Actie = 'ALLEWOORDEN' THEN
      BEGIN
        IF SpatieSw = True THEN
        BEGIN
          Key := UpCase(Key);
          SpatieSw := False;
        END;
        IF (Ord(Key) = 32) OR (Ord(Key) = 13) THEN SpatieSw := True;
      END;
    
      IF Actie = 'EERSTEWOORD' THEN
      BEGIN
        IF (SpatieSw = True) AND (PuntSw = True) THEN
        BEGIN
          Key := UpCase(Key);
          SpatieSw := False;
          PuntSw := False;
        END;
        IF (Ord(Key) = 46) OR (Ord(Key) = 13) THEN
        BEGIN
          SpatieSw := True;
          PuntSw := False;
        END;
        IF (SpatieSw = True) AND ((Ord(Key) = 32) OR (Ord(Key) = 13)) THEN
          PuntSw := True;
      END;
    END;
    
    PROCEDURE TForm1.RMemo1KeyPress(Sender: TObject; VAR Key: CHAR);
    BEGIN
      Hoofdletter_in_Zin('eerstewoord',Key);
    END;

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
  •