Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Memo sa ograničenim brojem karaktera u liniji

[es] :: Pascal / Delphi / Kylix :: Memo sa ograničenim brojem karaktera u liniji

[ Pregleda: 1748 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

viking13
Aleksandar Milanovic
SBB
Novi Beograd

Član broj: 131741
Poruke: 190
*.sbb.co.yu.



Profil

icon Memo sa ograničenim brojem karaktera u liniji11.02.2008. u 16:44 - pre 197 meseci
Relativno hitna stvar.

Kako najlakše ograničiti broj karaktera u svakoj liniji memo-a?

Treba mi nešto što će da izgleda kao kad se kuca SMS poruka, odnosno da me posle određenog broja karaktera memo automatski prebaci na novu liniju, naravno da mi ne lomi reči, već da radi lomljenje iza space-a, zareza ili tačke.

Čisto radi testa uradio sam nešto ovako:

procedure TForm1.Memo1Change(Sender: TObject);
var
s, d: string;
begin
s := Memo1.Lines.Text;
while length(s) > 0 do
begin
if length(d) > 0 then
d := d + CRLF;
d := d + Copy(s, 1, 80);
Delete(s, 1, 80);
end;
Memo2.Lines.Text := d;
end;

Naravno ovo će lomi tekst gde stigne, ali sa još malo koda mogu da dobijem manje više ono što hoću.

Problem je što hoću da mi ovo radi u jednom Memou, a ne ovako.

Kako da izbegnem rekurzivno pozivanje OnChange, sem sa

Memo1.OnChange := nil;
Memo1.Lines.Text := d;
Memo1.OnChange := Memo1Change;

Takođe mi ne treba da mi kursor luta po memou.

Svaki predlog je dobrodošao.
viking ®
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Memo sa ograničenim brojem karaktera u liniji11.02.2008. u 18:42 - pre 197 meseci
> Treba mi nešto što će da izgleda kao kad se kuca SMS poruka, odnosno da me posle određenog broja karaktera memo automatski prebaci na
> novu liniju, naravno da mi ne lomi reči, već da radi lomljenje iza space-a, zareza ili tačke.

SMS editori u telefonima bi trebalo da vrše prelom na osnovu širine teksta ne broja karaktera. Tako se ponaša i TMemo ako se uključi WordWrap.

> Kako da izbegnem rekurzivno pozivanje OnChange, sem sa

Možeš pokušati da "pojedeš" EN_CHANGE poruke.

> Takođe mi ne treba da mi kursor luta po memou.

Sačuvaj trenutnu poziciju pre promene teksta i posle promene je vrati.

 
Odgovor na temu

viking13
Aleksandar Milanovic
SBB
Novi Beograd

Član broj: 131741
Poruke: 190
*.sbb.co.yu.



Profil

icon Re: Memo sa ograničenim brojem karaktera u liniji12.02.2008. u 09:24 - pre 197 meseci
Citat:
savkic: SMS editori u telefonima bi trebalo da vrše prelom na osnovu širine teksta ne broja karaktera. Tako se ponaša i TMemo ako se uključi WordWrap.


Bio sam ubeđen da to tako radi, makar na onim starijim telefonima.

U svakom slučaju, problem nema veze sa SMS-om i nephodno mi je da svaka linija ima isti maksimalan broj karaktera.

> Kako da izbegnem rekurzivno pozivanje OnChange, sem sa

Citat:
savkic:
Možeš pokušati da "pojedeš" EN_CHANGE poruke.


Kad pogledaš malo poruke, postane očigledno. :)

Citat:
savkic:
Sačuvaj trenutnu poziciju pre promene teksta i posle promene je vrati.


Ovde već ima problema, posebno kad se tekst reformatira.

Hvala u svakom slučaju.

viking ®
 
Odgovor na temu

Vojislav Mihailovic
Smed. Palanka

Član broj: 20436
Poruke: 12
77.46.242.*



Profil

icon Re: Memo sa ograničenim brojem karaktera u liniji13.02.2008. u 18:06 - pre 197 meseci
Primer sa 5 linija u kojima je dozvoljeno max 25 karaktera:

Code:
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
Var
  line, col: Integer;
begin
  With Sender As TMemo Do Begin
    line := Perform( EM_LINEFROMCHAR, SelStart, 0 );
    col  := SelStart - Perform(EM_LINEINDEX, line, 0 );
    If key = #8 Then Begin
      If (col = 0) and (line > 0) Then Begin
        If (Length(lines[line])+Length(lines[line-1])) > 25 Then
          Key := #0;
      End; 
    End 
    Else If key In [#13,#10] Then Begin
      If lines.count >= 5 Then Begin
        key := #0;
        If line = 4 Then
          SelStart := Perform( EM_LINEINDEX, line,0 )
        Else
          SelStart := Perform( EM_LINEINDEX, line+1,0 );
      End; 
    End 
    Else If Key >= ' ' Then Begin
      If Length( lines[line] ) >= 25 Then
        Key := #0;
    End;
  End; 
  If Key = #0 Then
    Beep;
end;




Code:
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  line, col: Integer;
begin
  If Key = VK_DELETE Then
    with Sender As TMemo do begin
      line := Perform( EM_LINEFROMCHAR, SelStart, 0 );
      col  := SelStart - Perform(EM_LINEINDEX, line, 0 );
      If col = Length( lines[line] ) Then
        If (line < 4) and ((Length(lines[line]) + Length(lines[line+1])) > 25)
        Then Begin
          key := 0;
          Beep
        End; 
    end;
end;
 
Odgovor na temu

viking13
Aleksandar Milanovic
SBB
Novi Beograd

Član broj: 131741
Poruke: 190
89.216.96.*



Profil

icon Re: Memo sa ograničenim brojem karaktera u liniji13.02.2008. u 22:56 - pre 197 meseci
Citat:
Vojislav MihailovicPrimer sa 5 linija u kojima je dozvoljeno max 25 karaktera:


Hvala, ali...

To sam našao pre nego što sam uopšte postavio pitanje. Ne odgovara mi kako to radi. Poenta je da sve radi bez obzira da li sam paste-ovao tekst, obrisao deo teksta ili sta već...

PlusMemo ima opciju da wrapuje tekst na tačno određenom karakteru, plus ima jako jednostavno farbanje paragrafa.

viking ®
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Memo sa ograničenim brojem karaktera u liniji

[ Pregleda: 1748 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.