Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Anrufmonitor --> Einer Rufnummer den Namen zuordnen (https://www.delphipraxis.net/179484-anrufmonitor-einer-rufnummer-den-namen-zuordnen.html)

ringli 10. Mär 2014 18:35

Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Hallo,

ich bin grade dabei mir mit Hilfe der Fritz!Box Komponente von Hier im Forum suchenGarfield (Danke dafür :) ) einen eigenen Anrufmonitor zu erstellen. Die Anrufe lasse ich mir im in einem NextGrid anzeigen. Jetzt würde ich natürlich gerne bei ein- bzw. ausgehenden Anrufen auch den Namen zur der entsprechenden Telefonnummer anzeigen lassen. Dies würde ich über ein programmeigenes Telefonbuch realisieren wollen (also nicht über das Fritz!Box-Telefonbuch!). Soviel zur Theorie.

Grundsätzlich müsste das ja in der Art
Delphi-Quellcode:
if Rufnummer = '123456' then Showmessage('Max Mustermann');
passieren.

Meine Frage ist jetzt:
Wie würdet ihr das mit dem Parsen am cleversten lösen? Schliesslich sind mehrere eigene Rufnummern (z.B. Wohnzimmer, Flur, Keller) möglich und zu jedem Namenseintrag in einem Telefonbuch sind auch mehrere Rufnummern (z.B. Fest, Mobil, Firma, etc.) denkbar.

Bin für jegliche Lösungs- bzw. Denkansätze dankbar. :)

sx2008 10. Mär 2014 19:03

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Nimm ne
Delphi-Quellcode:
TStringList
- die kannst du mit
Delphi-Quellcode:
SaveTofile()
speichern und mit
Delphi-Quellcode:
LoadFroFile()
laden.
Delphi-Quellcode:
// ablegen von Rufnummern
liste.Values['110'] := 'Notruf (Polizei)'
liste.Values['112'] := 'Notruf';
liste.Values['0900666666'] := 'Sexy Hotline';

// auslesen einer Rufnummer
anrufername := liste.Values['112'];

Garfield 10. Mär 2014 21:15

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Ich lade mir die Originalliste von der Fritzbox (XML) herunter und gehe die Liste der Kontakte und Telefonnummern durch. Ist der Kontakt gefunden kann man Namen und Bild in einer Box anzeigen. Anderenfalls kann man eine Rückwärtssuche im Internet vornehmen.

Sir Rufo 10. Mär 2014 21:26

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Eine Telefonnummer ist auch immer abhängig vom Kontext.

Diese Rufnummern zeigen alle auf den gleichen Anschluss, wenn man sich in Deutschland im Vorwahlbereich 888 befindet:
Code:
00498887654321
+498887654321
08887654321
7654321
Für eine zuverlässige Suche wird also auch der Kontext benötigt.

Garfield 10. Mär 2014 22:30

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Die Fritzbox gibt nationale Rufnummern mit OKZ und OKZPrefix an. Dabei wird die OKZ bei aktueller Firmware nicht mehr weggelassen, wenn der Anruf aus demselben Vorwahlbereich kommt.

ringli 11. Mär 2014 08:47

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Danke für die Antworten. :-)

@sx2008: Diese Möglichkeit kannte ich noch gar nicht. Mal sehen ob ich mir daraus etwas basteln kann oder ob ich doch auf die Möglichkeiten vom NextGrid zurückgreife.

