Avatar billede jhald Nybegynder
27. september 2001 - 12:39 Der er 7 kommentarer og
1 løsning

Hmm, lille fejl...

oki, det her en en procedure der skulle behandle en string der kommer ind... i den string er der nogle CRLF (er defineret som const) .. for hver af dem skulle den gerne dele op og skrive hver enkelt del af den sting ud seperat... (skal senere bruge det til at behandle enkelt dele af dem..) men den kan ikke helt finde ud af det.. der må tydeligvis være en fejl et sted.. SplitText kommer her til at indeholde \'tekst\' i første gennemløb
\'tekst\'+crlf+\'tekst2\' i anden gennemløb, \'tekst\'+crlf+\'tekst2\'+crlf+\'tekst3\' i tredje.. osv osv ..

Jeg skal bare høre hvor min fejl er..
Når jeg kører debuggeren så hopper den noed over:
      TempInt := i+1;

Forstår jeg ikke helt.. jeg er da på det tidspunkt ikke inde i en løkke eller noed der \"låser\" TempInt, er jeg?


procedure TForm1.MisTreat(X: String);
var
TempInt : integer;
i, j : integer;
SplitText : String;
begin
ListBox1.Items.Add(X);
for i := 1 to length(x) do
  begin
    TempInt := 1;
    if X[i-1] + X[i] = CRLF then
      begin
        for j := TempInt to i do
          begin
            SplitText := SplitText + X[j];
          end;
      Memo2.Lines.Add(SplitText);
      TempInt := i+1;
      SplitText := \'\';
      end;
  end;
end;
Avatar billede unclebug Nybegynder
27. september 2001 - 12:43 #1
Du kan smide dem i en TStringList:

List : TStringList;

List.Text := X;

Så er de splittet op i listen
Avatar billede borrisholt Novice
27. september 2001 - 12:45 #2
Der er et eller andet helt galt med din splitter ... Jeg har en her der virker :
Function ResolveNextToken(var s : String; Token : String) : String;
var
  j : Integer;
begin
  Result := \'\';
  if s=\'\' then
    Exit;

  j:= Pos(Token,s);
  if j <> 0 then
  begin
    dec(j);
    Result:=copy (s,1,j);
    Delete(s,1,j+ Length(Token));
  end
  else
  begin
    Result:=s;
    s:= \'\';
  end
end;

Også er det bare at kalde den :

procedure TForm1.Button1Click(Sender : TObject)
var
  s : String;
begin
  s:= \'To heste gik over en mark men så blev der rødt\';
  while s <> \'\' do
    Memo1.Lines.Add(ResolveNextToken(s, \' \'));
end;

Jens B
Avatar billede hlj Nybegynder
27. september 2001 - 13:52 #3
Grunden til at delphi springer: TempInt := i+1; over er at den kan se at resultatet TempInt bliver sat til en fast værdi i næste løkke.
Det kan nogen gange godt virke lidt mærkelig når man støder på det første gang. Typisk vil denne linie slet ikke blive kompileret ind i den endelige kode (der vises ikke en prik i venstre margin). Hvis man slå optimize fra  vil den udføre linien.
Avatar billede hlj Nybegynder
27. september 2001 - 13:53 #4
Måske skal du flytte TempInt := 1; uden for løkken.
Avatar billede jhald Nybegynder
27. september 2001 - 22:32 #5
tak for den...

undrer mig bare hvorfor du smider den while på?
Avatar billede borrisholt Novice
28. september 2001 - 08:51 #6
jhald  >> Grunden til der er en While på er fordi min funktion ResolveNextToken kun tager den første Token af Strengen og skærer den af og retunerer den.

Altså førstegang du kalder funktionen med strengen \'To heste gik over en mark men så blev der rødt\' så retunerer den \'To\' og din streng er nu skåret end til \'heste gik over en mark men så blev der rødt\';

Etc. Derfor en While ....

Jens B

Avatar billede jhald Nybegynder
28. september 2001 - 09:52 #7
jeps, dumt spørgsmål fra min side... en ting der så måske undrer... det er at den ikke \"bliver ved\" ?

Fordi funtionen skærer jo ikke i den orginale streng, den bliver ved med at være \'to heste .. bla bla bla...\'

hvilket vil sige at s bliver aldrig til \'\' .. og når man så kører den indtil s bliver \'\' ?

Igen er det nok en bøf fra min side, men et eller andet virker lidt underligt...
Avatar billede borrisholt Novice
28. september 2001 - 09:56 #8
jhald>> Jo den skærer netop i den orginale streng ... Idet jeg får s ind som en var parameret :-)

Jens B
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester