Newsgroup: it.comp.lang.delphi
Titolo: Formattazione di un campo...

Approfitto della Vostra esperienza....
E' possibile di un campo convertire tutte le inziali in maiuscolo?
Esempio : pinco pallino via roma
Vorrei:  Pinco Pallino Via Roma.
ed inoltre...
e' possibile addirittura farlo con un edit mask ? Ho visto che con Database
Desktop c'e' una maschera che consente di farlo, ma in Delphi non riesco.
Grazie.
Nicola

Vorrei:  Pinco Pallino Via Roma.
function AllWordsInUpperCase(W: String): String;
var
  B: Boolean;
  I: Integer;
begin
  B := true;
  Result := W;
  for I := 1 to Length(Result) do
  begin
    if Result[I] = ' ' then B := true
    else
    begin
      if (B) then Result[I] := UpCase(Result[I]);
      B := false;
    end;
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := AllWordsInUpperCase(Edit1.Text);
end;
-- 
The Follet

end;
E si può fare anche senza boolean :)
function AllWordsInUpperCase(W: String): String;
var
  I: Integer;
begin
  Result := W;
  Result[1] := UpCase(Result[1]);
  for I := 2 to Length(Result)-1 do
    if (Result[I] = ' ') then Result[I+1] := UpCase(Result[I+1])
end;
-- 
(*metallikop*libero*it*)
{
http://web.tiscali.it/mbsoftware
}

 E si può fare anche senza boolean :)
Gia', peccato che per " ciao a tutti" non 
funzioni ;)
Onestamente penso che la tua versione sia piu' lenta,
perche' esegui un UpCase per ogni spazio che
incontra. Esegui, in sostanza, l'UpCase anche 
per gli spazi, cosa che non serve.
-- 
Posted from  [80.105.34.80] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

end;
devi fare for I := 1 to length(result) -1 
altrimenti se la stringa inizia per spazio non funziona ;-)
-----------
Ore 18.30: premo invio.

per gli spazi, cosa che non serve.
Già, però io l'ho usata varie volte, fortunatamente le mie stringhe
non iniziavano mai con lo spazio e tra una parola e l'altra c'era
sempre uno spazio solo. Che dire, sono fortunato :)
Se mai mi fosse capitata una stringa che iniziava con lo spazio, avrei
sicuramente corretto il For i:=2 in I:=1...
In quanto alla velocità, penso che la mia versione sia più veloce
nelle stringhe senza spazi consecutivi ;)
Diciamo che la mia versione è ottimizzata per le stringhe scritte come
si deve :-))))
-- 
(*metallikop*libero*it*)
{
http://web.tiscali.it/mbsoftware
}

si deve :-))))
???
Non so se stai scherzando o se parli seriamente ;)
-- 
The Follet

On Mon, 12 Nov 2001 17:44:27 GMT, Unforgiven

???
-- 
(*metallikop*libero*it*)
{
http://web.tiscali.it/mbsoftware
}

???
function AllUpCaseNoBool(W: String): String;
var
  I: Integer;
begin
  if W = '' then Exit;
  Result := W;
  Result[1] := UpCase(Result[1]);
  for I := 1 to Length(Result)-1 do
    if (Result[I] = ' ') then Result[I+1] := UpCase(Result[I+1])
end;
function AllUpCaseWithBool(W: String): String;
var
  B: Boolean;
  I: Integer;
begin
  if W = '' then Exit;
  B := true;
  Result := W;
  for I := 1 to Length(Result) do
  begin
    if Result[I] = ' ' then B := true
    else
    begin
      if (B) then Result[I] := UpCase(Result[I]);
      B := false
    end
  end
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  i, t : Integer;
  tempo1, tempo2: Cardinal;
  strl : TStringList;
begin
  strl := TStringList.Create;
  strl.LoadFromFile('G:\WinNT\System32\Eula.txt'); //32.4 Kb
  tempo1 := GetTickCount;
  for t := 1 to 10000 do
    for i := 0 to Strl.Count-1 do
      Strl.Strings[i] := AllUpCaseWithBool(Strl.Strings[i]);
  tempo2 := GetTickCount - tempo1;
  Memo1.Lines.Append('With bool: '+IntToStr(tempo2));
  tempo1 := GetTickCount;
  for t := 1 to 10000 do
    for i := 0 to Strl.Count-1 do
      Strl.Strings[i] := AllUpCaseNoBool(Strl.Strings[i]);
  tempo2 := GetTickCount - tempo1;
  Memo1.Lines.Append('Without bool: '+IntToStr(tempo2));
  strl.Free
end;
Risultati dopo 4 iterazioni:
With bool: 7220 
Without bool: 6840 
With bool: 7721
Without bool: 6850 
With bool: 7240
Without bool: 6850
With bool: 7711
Without bool: 6860
(Athlon1000 Pc133)
Ps1: Ho provato anche con altri file txt e la mia versione è sempre
più veloce
Ps2: Può servire anche per misurare le prestazioni della vostra cpu ;)
-- 
(*metallikop*libero*it*)
{
http://web.tiscali.it/mbsoftware
}

      Strl.Strings[i] := AllUpCaseNoBool(Strl.Strings[i]);