@Garfield: Das Fritz!Box Telefonbuch wollte ich eigentlich nicht benutzen, zumal ich mit XML nicht wirklich warm werde... :-(

Sir Rufo 11. Mär 2014 08:58

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Zitat:

Zitat von ringli (Beitrag 1251496)
@sx2008: Diese Möglichkeit kannte ich noch gar nicht. Mal sehen ob ich mir daraus etwas basteln kann oder ob ich doch auf die Möglichkeiten vom NextGrid zurückgreife.

:shock: Controls sind zum Anzeigen von Daten gedacht und nicht als Datenspeicher!

mquadrat 11. Mär 2014 09:06

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
ich nehme mal an das NextGrid hat sowas wie das Grid von TMS: SaveAsCsv, SaveAsXml, ...

Garfield 11. Mär 2014 11:13

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Zitat:

Zitat von ringli (Beitrag 1251496)
@Garfield: Das Fritz!Box Telefonbuch wollte ich eigentlich nicht benutzen, zumal ich mit XML nicht wirklich warm werde... :-(

Mit XML habe ich auch so meine Probleme. Aber für das Lesen der Namen und Nummern braucht man nicht viel. In der Demo sind das auch nur ein paar Zeilen um Namen und Telefonnummern in ein TListView zu übertragen. Sie hat nur den Fehler, das nicht berücksichtigt wird das die maximal drei Telefonnummern vom selben Typ sein können.

ringli 11. Mär 2014 21:13

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1251497)
:shock: Controls sind zum Anzeigen von Daten gedacht und nicht als Datenspeicher!

Ja weiß ich. Deswegen habe ich ja nach einer cleveren Lösung gefragt obwohl die Möglichkeiten des Grids ja wirklich verlockend sind... :oops:

Zitat:

Zitat von mquadrat (Beitrag 1251499)
ich nehme mal an das NextGrid hat sowas wie das Grid von TMS: SaveAsCsv, SaveAsXml, ...

Ja, genau so ist es.

Sir Rufo 12. Mär 2014 08:03

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Zitat:

Zitat von ringli (Beitrag 1251594)
Zitat:

Zitat von Sir Rufo (Beitrag 1251497)
:shock: Controls sind zum Anzeigen von Daten gedacht und nicht als Datenspeicher!

Ja weiß ich. Deswegen habe ich ja nach einer cleveren Lösung gefragt obwohl die Möglichkeiten des Grids ja wirklich verlockend sind... :oops:

Na dann bau dir doch da einfach was ...

Anfangen müsstest du mit der Beschreibung, was geht rein und was soll rauskommen.

Also eventuell so?
Delphi-Quellcode:
type
  TPhoneNumberResolver = class abstract
  public
    function GetPersonFrom( const APhoneNumber : string ) : string; virtual; abstract;
  end;
Eine simple konkrete Klasse wäre dann z.B.
Delphi-Quellcode:
type
  TSimplePhoneNumberResolver = class( TPhoneNumberResolver )
  private
    FPhoneNumberStrings : TStrings;
  public
    constructor Create( APhoneNumberStrings : TStrings );
    destructor Destroy; override;
    function GetPersonFrom( const APhoneNumber : string ) : string; override;
  end;

constructor TSimplePhoneNumberResolver.Create( APhoneNumberStrings : TStrings );
begin
  inherited Create;
  FPhoneNumberStrings := TStringList.Create;
  FPhoneNumberStrings.Assign( APhoneNumberStrings );
end;
 
destructor TSimplePhoneNumberResolver.Destroy;
begin
  FPhoneNumberStrings.Free;
  inherited;
end;

function GetPersonFrom( const APhoneNumber : string ) : string;
begin
  Result := FPhoneNumberStrings.Values[APhoneNumber];
end;
Je nachdem wie gut deine Programmierkenntnisse voranschreiten, kannst du die konkrete Ableitung noch verbessern oder eine neue, raffiniertere zusammenbauen.

Deine Anwendung selber bleibt aber gleich, denn die spricht nur die abstrakte Klasse an und der Aufruf bleibt gleicht ;)

Sir Rufo 12. Mär 2014 08:39

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Und hier eine Klasse, die Telefonnummern in Abhängigkeit des Kontexts normalisiert und vergleicht
Delphi-Quellcode:
type
  TPhoneContext = record
    IntlPrefix : string;
    IntlNumber : string;
    NatPrefix : string;
    NatNumber : string;
  end;

const
  MunichPhoneContext : TPhoneContext = ( IntlPrefix : '00'; IntlNumber : '49'; NatPrefix : '0'; NatNumber : '89' );

type
  TPhoneNumberComparer = class
  private
    FContext : TPhoneContext;
    function NumberClearing( const Number : string ) : string;
  public
    property Context : TPhoneContext read FContext write FContext;
    function NormalizeNumber( const Number : string ) : string;
    function IsSameNumber( const Number1, Number2 : string ) : Boolean;
  end;

  { TPhoneNumberComparer }

function TPhoneNumberComparer.IsSameNumber( const Number1, Number2 : string ) : Boolean;
begin
  Result := NormalizeNumber( Number1 ) = NormalizeNumber( Number2 );
end;

function TPhoneNumberComparer.NormalizeNumber( const Number : string ) : string;
begin
  Result := NumberClearing( Number );

  if Result.StartsWith( '+' ) then
    Result := Context.IntlPrefix + Result.Substring( 1 );

  if Result.StartsWith( Context.IntlPrefix + Context.IntlNumber ) then
  begin
    Result := Context.NatPrefix + Result.Substring( Length( Context.IntlPrefix + Context.IntlNumber ) );
  end;

  if Result.StartsWith( Context.NatPrefix + Context.NatNumber ) then
  begin
    Result := Result.Substring( Length( Context.NatPrefix + Context.NatNumber ) );
  end;
end;

function TPhoneNumberComparer.NumberClearing( const Number : string ) : string;
var
  LIdx : Integer;
  LChar : Char;
