Kilka zmiennych w jednym stringu

0

W edicie jest zdanie: <SŁOWO>, mam ## lat i jestem <SŁOWO2>.

Powiedzmy, że w innych editach przypisujemy, że:
<SŁOWO> to "Siemka"

to liczba (każdy # odpowiada za jedną cyfrę np, 12 lub 09, lub 012 gdy jest ###)

<SŁOWO2> to "kwiatek"

W jakimś labelu pojawia się napis: "Siemka, mam 12 lat i jestem kwiatek."

Lecz szyk tych wyrazów można dowolnie zmieniać...: <SŁOWO> jestem. Mam <SŁOWO2> i ## lat.
I z tego powstanie: "Siemka, jestem. Mam kwiatek i 12 lat."

...lub powtarzać jakiś wyraz: <SŁOWO>. Jestem ###-ty, mam ## lat i <SŁOWO2>. No to <SŁOWO>.
Otrzymamy: "Siemka. Jestem 012-ty, mam 12 lat i kwiatek. No to Siemka."

Nie za bardzo wiem jak takie coś zrobić. Na początku myślałem o funkcji

Format

(chociażby do uzyskania zer przed cyframi), ale nie za bardzo wiem jak uwzględnić zmienny szyk wyrazów.

Czy ma ktoś może jakiś pomysł?

0

Rozwiązaniem Twojego problemu są dwie instrukcje: Insert i Delete.
Nudziło mi się, więc napisałem takie coś:

function Zamien(Zdanie,Z,Na: String): String;
var
  X: Integer;
  Temp: String;
begin
  Temp := Zdanie;
  While Pos(Z,Temp) > 0 do
    begin
      X := Pos(Z,Temp);
      Delete(Temp,X,Length(Z));
      Insert(Na,Temp,X);
    end;
Result := Temp;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := Edit1.Text;
  Label1.Caption := Zamien(Label1.Caption,'<SŁOWO>',Edit2.Text);
  Label1.Caption := Zamien(Label1.Caption,'<SŁOWO2>',Edit4.Text);
  Label1.Caption := Zamien(Label1.Caption,'###','0'+Edit3.Text);
  Label1.Caption := Zamien(Label1.Caption,'##',Edit3.Text);
end;

Mam nadzieje że o takie coś Ci chodziło? :>

0

Dzięki, ale zapomniałem dodać, że liczba zanków # nie jest z góry ustalona, tz. może ich być kilka, a może być i kilkadziesiąt (to zależy od użytkownika).

Czyli może być ## co da 12, a może być ######## dając 00000012.

0

Do zamiany <SŁÓW> polecam funckję StringReplace (prosta, możliwość zamiany wszystkich ciągów na raz), natomiast z # było by inaczej. Możesz albo założyć że np maksymalnie będzie powiedzmy 10 x # (bo powyżej 10 już się kończy Integer ;]), i szukać malejąco i zamieniać, 10#, 9#, ...

Ewentualnie jakiejś wyrażenia regularne.

0

Skorzystałem z tej funkcji, dzięki. A co do liczb... to chodzi mi o to, że np jak ktoś wpisze liczbę 126, a znaków # będzie 16 to w wyniku otrzyma 126 poprzedzone 13-oma zerami (126 to 3 znaki, a 16-3=13 :-) ). I to w sumie nie jest Integer tylko String (dlatego liczba ta nie jest chyba ograniczona do 10 znaków).

0

ok to może do jeszcze jedna funkcja dla ## :

function ZamienX(Zdanie: String; Znak:Char ;Na: String): String;
var
  X,Y: Integer;
  Temp: String;
begin
  Temp := Zdanie;
  While Pos(Znak,Temp) > 0 do
    begin
      X := Pos(Znak,Temp);
      Y := X;
      while Temp[Y+1] = Znak do
        begin
          Y := Y + 1;
        end;
      If (Y-X) > Length(Na)-2 then
      begin
        Delete(Temp,X,Y-X+1);
        Insert(DupeString('0',Y-X-Length(Na)+1),Temp,X);
        Insert(Na,Temp,Y-Length(Na)+1);
      end
      else
      begin
        Result := Temp;
        Exit;
      end;
    end;
Result := Temp;
end;

// w rezultacie kod dla przycisku wyglada tak:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := Edit1.Text;
  Label1.Caption := Zamien(Label1.Caption,'<SŁOWO>',Edit2.Text);
  Label1.Caption := Zamien(Label1.Caption,'<SŁOWO2>',Edit4.Text);
  Label1.Caption := ZamienX(Label1.Caption,'#',Edit3.Text);
end;

Zrobiłem tak że w przypadku gdy znaków ## jest mniej niż jest długa liczba to nie zamienia ;)

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