Wypakowanie liczb, złączonych w jeden łańcuch w komponencie TMemo

0

Witam.

Zrobiłem procedurę, która wygląda tak:
procedure rdx(r:integer;d:integer;x:integer);

W memo1 mam zapisane numerki tak: 32523,53453,2342. Chciałbym, by prodecura wykorzystywała te numerki i robiła to co jest zapisane w tej procedurze. Niestety pojawia się problem. Nie wiem jak to zrobić by to zczytać z memo1.

Gdy natomiast zrobię to w ten sposób, że na button1 dodam te numerki to to działa świetnie
(rdx ('32523,53453,2342');)
Gdy w button1 dodaję by to czytało z memo1.lines.count to to nie działa, bo pisze że nie ma wymagającej ilości parametrów...
Mógłby mi ktoś z tym pomóc? Dziękuję.

0

"wyjmij" z ciągu znaków liczby, ot co.

0

Mógłbyś jaśniej? Jestem newbie w tym.

0

Pokaż fragment kodu, który próbujesz zrobić i który nie działa. I najlepiej też ten, który działa.

0

Ogólnie procedura działa.

Najprościej będzie tak:

procedure TForm1.Button8Click(Sender: TObject);
var
r,d,x : string;
begin
r := ('32523');
d := ('53453');
x := ('2342');
memo1.lines.add(r + ',' + d + ',' + x);

end; 

Wtedy wówczas w memo1 pojawia się: 32523,53453,2342.

Chciałbym, mieć możliwość by zamiast na "32523,53453,2342" odpalać procedurę to odpalać ją na memo1.lines.

Dokończę robić obiad i poczytam co mi tam wysłałeś, dzięki.

0

Najprościej użyć ExtractStrings i otrzymane składowe przekonwertować na liczby, np. za pomocą funkcji StrToInt.

0

Eh. W sumie to słyszałem o możliwości ExtractStrings, jednak to nie jest to o co mi chodziło. Nawet ją gdzieś wykorzystałem.
Już mam pewien button, który doda mi liczby do memo1 i zalezy mi na tym, by to wyglądało tak: 32523,53453,2342.
Co mi z tego, że dodam to inaczej, w sumie już mogę tak zrobić na buttonie, ale po co? Lepiej, żeby mi to czytało tak jak jest :)

0

Napisz to po polsku, ponieważ póki co wydaje mi się, że nie zrozumiałeś, do czego służy ta funkcja.

0

Dobra, postaram się bo dotychczas pisałem po chińsku ;<
Patrz:

 procedure TForm1.Button8Click(Sender: TObject);
var
r,d,x : string;
begin
r := ('32523');
d := ('53453');
x := ('2342');
memo1.lines.add(r + ',' + d + ',' + x);
 
end; 

Ta procedura dodaje mi liczby do memo1. Wynikiem będzie coś takiego: 32523,53453,2342. Rzecz jasna będzie to właśnie w ten sposób zapisane w memo1.

Dzięki ExtractStrings zostało by to zapisane w memo1 w ten sposób:
"32523
53453
2342"
A to mnie nie interesuje, gdyż mogłem Sobie to dodać w ten sposób już za pomocą buttonu. O właśnie tak:

 begin
r := ('32523');
d := ('53453');
x := ('2342');
memo1.lines.add(r);
memo1.lines.add(d);
memo1.lines.add(x);
 
end; 

Jak już mówiłem - zależy mi na tym, by to wyglądało tak: 32523,53453,2342, więc w moim przypadku funkcja ExtractStrings jest kompletnie nie potrzebna.

Mam nadzieję, że teraz ktoś załapał o co mi chodzi.
Jak już mówiłem to właśnie w taki sposób muszą być zapisane liczby, by moja procedura działała.

procedure rdx(r:integer;d:integer;x:integer); 
0

Użyłbyś może trochę wyobraźni...
Mając string w formie 32523,53453,2342 (wczytaną linijkę z memo), NA TYM stringu skorzystaj z ExtractStrings.
Jak w ogóle chciałbyś zastosować tę funkcję do pierwszego przykładu? :|

0