Effettivamente la funzione senza booleano funziona meglio,
anche se questo test e' inaffidabile.
Esegui la versione senza booleano su una stringa gia'
convertita in maiuscolo (e UpCase potrebbe non fare nulla,
in questo caso) ;)
-- 
The Follet

in questo caso) ;)
Anche nella versione con booleano UpCase viene eseguito ma non fa
nulla, in quel caso ;)
-- 
(*metallikop*libero*it*)
{
http://web.tiscali.it/mbsoftware
}

 Ps2: Può servire anche per misurare le prestazioni della vostra cpu ;)
Che bel giochino :)


function StrUpper(const S: String): String;
var i: Integer;
begin
  Result:=S;
  for I := 1 to Length(Result)-1 do
    if (Result[I] = ' ') then
     if (Result[I+1] in ['a'..'z']) then         // Se inizia con una
minuscola
      Result[I+1] := Chr(Ord(Result[I+1])-32)
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  i, t : Integer;
  tempo1, tempo2, tempo3: Cardinal;
  strl : TStringList;
begin
  strl := TStringList.Create;
  strl.LoadFromFile('c:\License.txt');//32.4 Kb
  tempo1 := GetTickCount;
  for t := 1 to 1000 do
    for i := 0 to Strl.Count-1 do
      Strl.Strings[i] := AllUpCaseWithBool(Strl.Strings[i]);
  tempo2 := GetTickCount - tempo1;
  Memo1.Lines.Append('With bool: '+IntToStr(tempo2));
  tempo1 := GetTickCount;
  for t := 1 to 1000 do
    for i := 0 to Strl.Count-1 do
      Strl.Strings[i] := AllUpCaseNoBool(Strl.Strings[i]);
  tempo2 := GetTickCount - tempo1;
  Memo1.Lines.Append('Without bool: '+IntToStr(tempo2));
  tempo1 := GetTickCount;
  for t := 1 to 1000 do
    for i := 0 to Strl.Count-1 do
      Strl.Strings[i] := StrUpper(Strl.Strings[i]);
  tempo3 := GetTickCount - tempo1;
  Memo1.Lines.Append('My test: '+IntToStr(tempo3));
  strl.Free
end;
il file di test è di 4.997 byte
Risultati dopo 4 iterazioni:
With bool: 11504
Without bool: 9967
My test 5095
With bool: 11615
Without bool: 9627
My test 5109
With bool: 11609
Without bool: 9627
My test 5109
With bool: 11610
Without bool: 9627
Mytest 5109
Saluti
PS Ho forse sbagliato qualche cosa ??

 nulla, in quel caso ;)
Non hai capito.  
Se UpCase viene eseguita su un carattere gia' maiuscolo,
potrebbe non compiere nessuna elaborazione per renderlo
maiuscolo, con risparmio di tempo conseguente.


PS Ho forse sbagliato qualche cosa ??
Sembra di si, infatti la funzione deve agire anche sul primo carattere
della stringa ;)
Inoltre, sembra proprio che UpCase(Result[i+1]) sia più veloce di 
Chr(Ord(Result[I+1])-32) 
-- 
(*metallikop*libero*it*)
{
http://web.tiscali.it/mbsoftware
}

 Chr(Ord(Result[I+1])-32) 
Upcase è una funzione asm che praticamente se non ho letto male fa quello che
fa
l'operatore "in" e converte in maiuscolo il char passato (prova con F7 quando
arrivi
alla sua chiamata) chr e ord sono Built-in se non erro.
cmq ho sostituito UpCase a Chr(Ord(Result[I+1])-32) e viceversa e il tempo
cambia poco
il problema è sulla prima if: if W = '' then Exit; lui fa un test tutte le
volte che
entra, basta togliere la if e il tempo si dimezza per tutte le funzioni in
quanto il
testo se la stringa è vuota lo fa già il ciclo for con length(W) dunque mixando
il tutto :
function StrUpper(const S: String): String;
var i: Integer;
  function Upc(f: Char): Boolean;
  Begin
    Result := f in ['a'..'z'];
  end;
begin
  Result:=S;
  for I := 1 to Length(Result)-1 do
    if (Result[I] = ' ') then
    begin
     if Upc(Result[I+1]) then
      Result[I+1] := UpCase(Result[I+1]);// Chr(Ord(Result[I+1])-32);
    end
    else if i=1 then
      if Upc(Result[I]) then
        Result[I] := Chr(Ord(Result[I])-32); //UpCase(Result[I+1]);
end;
Questa è la funzione che mi ha dato i tempi migliori PII 500 con 196Mb di ram
il tempo medio 592 con un file di 18 k con 1000 iterazioni
Saluti
-- 
Posted from 
hwadsl-213-155-195-162.telvia.it
 [213.155.195.162] 
