Советы по Delphi

         

Как сделать, чтобы первая буква каждого слова в строке была в верхнем регистре?


    function LowCase(ch : CHAR) : CHAR;
begin
case
ch of 'A'..'Z' : LowCase := CHR (ORD(ch)+31); else LowCase := ch; end; end;

function Proper (source, separators : STRING) : STRING;
var


LastWasSeparator : BOOLEAN; ndx              : INTEGER; begin
LastWasSeparator := TRUE; ndx := 1; while (ndx<=Length(source)) do begin if LastWasSeparator then source[ndx] := UpCase(source[ndx]) else source[ndx] := LowCase(source[ndx]); LastWasSeparator := Pos(source[ndx], separators)>0; inc(ndx); end; Result := source; end;

Можно так:

    Function  TfrmLoadProtocolTable.ToMixCase(InString: String): String;
Var I: Integer;
Begin
Result := LowerCase(InString); Result[1] := UpCase(Result[1]); For I := 1 To Length(InString) - 1 Do Begin If (Result[I] = ' ') Or (Result[I] = '''') Or (Result[I] = '"') Or (Result[I] = '-') Or (Result[I] = '.')  Or (Result[I] = '(') Then Result[I + 1] := UpCase(Result[I + 1]); End; End;

Примечание:

Приведенные выше функции вызовут нарушение прав доступа, в случае, если в качестве входного параметра им послать пустую строку (первая функция) или последний символ имеется в проверяемом наборе (вторая функция).

Попробуйте взамен это:

    function proper(s:string):string;
var t:string;
i:integer; newWord:boolean; begin
if
s='' then exit;
s:=lowercase(s);
t:=uppercase(s);
newWord:=true;
for i:=1 to length(s) do
begin if
newWord and (s[i] in ['a'..'z']) then begin s[i]:=t[i]; newWord:=false; continue; end; if s[i] in ['a'..'z',''''] then continue; newWord:=true; end; result:=s;
end;

[000253]



Содержание раздела