Dokładnie - mając linijkę np.: 12,23,34, i używając funkcji ExtractStrings w poniższy sposób:

uses
  Classes;

{...}

const
  LINE_TO_SPLIT = AnsiString('12,23,34');
var
  slNumbers: TStrings;
begin
  slNumbers := TStringList.Create();
  try
    ExtractStrings([','], [' '], PChar(LINE_TO_SPLIT), slNumbers);

    { use the slNumbers strings }
  finally
    slNumbers.Free();
  end;

  {...}
end

w liście slNumbers otrzymasz łańcuchy: 12, 23 oraz 34; Następnie je będziesz mógł przekonwertować na liczby za pomocą np. procedury Val lub funkcji StrToInt i wykorzystać do obliczeń;

To jest najprostszy sposób, ale nie najszybszy; Zawsze możesz ręcznie wypakować składowe łańcucha wejściowego i od razu je przekonwertować, lub napisac sobie funkcję, która wyodrębni zadaną liczbę z ciągu, np. pierwszą lub trzecią, i zwróci ją jako rezultat funkcji; Trzeba jednak pokombinować i poczytać, a nie o wszystko pytać bez zastanowienia i własnego wkładu, licząc chyba na gotowca.

0

Okej. Mógłbyś mi powiedzieć co to za lista slNumbers? Czy tu chodzi o to, że to jest, ale tego nie widać ? Że tak jakby się to w pamięci wszystko robiło? xd

0
DroniC napisał(a):

Mógłbyś mi powiedzieć co to za lista slNumbers?
Przecież ci wyraźnie to powiedział. Przeczytaj jakieś podstawy to zaczniesz rozumieć odpowiedzi.

0

Google zablokowali Tobie czy jak? Poszukać i pokombinować trochę samemu by wypadało. A i chyba musimy być na wzór niektórych tutaj z furiousem równe złośliwi, nagradzając bez ostrzeżenia koszem tagi z czterech liter. Nie mogę pojąć dlaczego ludzie usilnie nie chcą jako tagu podać po prostu nazwy IDE czy języka. Podajesz przykładowo delphi i wystarczy. Po co jakies memo1. Bo jakbyś je nazwał też nie z tyłka tylko konkretnie JakasSensownaNazwaMemo to już co, tag nie pasuje? Następnym razem po prostu usunę taki wątek i tyle.

0

@_13th_Dragon
No to proszę Cię powiedz mi, gdzie on dokładnie powiedział co to za lista.
@olesio
Wpisałem to głupie Delphi w tag :) Jeżeli nie to miałem taki zamiar, a coś mi się musiało spiepszyć, że tego nie dodało. Wybacz.

0
DroniC napisał(a)

No to proszę Cię powiedz mi, gdzie on dokładnie powiedział co to za lista.

Em, no tutaj:

w liście slNumbers otrzymasz łańcuchy: 12, 23 oraz 34;

0

Ja i tak jestem pod wielkim wrażeniem, że jeszcze to mu tłumaczycie:D
Typek majac

procedure rdx(r:integer;d:integer;x:integer); 

chce z niej korzystac wywołujac ze stringiem

(rdx ('32523,53453,2342');) 

mało tego jeszcze mówi, że mu to działa jakimś innym sposobem.
Moim zdaniem to to nawet do działu newbie się nie nadaje;

0

Owszem działa, bo wtedy r := 32523, d := 53453, x := 2342. Przypisuję takie wartości w var i to działa.. :)

0

Perełka?

0
DroniC napisał(a)

No to proszę Cię powiedz mi, gdzie on dokładnie powiedział co to za lista.

Czytałeś ten kod w ogóle? Przecież jak byk widnieje w nim deklaracja slNumbers, i reszta operacji na niej wykonana:

var
  slNumbers: TStrings;
begin
  slNumbers := TStringList.Create();

Jeśli nie wiesz czym jest TStrings czy TStringList, to czas zapoznać się z jakimkolwiek kursem programowania w Delphi; Poza tym nadal nie wiem w 100% co chcesz zrobić; W każdym razie pozyskanie osobnych liczb z łańcucha z Memo działa dobrze.

0

@_13th_Dragon
Mam Ci udowodnić, że to działa, ta?

