AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Parsen von Seitenzahlen

Ein Thema von Schwedenbitter · begonnen am 19. Jul 2009 · letzter Beitrag vom 18. Aug 2012
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#11

AW: Parsen von Seitenzahlen

  Alt 17. Aug 2012, 15:48
Zitat:
function CreateNumberList(aNumberDesc: string; var aNumberList: TList<Integer>): Boolean;
Weg mit dem VAR, denn du willst ja nur den Objektinhalt ändern und nicht den Instanzzeiger.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#12

AW: Parsen von Seitenzahlen

  Alt 17. Aug 2012, 16:29
Ich hab so Just4Fun das Problem im ersten Post gelöst. Es funktioniert relativ gut, zumindest bei der Aufgabenstellung

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
    function IntList(s: String; List: TStrings): Boolean;
        function IsValidInteger(S: String): Boolean;
        var
          I, Code: Integer;
        begin
          Val(S, I, Code);
          Result := Code = 0;
        end;
    var
      a, b: String;
      i: Integer;
    begin
      Result := False;
      List.Clear;

      if Pos('-', s) = 0 then //für einzelne Seitenzahlen, z. B. "1"
      begin
        if IsValidInteger(s) then
        begin
          List.Add(Trim(s));
          Result := True;
        end;
        Exit;
      end;

      a := Copy(s, 1, Pos('-', s) - 1); //für Seitenzahlen von bis, z. B. "1-3"
      Delete(s, 1, Pos('-', s));
      b := s;

      if IsValidInteger(a) and IsValidInteger(b) then
      begin
        for i := StrToInt(a) to StrToInt(b) do
          List.Add(IntToStr(i));
        Result := True;
      end;
    end;
var
  s: String;
  sl, slList, slResult: TStringList;
  i: Integer;
begin
  s := '1-3; 10; 17; 21-23';

  sl := TStringList.Create;
  slList := TStringList.Create;
  slResult := TStringList.Create;
  try
    sl.Delimiter := ';';
    sl.DelimitedText := s;
    for i := 0 to sl.Count - 1 do
      if IntList(sl[i], slList) then
        slResult.AddStrings(slList);

    ListBox1.Items.Text := slResult.Text;
  finally
    sl.Free;
    slList.Free;
    slResult.Free;
  end;
end;
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#13

AW: Parsen von Seitenzahlen

  Alt 17. Aug 2012, 18:45
Das wäre dann die dritte funktionierende Lösung.
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#14

AW: Parsen von Seitenzahlen

  Alt 17. Aug 2012, 19:04
Wie gesagt, nicht wirklich eine Lösung (Problem von 2009), aber etwas Just4Fun Programmierung.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#15

AW: Parsen von Seitenzahlen

  Alt 18. Aug 2012, 08:32
IsValidNumber durch 'TryStrToInt' ersetzen und dann noch das dreimalige Ermitteln der Position von '-' durch Refaktorisieren entfernen. Dann wird das auch kompakter. Das Ziel sollte ein Boolean-Array oder ein Integer-Array sein, keine ListBox.

Deine Lösung unterscheidet sich eigentlich nicht von den anderen, außer, das Du sie nicht allgemeingültig gemacht (Ausgabe in eine ListBox) und als Buttonclick implementiert hast. Einzig das separieren der durch Semikolon getrennten Einzelbereiche bewerkstelligst Du über eine Stringliste.

Aber falsch ist es nicht, nur die Fehlerbehandlung ist ungenügend, finde ich.

@Jens01: TrimString ist überflüssig. Das trimmen übernimmt die ExtractString-Funktion
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Parsen von Seitenzahlen

  Alt 18. Aug 2012, 10:44
Wäre es nicht wesentlich schicker dieses mit dem State-Pattern zu lösen?

State-Pattern: CSV-Parser
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: Parsen von Seitenzahlen

  Alt 18. Aug 2012, 12:14
Hab' auch noch einen (mit Syntaxprüfung, allerdings ungetestet) und auch noch eine Frage dazu. Ist es möglich herauszufinden, ob (wie in meinem Fall) der AdobeRader diese Seiten tatsächlich gedruckt hat (Logdatei o.ä.) ?

Delphi-Quellcode:
function TrimAll(const S: string): string;
var
  I: integer;
begin
  Result := S;
  for I := Length(Result) downto 1 do
    if Result[I] = ' then
      Delete(Result, I, 1);
end;

function IsInPrintOrder(const AValue: integer; const ASet: string): boolean;
type
  TStatus = (stWaitForInteger1, stWaitForInteger2, stError,
    stReadyForInteger1, stReadyForInteger2);
var
  Status: TStatus;
  T, T1, T2: string;
  I, I1, I2: integer;
begin
  T1 := '';
  T2 := '';
  Result := false;
  T := TrimAll(ASet) + ';';
  Status := stWaitForInteger1;
  for I := 1 to Length(T) do
    if (Status <> stError) then
    begin
      case Status of
        stWaitForInteger1:
          if T[I] in ['0'..'9'] then
            T1 := T1 + T[I]
          else
            if T[I] = '-then
              Status := stWaitForInteger2
            else
              if T[I] in [',', ';'] then
                Status := stReadyForInteger1
              else
                Status := stError;
        stWaitForInteger2:
          if T[I] in ['0'..'9'] then
            T2 := T2 + T[I]
          else
            if T[I] in [',', ';'] then
              Status := stReadyForInteger2
            else
              Status := stError;
      end;
      case Status of
        stReadyForInteger1:
          if TryStrToInt(T1, I1) then
          begin
            Status := stWaitForInteger1;
            if AValue = I1 then
            begin
              Result := true;
              Break;
            end
            else
              T1 := '';
          end
          else
            Status := stError;
        stReadyForInteger2:
          if TryStrToInt(T1, I1) and TryStrToInt(T2, I2) and (I2 >= I1) then
          begin
            Status := stWaitForInteger1;
            if (AValue >= I1) and (AValue <= I2) then
            begin
              Result := true;
              Break;
            end
            else
            begin
              T1 := '';
              T2 := '';
            end;
          end
          else
            Status := stError;
      end;
    end;
  if Status = stError then
    raise Exception.Create('Invalid Syntax');
end;

end.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
670 Beiträge
 
#18

AW: Parsen von Seitenzahlen

  Alt 18. Aug 2012, 12:32
Zitat:
@Jens01: TrimString ist überflüssig. Das trimmen übernimmt die ExtractString-Funktion
Dies Trimmen ist doch etwas anderes als was ExtractString macht. Ich nehme dort alle überflüssigen Leerzeichen raus und kann die restlichen dann durch ein ';' ersetzen. So hat der Anwender die Möglichkeit, Leerzeichen, Komma und Semikolon als Trennzeichen zu nutzten.
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#19

AW: Parsen von Seitenzahlen

  Alt 18. Aug 2012, 13:04
Oh, dann habe ich nicht richtig hingeschaut, was die Funktion macht.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#20

AW: Parsen von Seitenzahlen

  Alt 18. Aug 2012, 13:06
Wäre es nicht wesentlich schicker dieses mit dem State-Pattern zu lösen?
Schicker vielleicht, aber nicht unbedingt lesbarer und ein klein wenig Overkill.
Ich hätte noch RegEx anzubieten.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz