Einzelnen Beitrag anzeigen

urs.liska

Registriert seit: 6. Aug 2003
Ort: Freiburg
195 Beiträge
 
Delphi 6 Professional
 
#9

Re: Nummer zu String, die zweite

  Alt 16. Sep 2003, 15:29
Hi synex,

der wesentliche Fehler liegt in den Zeilenlistbox1.Items[c-3][i+1] und folgende. Du hast 'c' als Anzahl der Listbox-Einträge definiert. Deshalb hast Du mit Items[c-3], Items[c-2] und Items[c-1] die letzten drei Einträge der Listbox angesprochen. Wenn die Listbox weniger als drei Einträge hat, gibt es einen Fehler (weil Du Items[-1] ansprechen willst). Und egal wieviel Einträge mehr vorhanden sind, Du liest immer nur die letzten drei aus, deshalb sind in memo1 auch immer drei Buchstaben zu sehen.

Du musst das ganze aber sowieso anders angehen.
Für so etwas braucht man eine Rekursion. Du denkst doch ungefähr (Eingabe z.B. '234'):
Wenn die erste Ziffer (Möglichkeiten: 'A', 'B', 'C') 'A' ist, dann kann die zweite Ziffer 'D', 'E' oder 'F' sein. Für jede dieser Möglichkeiten kann dann wiederum die dritte Ziffer etc....
Du musst also eine Funktion schreiben, die für eine gegebene Position im Eingabestring alle (meistens drei) Möglichkeiten durchgeht und sich damit selbst für die nächste Position im Eingabestring aufruft.
Diese Funktion sieht so aus:
Delphi-Quellcode:
procedure TForm1.FindeKombinationen(Prefix, Rest: string);
var i: integer;
    neuPrefix,
    neuRest: string;
    HandyBuchstaben: string;
begin
  // Finde die möglichen Buchstaben zur aktuellen Ziffer
  HandyBuchstaben := FindeHandyBuchstaben(Rest[1]);
  // gehe die möglichen Buchstaben zur aktuellen Ziffer durch
  for i := 1 to length(HandyBuchstaben) do
  begin
    // hänge den aktuellen Buchstaben an den bestehenden Ergebnisstring an
    neuPrefix := Prefix + HandyBuchstaben[i];
    // wenn wir noch nicht bei der letzten Ziffer sind:
    if length(Rest) > 1 then
    begin
      // ersten Buchstaben des Rests abschneiden
      // (den haben wir an den Prefix angehängt)
      neuRest := Copy(Rest, 2, length(Rest) - 1);
      // rekursiver Aufruf für die nächste Ziffer
      findeKombinationen(neuPrefix, neuRest)
    end
    else
      // Hänge die gefundene Kombinationsmöglichkeit an die Stringliste an
      FKombinationen.Add(Prefix + Handybuchstaben[i]);
  end;
end;
Aufgerufen wird sie so:
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
begin
  FKombinationen.Clear;
  { vorher noch eine Sicherheitsabfrage }
  try
    StrToInt(Edit1.Text)
  except
    ShowMessage('Eingabe ist keine Zahl');
    exit;
  end;
  FindeKombinationen('', Edit1.Text);
  memo1.Text := FKombinationen.text;
end;
Was ich noch gemacht habe, ist eine private Variable FKombinationen: TStringList in die Formularklasse aufzunehmen, die im FormCreate-Ereignis erzeugt und entsprechend beim Schließen des Formulars befreit wird. So ist es erstens etwas durchsichtiger, zweitens hast Du die Arbeit des Erzeugens der Kombinationen von der Anzeige getrennt (kannst sie also besser wiederverwenden) und vor allem geht es wesentlich schneller, am Schluss auf einen Schlag die ganze Liste dem Memo zuzuweisen als jedesmal eine Zeile anzuhängen (es sind immerhin sehr viele Ergebnisse).
(Außerdem musst Du natürlich noch einen Button3 hinzufügen).
Um es nachzuvollziehen, was da passiert, nimm eine kurze nummer mit zwei oder drei ziffern und gehe es schrittweise durch. Achte darauf, was mit den Werten von Prefix, Rest, neuPrefix und neuRest passiert. Und bedenke: Du springst dabei nicht immer in derselben Methode hin und her, sondern die Methode ruft sich selbst immer wieder als Methode auf. D.h. die lokalen Variablen sind immer neue.

Viel Erfolg damit
Urs


P.S.
ich finde das ganze übrigens eine lustige Idee. Leider gibt meine eigene Telefonnummer kein einziges irgendwie verwertbares Wort.
  Mit Zitat antworten Zitat