OK. Wyślę Ci source (załącznik).

Rzecz jasna w tym co robię procedurę mam nieco inną, a raczej jakby jej zawartość :)
By ona działała wystarczy podać jakiekolwiek numery. Ważne by to wyglądało tak:
(2343242,23535,5646)

Nie chcę jednak samemu wpisywać tych wartości do buttonu, wolę by zostały one czytane z memo1 automatycznie ;) Niestety nie potrafię ogarnąć czytania z memo1.

0

Pora zatem na zgłebienie kursów z podstawami, a wtedy będziesz umiał. Bez znajomości podstaw Delphi nie ma sensu pisqc jakiekolwiek zaawansowane programy. Skoro nie chce się Tobie nawet zajrzeć do helpa od IDE, patrząc jakie własności ma TMemo i jakiego są typu. Poza tym nie wiadomo jak coś ma się według Twojej filozofii robić automatycznie, bez klikania w buttom. W wątku, w timerze, w OnChange?

0

Nie o to mi chodzi. Niech się wartości dodają do listboxa kiedy klikam na button, to jest git. Niech też button to czyta, jednak żeby to czytał w memo1.

Bym tego nie musiał wpisywać samemu: lol(646,45646,456456);, tylko niech to będzie na zasadzie lol(memo1.lines[1]) bla bla bla..

3

Tobie tak bardzo brakuje postaw że nawet z twego kodu nie da się odczytać czego chcesz, zajmij się podstawami, ten projekt cię przerósł. O to ci chodziło:

function Parse(var Str:String;const Delimeter:String):String;
var P:Integer;
begin
  P:=Pos(Delimeter,Str);
  if P>0 then
  begin
    Result:=Copy(Str,1,P-1);
    Delete(Str,1,P+Length(Delimeter)-1);
  end
  else
  begin
    Result:=Str;
    SetLength(Str,0);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var line:String;
var a,b,c:Integer;
begin
  line:=memo1.lines[0];
  a:=StrToInt(Parse(line,' '));
  b:=StrToInt(Parse(line,' '));
  c:=StrToInt(Parse(line,' '));
  ShowMessage(Format('A=%d; B=%d; C=%d;',[a,b,c]));
  memo1.lines.Delete(0);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  memo1.lines.add(Format('%d %d %d',[124+Random(5644),40+Random(1344),80+Random(6346)]));
end;
0

Racja, przerosło mnie to. Nie jest to na moje możliwości. Zadam jeszcze jedno pytanie. Jak zrobić, by po przeczytaniu memo1.lines[0] wskoczył program do kolejnej i przeczytał memo1.lines[1], [2], [3]..... itd.

0

Nic więcej nie musisz robić.

0

Tak, nie muszę. Ale chcę, by mi czytało nie tylko początkową linię w memo1. Chcę, by przechodziło do kolejnych :)

@Edit
z tego względu, że memo1.lines.clear usunąłem.

3
DroniC napisał(a):

Racja, przerosło mnie to. Nie jest to na moje możliwości. Zadam jeszcze jedno pytanie. Jak zrobić, by po przeczytaniu memo1.lines[0] wskoczył program do kolejnej i przeczytał memo1.lines[1], [2], [3]..... itd.

Tajemnicze słowo na dzisiaj, opisujące "technikę" odkytą przez Kolumba 5 dni temu: pętla. Nikomu wcześniej szerzej nieznane. Spisane przez rosyjskiego uczonego Jurija Pentlejewa. Toteż nosi taką nazwę po przetłumaczeniu na polski. Jeżeli oczywiście dobrze zinterpretowałem, co tam chcesz zrobić tym razem.

0
DroniC napisał(a):

Tak, nie muszę. Ale chcę, by mi czytało nie tylko początkową linię w memo1. Chcę, by przechodziło do kolejnych :)

@Edit
z tego względu, że memo1.lines.clear usunąłem.
Jeżeli usunąłeś memo1.lines.clear to nadal kod będzie obrabiał wszystkie wiersze po kolei.
Jeżeli zaś usunąłeś memo1.lines.Delete(0); to znowu go wstaw, lub zacznij od czytania podstaw.

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