Uprościć prostą rzecz. Czy można?

0

Potrzebuję wykryć pierwszą cyfrę wpisaną w pole Edit1.Text
Pierwsza procedura wydaje się być prostsza ale nie działa.
Druga jest dość długa ale działa.
Może można coś poprawić w pierwszej i załatwić sprawę prościej?

procedure TForm1.BT1Click(Sender: TObject);
Label Koniec;
type
SetLiczby = set of '1'..'9';
var
i, k: Integer;
Liczby : SetLiczby;
S: String;
begin
S:=E1.Text;
For i:=1 to Length(S) do
begin
if (Copy(S,i,1) in Liczby) then // Incompatybile types 'string' and 'char'
begin
k:=i;
Goto Koniec;
end;
end;
Koniec:
Label1.Caption:=Copy(S,k,Length(S)-k+1);
end;

procedure TForm2.BT1Click(Sender: TObject);
Label Koniec;
var
i, j, k: Integer;
S: String;
begin
S:=E1.Text;
For i:=1 to Length(S) do
begin
For j:=1 to 9 do
begin
if (Copy(S,i,1)=IntToStr(j)) then
begin
k:=i;
Goto Koniec;
end;
end;
end;
Koniec:
Label1.Caption:=Copy(S,k,Length(S)-k+1);
end;

0

if s[i] in liczby

0

OMG! Co to za potworki z goto?! O ile dobrze zrozumiałem chcesz po prostu sprawdzić czy pierwszy znak stringa jest cyfrą. Jeżeli tak to...

function CzyPierwsztZnakToCyfra(Tekst : string) : boolean;
begin
  Result := False;
  if Tekst <> '' then
  begin
    Result := Tekst[1] in ['1'..'9'];
  end;
end;

A konstrukcja z goto jest przesrarzała i się jej nie powinno stosować. Jeżeli natomaist potrzebujesz tylko zwrócić pierwszy znak, to już z mojego kodu widać jak to zrobić. Poza tym kod wstawiamy w odpowiednie tagi i formatujemy po ludzku. Dodatkowo przypomnę, że wątki należy tagować nazwą języka, a pytania o banalne podstawy i w ogóle takie podstawy, o które pytasz (a te są akurat banalne) zadajemy w dziale Newbie. Tym razem poprawiłem i przeniosłem.

EDIT: @pelsta był szybszy, ale ja musiałem dodać od siebie "moderatorowe pouczenie" ;) Mam nadzieję, że po wprowadzniu obowiązkowych tagów w końcu ustanie "samowolka tagowana" w każdym z działów, o czym pisałem w subforum Coyote.

0
procedure TForm2.BT1Click(Sender: TObject);
var L,p:Integer;
var c:Char;
begin
  L:=Length(E1.Text);
  p:=L;
  for c:='0' to '9' do p:=min(p,Pos(c,E1.Text));
  Label1.Caption:=Copy(E1.Text,p,L-p+1);
end;
1

A ja uproszczę tak:

procedure TForm1.BT1Click(Sender: TObject);
var i: Integer;
    S: string;
begin
  S:= E1.Text;
  i:= 1;
  while (i < Length(S)) and not (S[i] in ['1'..'9']) do Inc(i);
  Label1.Caption:= Copy(S, i, Length(S) - i + 1);
end;

Pytanie do autora wątku: który kod jest prostszy - mój czy Dragona.
Olesio i pelsta nie biorą udziału w konkursie, nie zrozumieli zadania (sorry panowie ;)), ale zawsze mogą się poprawić.

0

W Edit1.Text wpisałem FV/ABC7865 i liczyłem że w Label1,Caption otrzymam 7865 lecz Dragona propozycja nie spełnia moich oczekiwań.
Simplexa jeszcze nie sprawdziłem.
Pozdrawiam.

0

Simplex prawidłowo odczytał moje zamiary i przedstawił chyba najprostszą procedurę.
Serdeczne dzięki.
Pozdrawiam.

0

W nowszych wersjach Delphi (w starszych też ale trzeba dodać zewnętrzny moduł) można użyć wyrażeń regularnych np.:

uses System.RegularExpressionsCore;

procedure TForm1.Button1Click(Sender: TObject);
var
  RegEx: TPerlRegEx;
begin
  RegEx:= TPerlRegEx.Create;
  try
    RegEx.RegEx:= '[.]*([0-9]+)';
    RegEx.Subject:= 'FV/ABC7865';
    if RegEx.Match then
      ShowMessage(RegEx.MatchedText);
  finally
    RegEx.Free;
  end;
end;

Oczywiście na tak prostą sprawę to trochę polowanie z armatą na muchy ale czasem takie rozwiązanie jest wygodniejsze.

0

Można jeszcze tak:

procedure TForm1.BT1Click(Sender: TObject);
var I:Integer;
var S: string;
begin
  S:='';
  for I:=1 to Length(E1.Text) do if E1.Text[I] in ['0'..'9'] then S:=S+E1.Text[I];
  Label1.Caption:=S;
end;

Owszem to się trochę różni od zadania, ale wydaje mi się że takie byli intencje.

0
simplex napisał(a):

Olesio i pelsta nie biorą udziału w konkursie, nie zrozumieli zadania (sorry panowie ;)), ale zawsze mogą się poprawić.

"Zadanie" doskonale zrozumiałem ale... odpowiadałem z komórki. To ty nie zrozumiałeś mojej odpowiedzi.

Mój post był odpowiedzią na ten fragment "zadania"

StaryCap napisał(a):

Pierwsza procedura wydaje się być prostsza ale nie działa.
/.../
Może można coś poprawić w pierwszej i załatwić sprawę prościej?

1 użytkowników online, w tym zalogowanych: 0, gości: 1