Results 1 to 7 of 7

Thread: stringlist Delimiter

  1. #1
    Senior Member
    Join Date
    Jan 2005
    Location
    Waspik
    Posts
    579

    stringlist Delimiter

    Met onderstaande dacht ik een lijstje te krijgen met een paar co?Ârdinaten. Het lukt me niet deze te scheiden op basis van de spatie.

    Code:
    procedure TForm1.Button4Click(Sender: TObject);
    var
      i : Integer;
      s : string;
    begin  //Zet de co?Ârdinaten op een rijtje
      memo3.Lines.Clear;
      sl.Delimiter := ' ';
      sl.StrictDelimiter :=  True;
      for i := 0 to  Memo2.Lines.Count -1 do
        begin
          s := Memo2.Lines[i];
          sl.AddStrings(s);
        end;
      memo3.Lines.AddStrings(sl);
    end;
    levert op:
    69760.7877762488,382055.037410562 70393.5901215093,381925.680025067 70243.2558626905,381485.165685272 69690.8648651703,381579.561615228 69760.7877762488,382055.037410562

    gewenst resultaat:
    69760.7877762488,382055.037410562
    70393.5901215093,381925.680025067
    70243.2558626905,381485.165685272
    69690.8648651703,381579.561615228
    69760.7877762488,382055.037410562

    Wat zit fout in de functie?

  2. #2
    Verbazend. Ik dacht dat sl.AddStrings een stringlist zou willen hebben, dus het verbaast me dat dit compileert.

    Verder is het lastig te beoordelen wat dit zou moeten doen, aangezien we de input niet kennen.
    1+1=b

  3. #3
    Senior Member
    Join Date
    Jan 2005
    Location
    Waspik
    Posts
    579
    Wat het moet doen.

    Ik open een gml bestand en zet dit in een memo.
    Vervolgens zoek ik binnen de memo het deel op waarin de co?Ârdinaten zijn opgeslagen.
    de co?Ârdinaten knip ik eruit en zet ik in een volgende memo.
    vervolgens wil ik de co?Ârdinaat paren onder elkaar hebben omdat ze later in een nieuw ekst bestand opgeslagen worden.
    (De memo's zijn tijdelijk. als het straks goed werkt gaat alles in het geheugen plaats vinden).


    Open het gml bestand
    Code:
    procedure TForm1.Action_Open_GML_BestandExecute(Sender: TObject);
    var
      OpenDialog : TOpenDialog;
    begin
      OpenDialog := TOpenDialog.Create(self);
      with OpenDialog do
        begin
          InitialDir := ApplicatiePad;
          Options := [ofFileMustExist];
          Filter := 'GML bestanden|*.gml|Tekstbestanden|*.txt';
          FilterIndex := 1;  //GML extensie gaat voor
    
          if Execute then
            begin
              Memo1.Lines.Clear;
              Memo1.Lines.LoadFromFile(openDialog.FileName)
            end;
          //else ShowMessage('Openen bestand is afgebroken.');
    
          OpenDialog.Free;
        end;
    end;
    Filter de co?Ârdinaten eruit:


    Code:
    
    function TForm1.Find_String(StartString, EndString: String): String;
    var
      i1, i2       : Integer;
      sSubstr      : String;
    begin
      result := '';
      i1 := Pos(StartString, Memo1.text);
      if i1 > 0 then
        begin
          i2 := PosEx(EndString, Memo1.text, i1);
          if i2 > 0 then
            begin
              result := Copy(Memo1.text, i1 + Length(StartString), i2 - (i1 + Length(StartString)));
              //gekopieerde tekst verwijderen zodat deze in een volgende zoekopdracht niet meer bestaat
              //voorbereiden
              Memo1.SetFocus;
              Memo1.SelStart := i1-1;
              Memo1.SelLength := Length(StartString) + Length(result) + Length(EndString);
              memo1.SelText:=''; //verwijder de geselecteerde tekst
            end;
        end;
    end;           
    
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      Memo2.Lines.Clear;
      memo2.Lines.AddStrings(Find_String('<gml:LinearRing><gml:coordinates>','</gml:coordinates></gml:LinearRing>'));
    end;

    En dan dacht ik de coordinaatparen onder elkaar te zetten:

    Code:
    procedure TForm1.Button4Click(Sender: TObject);
    var
      i : Integer;
      s : string;
    begin  //Zet de co?Ârdinaten op een rijtje
      memo3.Lines.Clear;
      sl.Delimiter := ' ';
      sl.StrictDelimiter :=  True;
      for i := 0 to  Memo2.Lines.Count -1 do
        begin
          s := Memo2.Lines[i];
          sl.AddStrings(s);
        end;
      memo3.Lines.AddStrings(sl);
    
    //  memo3.Lines.AddStrings(sl);
    end;
    (In lazarus 1.08)

  4. #4
    Senior Member
    Join Date
    Jan 2005
    Location
    Waspik
    Posts
    579
    De oplossing is heel simpel.
    Zet de memotext op delimiter. Dit is niet zoals het uiteindelijk moet, maar het werkt.

    Code:
      memo3.Lines.Delimiter := ' ';
      memo3.Lines.DelimitedText := memo2.Text;

  5. #5
    Maar kun je niet iets doen dat lijkt op:
    Code:
    Memo3.Text := StringReplace(Memo2.Text, ' ', sLineBreak, [rfReplaceAll]);
    1+1=b

  6. #6
    Jan
    Join Date
    Oct 2007
    Location
    Mijdrecht
    Posts
    906
    Werkt de oplossing van HansVB dan niet ? Of is die niet goed ?

  7. #7
    Die is prima, maar wel 10 keer zoveel code en mogelijk trager.
    1+1=b

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •