Ech, pokusiło mnie dać gotowca. Jeszcze umieściłem w nim przez przeoczenie nieużywaną później zmienną z ustalaniem pozycji kursora. Której używałem przy testach innego rozwiązania w kodzie. Widząc te SelStart
To już nie mogłeś sobie poprawić choćby tak jak poniżej, żeby sprawdzało ile wynosci długośc zaznaczenia? Znasz SelText
, a już SelLength
nie? :/
procedure TForm1.Edit1KeyPress(Sender : TObject; var Key : Char);
const
Digits_After_Separator = 2;
Digits_Before_Separator = 5;
var
Edt : TEdit;
begin
Edt := TEdit(Sender);
if Edt <> nil then
begin
if Key in ['0'..'9', #8, #13, DecimalSeparator] then
begin
if ((Length(Edt.Text) = Digits_Before_Separator) and (Key in ['0'..'9']))
or ((Length(Edt.Text) <> Digits_Before_Separator) and (Key in [DecimalSeparator]))
or ((Length(Edt.Text) = Digits_Before_Separator + Digits_After_Separator + 1) and not (Key in [#8, #13]))
or ((Pos(DecimalSeparator, Edt.Text) = 0) and (Length(Edt.Text) > Digits_Before_Separator) and not (Key in [DecimalSeparator, #8, #13])) then
begin
if Edt.SelLength = 0 then
begin
Key := #0;
end;
end;
end
else
begin
Key := #0;
end;
end;
end;
Poza tym współnie z Patrykiem Tobie sugerowaliśmy. Najlepiej zrobić funkcję sprawdzającą poprawność całości wedle wzorca 5 cyfr + separator + 2 cyfry dla tekstu Edita. I robić to w OnExit
. Przecież wiadomo, że teraz do kontrolki i tak można wkleić wadliwe dane, a co będziesz się babrał w blokowanie menu, klawiszy do wklejania, dodatkowo dla pewności jeszcze obsługiwał po swojemu WM_PASTE
. Bez sensu. Ułatw sobie prostą funkcją i już.
EDIT: masz, ostatni gotowiec dla Ciebie. Człowiek chce dobrze, a Wam się krzywdę robi. Bo coś tam samemu modzicie, ale z tym TBrain
właśnie jest nie do końca dobrze. Wersja Personal
powinna działać każdemu, a jednak niektórzy muszą chyba mieć coś jak agenci w kultowej grze "Syndicate" ;P
function CzyUserJestSamodzielny(TekstUsera : string) : boolean;
var
I : integer;
begin
Result := Length(TekstUsera) = 8;
if Result then
begin
for I := 1 to Length(TekstUsera) do
begin
if I in [1..5] then
begin
Result := TekstUsera[I] in ['0'..'9'];
if not Result then
begin
Break;
end;
end;
if Result then
begin
if I in [6] then
begin
Result := TekstUsera[I] in [DecimalSeparator];
end;
end;
if Result then
begin
if I in [7, 8] then
begin
Result := TekstUsera[I] in ['0'..'9'];
if not Result then
begin
Break;
end;
end;
end;
end;
end;
end;
procedure TForm1.Edit1Change(Sender : TObject);
const
Texts_Att : array[boolean] of string = ('Może na Google znajdziesz TBrain? ;)', 'Brawo! Masz zainstalowany TBrain');
var
Edt : TEdit;
begin
Edt := TEdit(Sender);
if Edt <> nil then
begin
Caption := Texts_Att[CzyUserJestSamodzielny(Edt.Text)];
end;
end;
Funkcja wydaje się długa. Ale to może i przez stosowanie przeze mnie dla innych zbędnych beginów i endów. Dla mnie tak jest czytelniej i przy konieczności dopisania czegoś więcej niż jedna instrukcja jest łatwiej. I o ile przekona łem się do nie pisanie if costam = true/ = false tylko stosowania od razu if oraz if not. To do tego by stosować tylko tyle beginów i endów ile trzeba, nie dam się póki co przekonać ;)