2.15 :find()

Diese Methode sucht in vordefinierten und benutzerdefinierten, indizierten Attributen (eindimensionalen, zweidimensionalen und assoziativen Feldern) nach einem bestimmten Wert und gibt den ersten Index zurück an der dieser Suchwert zu finden ist.

Die Suche schließt dabei niemals das Standardelement (also z.B. Index [0] oder [0,0]) ein.

Durch Angabe eines Start- und Endindex kann die Suche beschränkt werden. Die gültigen Werte sind:

  • Kein Wert angegeben (void).
  • integer-Wert im Bereich von 1 … Feldgröße (muss aber > 0 sein) für (assoziative) Felder.
  • index-Wert im Bereich von [1,1] bis [rowcount,colcount] wobei auch hier rowcount und colcount > 0 sein müssen.

Alle anderen Werte erzeugen ein fail.

Dies impliziert, dass für die Suche in einem kompletten Feld ohne Start- und Endindex gearbeitet werden sollte, da ein Start- oder Endindex von [0] oder [0,0] ein fail verursacht.

Bei der Suche nach Strings kann auch case-insensitive oder nach dem ersten Vorkommen als Präfix gesucht werden.

Die Suche wird nur im Bereich 1 … n bzw. [1,1] … [n,m] durchgeführt, 0-Indizes sind also nicht erlaubt.

Da die Indizes von assoziativen Feldern keiner Ordnung unterworfen sind, darf als Index nur ein integer-Wert im Bereich 1 … itemcount[<Attribut>] angegeben werden, der die Position des Start- bzw. End-Elements angibt.

Bei zweidimensionalen Feldern (.content[] am tablefield) bewirkt die Angabe eines Indexbereichs [Sy,Sx] bis [Ey,Ex] die Einschränkung des Suchbereichs auf den Bereich [min(Sy,Ey),min(Sx,Ex)] … [max(Sy,Ey),max(Sx,Ex)]. Somit ist die Einschränkung auf Zeilen und Spalten problemlos möglich.

Die Suche erfolgt in Richtung der angegebenen Indizes bzw. unter Berücksichtigung von .direction (nur für zweidimensionale Felder). Die Angabe von 10, 1 anstatt 1, 10 als Start- und Endindizes bewirkt also die Umkehrung der Suchrichtung. Ein vertikal ausgerichtetes zweidimensionales Feld wird in der Reihenfolge Zeilen/Spalten durchsucht, bei horizontaler Ausrichtung ist dies genau umgekehrt. Es wird der Index des ersten, dem Wert entsprechenden Feldes zurückgegeben.

Definition

anyvalue :find
(
  {   attribute Attribute input, }
      anyvalue  Value     input
  { , anyvalue  StartIdx  input
  { , anyvalue  EndIdx    input } }
  { , boolean   CaseSensitive := false       input }
  { , enum      CompareMode   := match_exact input }
)

Parameter

attribute Attribute input

In diesem Parameter wird das vordefinierte oder benutzerdefinierte Attribut angegeben, in dem nach dem Wert gesucht werden soll.

Wenn dieser Parameter nicht angegeben ist, dann wird bei poptext und spinbox das Attribut .text[integer] durchsucht, bei allen anderen Objekten das Attribut .content[].

anyvalue Value input

Nach dem in diesem Parameter angegebenen Wert wird in dem indizierten Attribut gesucht. Grundsätzlich werden nur Werte verglichen, deren Typen gleich bzw. überführbar sind (ein text wird hierzu in einen string überführt).

Wenn dieser Wert ein String oder eine text-Ressource ist, werden auch die Parameter CaseSensitive und CompareMode für die Suche herangezogen.

anyvalue StartIdx input
In diesem optionalen Parameter wird der Startindex angegeben, ab dem in dem indizierten Attribut nach einem Wert gesucht werden soll. Wird hier kein Wert angegeben, wird 1 bei eindimensionalen bzw. [1,1] bei zweidimensionalen Attributen angenommen.
anyvalue EndIdx input
In diesem optionalen Parameter wird der Endindex angegeben, bis zu dem in dem indizierten Attribut nach einem Wert gesucht werden soll. Die Angabe ist nur zulässig, wenn auch ein Startindex angegeben wurde.
boolean CaseSensitive := false input
Dieser optionale Parameter findet nur bei string-Werten Beachtung und definiert, ob die Suche unter Beachtung der Groß-/Kleinschreibung erfolgen soll oder nicht. Der Standardwert ist false.
enum CompareMode := match_exact input

Dieser optionale Parameter findet nur bei string-Werten Beachtung und definiert wie nach einem String gesucht werden soll.

Wertebereich

match_begin

Findet den ersten String, der mit dem Suchstring beginnt.

match_exact

Findet den ersten String, der mit dem gesuchten String exakt übereinstimmt.

match_first

Findet den String, dessen Anfang die größte Übereinstimmung mit dem Suchstring aufweist. Gibt es einen exakt mit dem Suchstring übereinstimmenden String, wird dessen Index zurückgegeben.

match_substr

Findet den ersten String, der den gesuchten String enthält.

Rückgabewert

0
Element wurde in dem übergebenen eindimensionalen, nicht assoziativen Attribut nicht gefunden.
[0,0]
Element wurde in dem übergebenen zweidimensionalen Attribut nicht gefunden.
nothing
Element wurde in dem übergebenen assoziativen Feld nicht gefunden.
sonst
Index des gesuchten Elements in dem übergebenen Attribut. Der zurückgegebene Wert hat den Index-Datentyp des übergebenen Attributs.

Fehlerverhalten

Der Aufruf der Methode schlägt fehl, wenn das Attribut nicht bekannt ist oder der durch StartIdx und EndIdx definierte Bereich nicht innerhalb des gültigen Indexbereichs liegt.

Objekte mit dieser Methode

Beispiel

window Wn
{
  .title "Beispiel fuer die Methode :find()";

  child listbox Lb
  {
    .content[1] "Klettenheimer";
    .content[2] "Strassenmeier";
    .content[3] "Redweik";
    .content[4] "Tilly";
    .content[5] "Mueller";
    .content[6] "Meyer";
    .content[7] "Schulz";

    rule void Showfind (string What input)
    {
      variable integer Index;
      
      !! Beachtet Gross-/Kleinschreibung und sucht nach erstem passenden String.
      Index := Lb:find(What, true, match_begin);
      if (Index = 0) then
        Et_find.content := "Keinen Eintrag gefunden";
      else
        Lb.activeitem := Index;
        Et_find.content := "Naechster passender String";
      endif
    }
  }

  child pushbutton Pb_find
  {
    .text "Suche Eintrag";

    on select
    {
      Lb:Showfind(Et_find.content);
    }
  }

  child edittext Et_find
  {
     .content "Welchen Eintrag";
  }
}

Siehe auch

Eingebaute Funktion find()