begin
  Result := '';

  for LIdx := 0 to Number.Length - 1 do
  begin
    case Number.ToUpper.Chars[LIdx] of
      'A', 'B', 'C' :
        LChar := '2';
      'D', 'E', 'F' :
        LChar := '3';
      'G', 'H', 'I' :
        LChar := '4';
      'J', 'K', 'L' :
        LChar := '5';
      'M', 'N', 'O' :
        LChar := '6';
      'P', 'Q', 'R', 'S' :
        LChar := '7';
      'T', 'U', 'V' :
        LChar := '8';
      'W', 'X', 'Y', 'Z' :
        LChar := '9';
      '+', '0' .. '9' :
        LChar := Number.Chars[LIdx];
    else
      LChar := #0;
    end;

    if LChar <> #0 then
      Result := Result + LChar;
  end;
end;
UPDATE
Jetzt frisst das Teil eigentlich (fast) alles
Code:
NormalizeNumber:
+49 89 BEIL => 2345
+49 89 2345 => 2345
(089) 2345 => 2345
+48 89 234-5 => 0048892345
Diese (komischen) Konstrukte
Code:
+49 (089) 2345
frisst er nicht (mag er auch nicht) ;)

ringli 12. Mär 2014 18:40

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Wow! :shock:

Danke das du dir soviel Arbeit gemacht hast SirRufo. :thumb: Ich werde mich am Wochenende daran begeben, deinen Code in mein Programm zu integrieren.

Garfield 14. Mär 2014 07:10

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
So wie ich mitbekommen habe, werden die nationalen Rufnummern auf Ortskennzahlenprefix, Ortskennzahl und Rufnummer normalisiert. Früher (bis 5.**?) wurde die OKZ weggelassen, wenn der Gesprächspartneer die selbe hatte. Bei internationalen Nummern weiß ich es nicht. Sir Rufos Klasse könnte bei der Wählhilfe sehr interessant sein.

QuickAndDirty 14. Mär 2014 13:04

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Zitat:

Zitat von Garfield (Beitrag 1251965)
So wie ich mitbekommen habe, werden die nationalen Rufnummern auf Ortskennzahlenprefix, Ortskennzahl und Rufnummer normalisiert. Früher (bis 5.**?) wurde die OKZ weggelassen, wenn der Gesprächspartneer die selbe hatte. Bei internationalen Nummern weiß ich es nicht. Sir Rufos Klasse könnte bei der Wählhilfe sehr interessant sein.

Internationale telefonieren ist super übel.

Du hast beim Telefon sogenannte Exitcodes.
Exitcode für die Stadt = 0
Exitcode für die Nation = 00
dahinter wählt man dann die Nummer des Länder Knotens+Statdtknoten oder die Nummer des Stadtknotens.

Leider gibt es dann noch Mobilfunknetze die gelten als eigene stadt.
In Europa ist das mit den Exit codes auf 0 und 00 genormt, aber es gibt Ausnahmen
In Italien wurden die Rufnummern knapp. Also hat man dort die 0+Vorwahl in die telefonnummer integriert. Es gibt da keine Stadt Vorwahlen mehr. Ruft man in Südtirol an muss die 0 nach der Vorwahl für Italien mit angewählt werden.

Es wird lustiger.
Wenn du in den USA bist, ist 00 nicht der nationale exit code sondern 011.
Bei Kuba ist es 119

Wenn man von den USA aus bestimmte britische Inseln in der Caribik anrufen will. muss man wiederum kein internationales gespräch führen.
In den USA ist außerdem der exit code für die Stadt, von Ort zu Ort verschieden.

Telefonieren ohne Standort Informationen geht nicht.

p80286 14. Mär 2014 14:42

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Hast Du dafür Quellen?
das sind sehr interessante Informationen.

Gruß
K-H

QuickAndDirty 14. Mär 2014 16:31

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Zitat:

Zitat von p80286 (Beitrag 1252023)
Hast Du dafür Quellen?
das sind sehr interessante Informationen.

Gruß
K-H

Ich habe mir das alles mal mühsam recherchiert.
Aber es gibt diverse Quellen die man findet, wenn man in Google danach sucht.
Also es ist einfacher Belege für die Richtigkeit dessen was ich schrieb zu finden, als das von null an zu recherchieren.


Also quellen für alles? Such selbst!
Wenn dich eine bestimmte Sache interessiert , könnte ich dir evtl helfen.

Garfield 17. Mär 2014 06:59

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Zur Rufnummeranzeige hab ich dies gefunden: http://www.ip-phone-forum.de/showthread.php?t=126270

p80286 17. Mär 2014 09:52

AW: Anrufmonitor --> Einer Rufnummer den Namen zuordnen
 
Da hat sich aber einiges getan.
Falls jemand auch einen Einstieg sucht
Wikipedia
oder World telephone numbering guide

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:13 Uhr.

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