Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Postleitzahl mit Ort verknüpfen (https://www.delphipraxis.net/80941-postleitzahl-mit-ort-verknuepfen.html)

Steven2 17. Nov 2006 19:08


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:
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;
Grüsse
Steven

marabu 17. Nov 2006 19:18

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

ErazerZ 17. Nov 2006 19:26

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;

Steven2 17. Nov 2006 19:30

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

TKC 17. Nov 2006 19:48

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;

marabu 17. Nov 2006 19:53

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:
 
begin
  // ...
  index := MyList.IndexOfName(PlzEdit.Text + ' ');
  // edit: ValueFromIndex[] - und nicht ValueFromIndex()
  OrtEdit.Text := IfThen(index < 0, '', Trim(MyList.ValueFromIndex[index]);
  // ...
end;
Gute Nacht

ErazerZ 17. Nov 2006 20:05

Re: Postleitzahl mit Ort verknüpfen
 
Delphi-Quellcode:
{
  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;
und Bsp.
Delphi-Quellcode:
  ShowMessage(NameOfIndex(MyList, IndexOf(MyList, 'dres')));
Meintest du vielleicht soetwas?

Steven2 17. Nov 2006 20:21

Re: Postleitzahl mit Ort verknüpfen
 
So viele Sourcen, es klappt nun

So schaut's aus:

Delphi-Quellcode:
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;
Danke an alle ! :feuerchen:

marabu 17. Nov 2006 20:26

Re: Postleitzahl mit Ort verknüpfen
 
Besser so:

Delphi-Quellcode:
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 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.

Und herzlich willkommen in der DP, Steven.

Freundliche Grüße

TKC 17. Nov 2006 20:32

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;

Steven2 17. Nov 2006 21:12

Re: Postleitzahl mit Ort verknüpfen
 
Hallo Marabu
Zitat:

Und herzlich willkommen in der DP, Steven.
Danke für die Willkommensgrüße :cheers:

Zitat:

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.
Muss ich dann zum Programmstart einfach nur die Datei so laden

Delphi-Quellcode:
var
  MyList: THashedStringList;
...
begin
  MyList := THashedStringList.Create;
  MyList.LoadFromFile(
    ExtractFilePath(Application.ExeName) + 'plzDat.txt');
...
hab's dann zum Programmende wieder freigegeben, kommt aber folgende meldung
Zitat:

---------------------------
Stack-Überlauf.
---------------------------
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
var
  MyList: THashedStringList;
begin
 MyList.Free;
end;
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.

Grüße
Steven

raiguen 17. Nov 2006 22:52

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:
...
  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;
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...

Steven2 18. Nov 2006 12:10

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:
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;
Grüsse, Steven

marabu 18. Nov 2006 14:49

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

Steven2 18. Nov 2006 18:01

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