![]() |
Postleitzahl mit Ort verknüpfen
Hallo
ich habe eine Textdatei in der alle Postleitzahlen mit den dazugehörigen Orten in folgendem Format: Zitat: 01003 = Dresden Ich möchte folgendes machen: ich habe zwei Tedits, in das eine schreibe ich die Postleitzahl z.B. 01003 dann soll in dem anderen TEdit der Ort automatisch eingetragen werden. Komme mit folgendem Beispiel nicht weiter, wenn ich zum Beispiel nach 01003 = Dresden suche bekomme ich die Zeile und den Inhalt angezeigt. Suche ich aber nur nach 01003 wird nichts gefunden.
Delphi-Quellcode:
Grüsse
procedure TForm1.Button8Click(Sender: TObject);
var MyList: THashedStringList; Index, i: Integer; begin MyList := THashedStringList.Create; MyList.LoadFromFile( ExtractFilePath(Application.ExeName) + 'plzDat.txt'); try if MyList.Find('01003 = Dresden', Index) then //später dann das edit begin for i := 0 to MyList.Count - 1 do begin if MyList[i] = '01003 = Dresden' then //später dann das edit begin Edit2.text := MyList[i]; Edit3.text := IntToStr(Index); end; end; end; finally MyList.Free; end; end; Steven |
Re: Postleitzahl mit Ort verknüpfen
Hallo Steven,
mit ein wenig Glück kommst du mit der Methode IndexOfName() besser voran. Grüße vom marabu |
Re: Postleitzahl mit Ort verknüpfen
Versuch das mal
Delphi-Quellcode:
var
MyList: THashedStringList; i: Integer; Ort, PLZ: String; begin MyList := THashedStringList.Create; MyList.LoadFromFile(ExtractFilePath(Application.ExeName) + 'plzDat.txt'); if MyList.Find('01003 = Dresden', i) then begin PLZ := Trim(Copy(MyList[i], 1, Pos('=', MyList[i]) -1)); Ort := Trim(Copy(MyList[i], Pos('=', MyList[i]) +1, Length(MyList[i]))); ShowMessage(Format('"%s - %s"', [PLZ, Ort])); end; MyList.Free; |
Re: Postleitzahl mit Ort verknüpfen
Hallo Marabu
Ich bin schon am suchen. Hallo ErazerZ Das haut hin, wenn ich in Edit1 nur die PLZ angeben dann haut das auch mit deinem Beispiel nicht hin. ODer sehe ich das falsch? Grüße vom Steven |
Re: Postleitzahl mit Ort verknüpfen
Ich würde es so machen ...
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var sl : TStringList; Indx : Integer; begin sl := TStringList.Create; sl.LoadFromFile(ExtractFilePath(Application.ExeName) + 'plzDat.txt'); //Leerzeichen vor und nach dem = entfernen sl.Text := StringReplace(sl.Text, ' = ', '=', [rfReplaceAll]); Indx := sl.IndexOfName(Edit1.Text); if Indx < 0 then Exit; Edit2.Text := sl.ValueFromIndex[Indx]; Edit3.Text := IntToStr(Indx); sl.Free; end; |
Re: Postleitzahl mit Ort verknüpfen
Hast du wirklich die Leerstellen rund um den NameValueSeparator in deiner Datei? Dann geht auch das hier:
Delphi-Quellcode:
Gute Nachtbegin // ... index := MyList.IndexOfName(PlzEdit.Text + ' '); // edit: ValueFromIndex[] - und nicht ValueFromIndex() OrtEdit.Text := IfThen(index < 0, '', Trim(MyList.ValueFromIndex[index]); // ... end; |
Re: Postleitzahl mit Ort verknüpfen
Delphi-Quellcode:
und Bsp.
{
MyList = Deine StringList SucheNach = Nach was sollte gesucht werden? StartFrom = Von welchem Index sollte gesucht werden (evtl. Weitersuchen) CaseSentive = Groß- und Kleinbuchstaben unterscheiden } function IndexOf(const MyList: THashedStringList; SuchenNach: String; StartFrom: Integer = 0; CaseSensitive: Boolean = False): Integer; var i: Integer; s: String; begin Result := -1; for i := StartFrom to MyList.Count -1 do begin s := MyList[i]; if not CaseSensitive then begin s := LowerCase(s); SuchenNach := LowerCase(SuchenNach); end; if Pos(SuchenNach, s) > 0 then begin Result := i; Exit; end; end; end; function NameOfIndex(const MyList: THashedStringList; Index: Integer): String; begin Result := Trim(Copy(MyList[Index], Pos('=', MyList[Index]) +1, Length(MyList[Index]))); end; function PLZOfIndex(const MyList: THashedStringList; Index: Integer): String; begin Result := Trim(Copy(MyList[Index], 1, Pos('=', MyList[Index]) -1)); end; function NameAndPLZOfIndex(const MyList: THashedStringList; Index: Integer): String; begin Result := MyList[Index]; end;
Delphi-Quellcode:
Meintest du vielleicht soetwas?
ShowMessage(NameOfIndex(MyList, IndexOf(MyList, 'dres')));
|
Re: Postleitzahl mit Ort verknüpfen
So viele Sourcen, es klappt nun
So schaut's aus:
Delphi-Quellcode:
Danke an alle ! :feuerchen:
procedure TForm1.Button8Click(Sender: TObject);
var MyList: THashedStringList; Index, i: Integer; begin MyList := THashedStringList.Create; MyList.LoadFromFile( ExtractFilePath(Application.ExeName) + 'plzDat.txt'); try begin for i := 0 to MyList.Count - 1 do begin index := MyList.IndexOfName(PlzEdit.Text + ' '); OrtEdit.Text := IfThen(index < 0, '', Trim(MyList.ValueFromIndex[index])); end; end; finally MyList.Free; end; end; |
Re: Postleitzahl mit Ort verknüpfen
Besser so:
Delphi-Quellcode:
Und noch besser, wenn du die Liste nicht bei jedem Klick auf den Button erstmal laden musst. Lade sie doch einach nur einmal zu Beginn deines Programms.
procedure TForm1.Button8Click(Sender: TObject);
var MyList: THashedStringList; Index, i: Integer; begin MyList := THashedStringList.Create; try MyList.LoadFromFile(ExtractFilePath(Application.ExeName) + 'plzDat.txt'); index := MyList.IndexOfName(Trim(PlzEdit.Text) + ' '); OrtEdit.Text := IfThen(index < 0, '', Trim(MyList.ValueFromIndex[index])); finally MyList.Free; end; end; Und herzlich willkommen in der DP, Steven. Freundliche Grüße |
Re: Postleitzahl mit Ort verknüpfen
Für was um Gottes Willen durchläufst du denn die ganze Stringlist ...
das reicht auch !!!
Delphi-Quellcode:
procedure TForm1.Button8Click(Sender: TObject);
var MyList: THashedStringList; Index: Integer; begin MyList := THashedStringList.Create; MyList.LoadFromFile( ExtractFilePath(Application.ExeName) + 'plzDat.txt'); try index := MyList.IndexOfName(PlzEdit.Text + ' '); If index > -1 Then OrtEdit.Text := Trim(MyList.ValueFromIndex[index]); finally MyList.Free; end; end; |
Re: Postleitzahl mit Ort verknüpfen
Hallo Marabu
Zitat:
Zitat:
Delphi-Quellcode:
hab's dann zum Programmende wieder freigegeben, kommt aber folgende meldung
var
MyList: THashedStringList; ... begin MyList := THashedStringList.Create; MyList.LoadFromFile( ExtractFilePath(Application.ExeName) + 'plzDat.txt'); ... Zitat:
Delphi-Quellcode:
Mir ist nicht ganz klar wie ich das machen muss. Ist aber auch vielleicht nicht ganz so wichtig, ist ja auch so ganz schön schnell.
procedure TForm1.FormDestroy(Sender: TObject);
var MyList: THashedStringList; begin MyList.Free; end; Grüße Steven |
Re: Postleitzahl mit Ort verknüpfen
Moin :-)
So müsstes du das machen, um die StringList beim Programmstart einmalig zu laden und bei Programmende wieder freizugeben:
Delphi-Quellcode:
Also im Pronzip recht simpel: MyList als private deklarieren, im FormCreate erzeugen und laden, Suchläufe beliebig oft durchführen und im FormDestroy() MyList wieder freigeben...
...
private { Private declarations } MyList: THashedStringList; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin MyList := THashedStringList.Create; MyList.LoadFromFile( ExtractFilePath(Application.ExeName) + 'plzDat.txt'); ... end; //--angepasste proc von ACE-ppc: procedure TForm1.Button8Click(Sender: TObject); var Index: Integer; begin index := MyList.IndexOfName(PlzEdit.Text + ' '); If index > -1 Then OrtEdit.Text := Trim(MyList.ValueFromIndex[index]); end; //--jetzte erst die Liste freigeben procedure TForm1.FormDestroy(Sender: TObject); begin ... MyList.Free; ... end; |
Re: Postleitzahl mit Ort verknüpfen
Hallo Raiguen. Dankeschön für die Hilfe.
Eine letzte Frage habe ich doch noch zu dem Thema, können auch andere Trenner verwendet werden anstatt 01054 = Dresden auch sowas 01054;Dresden? ich habs versuch, bekomme aber nichts angezeigt.
Delphi-Quellcode:
Grüsse, Steven
procedure TForm3.Button1Click(Sender: TObject);
var MyList: THashedStringList; Index: Integer; begin MyList := THashedStringList.Create; MyList.LoadFromFile( ExtractFilePath(Application.ExeName) + 'plzdat.txt'); try index := MyList.IndexOfName(Plz_edit.Text + ' '); // hier hab ich schon einiges ausprobiert If index > -1 Then Ort_edit.Text := Trim(MyList.ValueFromIndex[index]); finally MyList.Free; end; end; |
Re: Postleitzahl mit Ort verknüpfen
Hallo Steven,
das Trennzeichen ist standardmäßig ein Gleichheitszeichen, aber du kannst über die Eigenschaft NameValueSeparator auch fast jedes andere Zeichen einstellen. Die Tatsache, dass es sich um ein einziges Zeichen handelt, ist auch Schuld daran, dass ich beim Suchen eine Leerstelle anhängen und beim gefundenen Eintrag die führende Leerstelle mit Trim() entfernen musste. Freundliche Grüße |
Re: Postleitzahl mit Ort verknüpfen
Hallo marabu
und schon wieder was gelernt. [EDIT] funktioniert super :) Danke Steven |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz