Avatar billede slowaterz Nybegynder
20. januar 2004 - 11:50 Der er 6 kommentarer og
1 løsning

Case statement med strenge : case tagString of

Jeg skulle bruge en måde at få mit program til vælge handling afhængigt af indholdet af en streng. Det er et fast sæt strenge, jeg har at vælge mellem (tags i en XML fil). Dem har jeg puttet dem i en TStringList. Når jeg skal parse filen for at lede efter tags, gør jeg det følgende for hver linie i filen :

  for i := 0 to TagSearchList.Count - 1 do
  begin
    if Pos(TagSearchList.Strings[i], OneLine) > 0 then
    begin
      tagCode := i;
      Break;
    end;
  end;

Senere bruger jeg værdien af "i" i en case statement.

Dette er dog en temmeligt langsom fremgangsmåde. Er der nogen, der har en smartere / hurtigere metode ?
Avatar billede snowball Novice
20. januar 2004 - 11:58 #1
http://www.swissdelphicenter.com/en/showcode.php?id=1028 er der givet et eksempel på hvordan man kan bruge CASE sammen med strenge.
Avatar billede slowaterz Nybegynder
20. januar 2004 - 12:33 #2
snowball >> Jeg har haft kigget på Enumerated types, men forkastede den løsning, da jeg ikke kan bruge "/" i navnene i sådan en type. Jeg har altid et sæt af XML tags : <SUPPLIER_ID> og </SUPPLIER_ID>. Man kunne nøjes med "SUPPLIER_ID" som søgestreng, så skal der ekstra kontrol på, om den tag, man har fundet har et "/" foran.
Avatar billede slowaterz Nybegynder
20. januar 2004 - 12:43 #3
Jeg har fundet følgende lille artikel om Strings i en case statement, hvor TStringList bliver benyttet : http://www.undu.com/Articles/000229c.html

Det bliver det næste, jeg vil prøve. Så må vi se, om det hjælper ...
Avatar billede snowball Novice
20. januar 2004 - 12:49 #4
Der skal du så bare lige være opmærksom på at IndexOf og Pos ikke søger på samme måde. IndexOf giver kun resultat hvis hele strengen passer med det man søger efter. Pos giver resultat hvis strengen bare indeholder det man søger efter ;)
Avatar billede slowaterz Nybegynder
20. januar 2004 - 15:03 #5
Der var for hurtig på aftrækkeren. Det hjalp mig ikke særligt meget, da jeg stadig skal have kontrolleret hver linie, om den indeholder noger af de tags, jeg søger efter. Det er den del, jeg skal have optimeret.
Avatar billede slowaterz Nybegynder
22. januar 2004 - 13:24 #6
Ved at "snyde" lidt kan jeg faktisk bruge TStringList.

Jeg antager, at start- og sluttags (<SUPPLIER_ID> og </SUPPLIER_ID>) altid er i samme linie. Så fungerer følgende ganske fint :

    while not EOF(XMLfile) do
    begin
      ReadLn(XMLfile, oneLine);
      sPos := Pos('<', oneLine);
      ePos := Pos('>', oneLine);
      oneTag := Copy(oneLine, sPos, ePos - sPos + 1);
      tagIndex := TagSearchList.IndexOf(oneTag);
      if tagIndex >= 0 then
      begin
        tagCode := Integer(TagSearchList.Objects[tagIndex]);
        case tagCode of
          0 :
          begin
            Delete(oneLine, 1, ePos); // Remove (whitespaces and) first tag.
            sPos := Pos('<', oneLine); // Find start of next tag.
            SupplierID := Copy(oneLine, 1, sPos - 1);
          end;
...
...
...
        end; // case tagCode
      end; // if tagIndex >= 0
    end; // while not EOF(XMLfile)

I forhold til tidligere model tager det ca. det halve tid.
Avatar billede slowaterz Nybegynder
29. februar 2004 - 12:07 #7
Det ser ud til, at dette emne dermed er udtømt ...
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