Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   StringList Buchstaben verbieten? (https://www.delphipraxis.net/192430-stringlist-buchstaben-verbieten.html)

zobien123 18. Apr 2017 09:27

StringList Buchstaben verbieten?
 
Guten Morgen zusammen:-D,

ich lese alle Ordernamen in eine StringList ein. Nun möchte ich mit diesen weiter arbeiten, jedoch nur mit denen, die numerisch sind. Gibt es irgendwie eine Möglichkeit, mit der man bei einer StringListe nur numerische Einträge zulasssen kann? Oder muss ich im nachhinein die nicht numerischen Einträge irgendwie raussuchen und dann löschen?:pale:

Schon mal vielen Dank für eure Antworten:wink:

haentschman 18. Apr 2017 09:41

AW: StringList Buchstaben verbieten?
 
Moin...:P
Zitat:

ich lese alle Ordernamen in eine StringList ein
...gut. :zwinker:
Zitat:

jedoch nur mit denen, die numerisch sind
...:gruebel: In der Liste stehen nur Buchstaben. Ob das ein Pfad ist oder die Farbe deiner Unterhosen ist mal egal. :zwinker:
Zitat:

Oder muss ich im nachhinein die nicht numerischen Einträge irgendwie raussuchen und dann löschen
...du mußt dir definieren was, in deinem Falle, "numerisch" eigentlich ist. Dann mußt du die Einträge "durchsuchen" was deinen Vorgaben entspricht. Und die Nicht gewollten löschen.
Sichwort: TSringList.Delete, Copy oder RexEx...

Aviator 18. Apr 2017 09:44

AW: StringList Buchstaben verbieten?
 
Oder du machst dir eine Ableitung der TStringList und überschreibst die Add Methode. Hier kannst du direkt filtern was du zulassen möchtest und was nicht. Halte ich persönlich für die einfachste Variante ohne mir jetzt irgendwelchen SourceCode ausgedacht zu haben.

zobien123 18. Apr 2017 10:00

AW: StringList Buchstaben verbieten?
 
Danke für eure schnellen Antworten :)

Zitat:

Oder du machst dir eine Ableitung der TStringList und überschreibst die Add Methode.
Puuuh... das hört sich für mich als Anfänger ziemlich schwer an:pale:

Ich probier es nun mal so:
Zitat:

...du mußt dir definieren was, in deinem Falle, "numerisch" eigentlich ist. Dann mußt du die Einträge "durchsuchen" was deinen Vorgaben entspricht. Und die Nicht gewollten löschen.
Sichwort: TSringList.Delete, Copy oder RexEx...

DeddyH 18. Apr 2017 10:12

AW: StringList Buchstaben verbieten?
 
Für ersteren Vorschlag hab ich mal schnell etwas zusammengedengelt. Es geht auch eleganter, aber ich denke, so ist es halbwegs verständlich:
Delphi-Quellcode:
type
  TMyStringList = class(TStringList)
  public
    function Add(const S: string): Integer; override;
  end;

...

{ TMyStringList }

function TMyStringList.Add(const S: string): Integer;

  function IsNumeric(const s: string): Boolean;
  const
    NUMBERS = ['0'..'9'];
  var
    i: integer;
  begin
    Result := true;
    for i := 1 to Length(s) do
      if not (s[i] in NUMBERS) then
        begin
          Result := false;
          Exit;
        end;
  end;

begin
  if IsNumeric(S) then
    Result := inherited Add(S)
  else
    Result := -1;
end;
Wenn ich keinen Denkfehler gemacht habe, sollten nur noch Strings hinzugefügt werden, die komplett aus Ziffern bestehen.

Christian Seehase 18. Apr 2017 10:21

AW: StringList Buchstaben verbieten?
 
Moin Jörn,

bitte denke dran:
Da Du, aller Voraussicht nach, Zeilen aus der Strlngliste
löschen wirst, solltest Du diese rückwärts durchgehen, also
von StringList.Count-1 to 0, da Du ansonsten auf einen Fehler
laufen wirst. (Index out of bounds)

DeddyH 18. Apr 2017 10:38

AW: StringList Buchstaben verbieten?
 
downto ;)

himitsu 18. Apr 2017 11:00

AW: StringList Buchstaben verbieten?
 
Zitat:

Rückwärts/downto
Oder eine While-Schleife.
Entweder Inc(Idx) oder SL.Delete(Idx) :stupid:


So, genug verwirrt ... viel Spaß noch damit.

BrightAngel 18. Apr 2017 11:06

AW: StringList Buchstaben verbieten?
 
Zitat:

Zitat von DeddyH (Beitrag 1368047)
Delphi-Quellcode:
...
      if not (s[i] in NUMBERS) then
...

Das könnte man vermutlich noch effizienter machen, wenn man direkt die ASCII Randwerte
Delphi-Quellcode:
'0'
und
Delphi-Quellcode:
'9'
vergleicht.

Zur Erklärung grob vereinfacht: Jedes Zeichen entspricht einem numerischen Wert (also Strings sind eigentlich Zahlenketten; jede Zahl hat dann eine standardisierte Entsprechung). So weiß dann Windows oder dein Textzeichner deiner Wahl, welche Glyphe verwendet werden soll, die es zeichnen soll. So. Und jetzt ist das Schöne, dass die Zeichencodes von 0 bis 9 zufällig (?) nebeneinander liegen. Also 48 dezimal ist die '0', 49 ist die '1',..., 57 ist die '9'. Die verschiedenen Codierungen sollten bei den Ziffern zumindest noch keinen Unterschied machen. Du könntest also mit den Größer/Kleiner Operatoren schauen, ob
Delphi-Quellcode:
s[i]
im entsprechenden Zahlenabschnitt ist. Dadurch, dass du nur mit '0' und '9' vergleichen musst, wird die Prüfung ein wenig effizienter, als wenn du in einem
Delphi-Quellcode:
NUMBERS
Feld nachschaust (der
Delphi-Quellcode:
in
-Operator macht nach dem Übersetzen eine lineare Suche durch das Feld -> Aufwand ist multiplikativ mit der Länge des
Delphi-Quellcode:
NUMBERS
-Feldes verknüpft)

Wenn du natürlich auf beliebige bestimmte Zeichen testen musst, dann funktioniert dieser Trick unter Umständnen nicht mehr... :o
Hoffe, ich habe nicht mehr verwirrt, als geholfen. Im Zweifel diesen Post einfach ignorieren :P

Brighty

p80286 18. Apr 2017 11:11

AW: StringList Buchstaben verbieten?
 
Zitat:

Zitat von DeddyH (Beitrag 1368047)
Wenn ich keinen Denkfehler gemacht habe, sollten nur noch Strings hinzugefügt werden, die komplett aus Ziffern bestehen.

nö sieht gut aus, aber der Fragesteller wird wahrscheinlich noch '/',':' und ggf. ' ' hinzufügen müssen, falls es sich um vollständige Pfadangaben handelt.
(wie sehen noch mal die UNC-Angaben aus?)
Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:18 Uhr.
Seite 1 von 2  1 2      

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