Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Hilfe für TAPI (https://www.delphipraxis.net/104204-hilfe-fuer-tapi.html)

michagolf4 29. Nov 2007 08:53


Hilfe für TAPI
 
Hi leute,

ich bin gerade dabei ein Prog zu schreiben was die telefone in unserer firma überwacht (soll mir den status anzeigen) und die telefonnummern abspeichern die angerufen haben und die jeweiligen kunden dazu aus unserer datenbank ausließt.
das problem ist wenn mehrere zu gleich angerufen werden dann wird ein fehler ausgelöst ich weiss auch warum das so ist aber ich weiss nicht wie ich es beheben kann

ich bin für jeden tip dankbar

hier mein code
Code:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, TAPILines, TAPICall, TAPIDevices, TAPISystem,
  TAPIServices, TAPIAddress, StdCtrls, ExtCtrls, AssistedTAPI;

type

  recTAPIElemente = record
    LineDevice : TTAPILineDevice;
    Line      : TTAPILine;
    call      : TTAPICall;
    address   : TTAPIAddress;
  end;

  TForm1 = class(TForm)
    TAPILineService1: TTAPILineService;
    bt_close: TButton;
    TAPILineDevice1: TTAPILineDevice;
    TAPILine1: TTAPILine;
    TAPICallMonitor1: TTAPICall;
    TAPIAddress1: TTAPIAddress;
    Memo1: TMemo;
    procedure bt_closeClick(Sender: TObject);



   procedure StateDisconnected(Sender: TObject;
      DisconnectedMode: TLineDisconnectMode; Rights: TLineCallPrivilege);
    procedure StateConnected(Sender: TObject;
      ConnectedMode: TLineConnectedModes; Rights: TLineCallPrivilege);
    procedure InfoCallerId(Sender: TObject);
    procedure AppNewCall(Sender: TObject; Call: TTAPICall;
     AddressID: Cardinal; Privilege: TLineCallPrivilege);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure StateRinging(Sender: TObject; RingModeIndex,
      RingCounter: Cardinal);

  private
    { Private-Deklarationen }
  public
    tapiarray : array of recTAPIElemente;

    procedure CreateTAPIRecord(iNum: Integer; sMSN, sIntBez: String);
    procedure FreeTAPIRecord(iNum: Integer);
 end;

var
  Form1: TForm1;
  iNum : integer;

 
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i : integer;
begin
  TAPILineService1.Active := true;
  SetLength(tapiarray, 3);
  for i := 0 to TAPILineService1.NumDevice -1 do
  begin
    TAPILineDevice1.ID := i;
    if mmInteractiveVoice in TAPILineDevice1.Caps.MediaModes then
    begin
      CreateTAPIRecord(0, 'elmeg NSt. 10', 'Zentrale');
      CreateTAPIRecord(1, 'elmeg NSt. 11', 'Dirk');
      CreateTAPIRecord(2, 'elmeg NSt. 12', 'Katharina');
      CreateTAPIRecord(3, 'elmeg NSt. 13', 'Doreen');
      CreateTAPIRecord(4, 'elmeg NSt. 14', 'Test');
      CreateTAPIRecord(5, 'elmeg NSt. 15', 'Dominike');
    end;
  end;
end;


procedure TForm1.FormDestroy(Sender: TObject);
var
  i: Integer;
begin
  // Die X Telefone wieder freigeben
  for i := 0 to High(tapiarray)-1 do
    FreeTAPIRecord(i);

  // und das Array löschen
  Finalize(tapiarray);
end;


procedure TForm1.CreateTAPIRecord(iNum: Integer; sMSN, sIntBez: String);
begin
  with tapiarray[iNum] do begin
    // erstellt das Leitungsgerät und verbindet es mit dem Leitungsservice
    LineDevice          := TTAPILineDevice.Create(self);
    LineDevice.Service  := TAPILineService1;
    LineDevice.OnStateRinging := StateRinging;

    // ertellt die Leitung und legt die Eigenschaften fest
    Line                := TTAPILine.Create(self);
    Line.Device         := LineDevice;
    Line.CallPrivilege  := [cpOwner];
    Line.MediaModes     := [mmInteractiveVoice];

    // erstellt den CallMonitor und legt Eigenschaften fest
    call                := TTAPICall.Create(self);
    call.CompletionMode := lccmMessage;
    call.OnInfoCallerId := InfoCallerID;
    call.OnStateConnected := StateConnected;
    call.OnStateDisconnected := StateDisconnected;

    // erstellt die Adresse und verbindet diese mit anderen geräten
    address             := TTAPIAddress.Create(self);
    address.InboundCall := call;
    address.Line        := Line;
    address.MonitorCall := call;
    address.Address     := sMSN;
    address.OnAppNewCall := AppNewCall;

  end;
end;

procedure TForm1.FreeTAPIRecord(iNum: Integer);
begin
  // gibt alle sich im Array gerstellten Geräte wider frei
  with tapiarray[iNum] do begin
    LineDevice.Free;
    Line.Free;
    call.Free;
    address.Free;
  end;
end;

procedure TForm1.bt_closeClick(Sender: TObject);
begin
  Close;
end;


procedure TForm1.FormShow(Sender: TObject);
var
  iNum,
  i     : integer;

begin
  //aktiviert den Leitungsservice um die Leitungsüberwachung zu ermöglichen

  for iNum := 0 to High(tapiarray)-1 do
  begin
   for i := 0 to TAPILineService1.NumDevice -1 do
   begin
     tapiarray[iNum].LineDevice.ID := i;
     if tapiarray[iNum].LineDevice.Caps.Name = tapiarray[iNum].address.Address then
     begin
       if (mmInteractiveVoice in tapiarray[iNum].LineDevice.Caps.MediaModes) and (cpowner in tapiarray[iNum].Line.CallPrivilege) then
       begin
         //ShowMessage(tapiarray[iNum].LineDevice.Caps.Name);
         tapiarray[iNum].Line.Active := true;
         tapiarray[iNum].LineDevice.Service.Active := true;
         if not tapiarray[iNum].Address.Active then tapiarray[iNum].Address.Active := true;
       end;
   end;
  end;
end;

end;
///////////////////////////////////////////////////////////////////////////////
//TAPI Ereignisse
///////////////////////////////////////////////////////////////////////////////
procedure TForm1.StateRinging(Sender: TObject; RingModeIndex,
      RingCounter: Cardinal);
begin
  Memo1.Lines.Add('Es klingelt bei '+ tapiarray[iNum].LineDevice.Caps.Name);
end;


procedure TForm1.InfoCallerId(Sender: TObject);
var
  nummer : string;
begin
  nummer := tapiarray[iNum].call.Info.CallerID;
  if nummer = '' then nummer := '****';

  Memo1.Lines.Add('Nr. '+nummer+' ruft bei '+tapiarray[iNum].LineDevice.Caps.Name+'an!');
end;


procedure TForm1.StateConnected(Sender: TObject;
  ConnectedMode: TLineConnectedModes; Rights: TLineCallPrivilege);
begin
  Memo1.Lines.Add(tapiarray[iNum].LineDevice.Caps.Name +'im Telefonat!');
end;

procedure TForm1.StateDisconnected(Sender: TObject;
  DisconnectedMode: TLineDisconnectMode; Rights: TLineCallPrivilege);
begin
  tapiarray[iNum].call.DeallocateCall;
  Memo1.Lines.Add(tapiarray[iNum].LineDevice.Caps.Name +' hat Aufgelegt!');
end;


procedure TForm1.AppNewCall(Sender: TObject; Call: TTAPICall;
  AddressID: Cardinal; Privilege: TLineCallPrivilege);
begin

  Memo1.Lines.Add(tapiarray[iNum].LineDevice.Caps.Name+' hat den Hörer abgenommen');
end;
danke schon mal im vorraus für eure hilfe

Der_Unwissende 29. Nov 2007 09:02

Re: Hilfe für TAPI
 
Hi und erstmal Herzlich Willkommen in der DP :dp:

Hier wird Dir sicherlich gerne geholfen, aber dazu musst Du auch ein paar Dinge beachten. So kann man Dir immer gut helfen (und es wird bereitwillig gemacht), wenn es auch genug Info's von Deiner Seite gibt.
In Deiner Beschreibung des Problems sagst Du nur, dass es einen Fehler gibt, den Du sogar erklären kannst :shock:

Jetzt frag ich mich nur, wenn er bekannt ist und Du ihn erklären kannst, warum nennst und erklärst Du ihn nicht? Wo genau tritt der Fehler auf? Was für ein Fehler tritt auf? Und wenn es bekannt ist, warum tritt der Fehler auf?

Dann noch ein kleiner Tipp, statt dem Code-Tag gibt es auch ein Delphi-Tag, da wird dann auch Syntaxhighlighting für Delphi aktiv, kann man einfach besser lesen. Es bietet sich aber auch an, dass Du immer nur die relevanten Code-Stellen postest (übersichtlicher, leichter zu lesen) und den Code ggf. einfach als Zip (nur den Source, die DFMs und das Projektfile) anhängst (dann kann jeder den Code auch im Debugger laufen lassen, bringt ja auch seine Vorteile).

Gruß Der Unwissende

michagolf4 29. Nov 2007 09:10

Re: Hilfe für TAPI
 
ok ich werds mir merken

also der fehler tritt auf wenn ein 2.telefon zur selben zeit in das selbe ereigniss spring und es ist ja auch logisch das die procedure nicht zwei mal zur selben zeit ausgeführt werden kann ich weiss aber nicht wie ich meinen code umbauen kann um diesen fehler zu umgehen

noch zur info ich benutze die tapi komponenten vom delphi club

tschö michagolf4

RavenIV 29. Nov 2007 09:12

Re: Hilfe für TAPI
 
Irgendwie kommt mir die Sache so bekannt vor.
Kann es sein, dass Du für meinen ehemaligen Arbeitgeber arbeitest?

Ich hab damals die gleichen TAPI-Komponenten benutzt und auch sonst sieht es ähnlich aus.

Relicted 29. Nov 2007 09:17

Re: Hilfe für TAPI
 
moinsen!

bei deinem problem kann ich dir gerade nicht helfen... aber vielleicht eine kleine anmerkung am rande zum thema variablenbenennung/stil

Delphi-Quellcode:
var
  Form1: TForm1;
  iNum : integer;
iNum als globale variable...
besser:
private/public variable der klasse mit namen "fNum", "m_nNum" oder wie auch immer ihr das handhabt... wenn sie wirklich global sein muss dann gib ihr auch einen etwas eindeutigeren namen, denn

Delphi-Quellcode:
    procedure CreateTAPIRecord(iNum: Integer; sMSN, sIntBez: String);
    procedure FreeTAPIRecord(iNum: Integer);
das ist einfach etwas verwirrend und kann zu bösen effekten führen... du könntest auch hier einfach mal die iNum's umbenennen... is leider immer extrem schwer zu verstehen welches jetzt wo benutzt wird und wo zugewiesen etc...

gruß
reli

michagolf4 12. Dez 2007 10:53

Re: Hilfe für TAPI
 
kann mir denn niemand weiter helfen

die instabilität von TAPI konnte ich schon beseitigen lag aber an unserer Telefon Anlage.

Wo es immer noch einen Fehler gibt ist wenn 2 oder mehr geräte zur gleichen Zeit das gleiche Event haben und somit mehrere Geräte in die selbe Procedure wollen. Da das meines Wissens aber nicht möglich ist weiss ich nicht wie ich dies beheben soll.
Hat vll. jemand eine tolle idee dazu.
Danke schon mal im vorraus

tschö michagolf4

Wotan89 12. Dez 2007 12:45

Re: Hilfe für TAPI
 
Ich kenn mich leider wenig aus, aber kannst du nicht mit CreateThread für jede Bearbeitung einen Thread erstellen und durch WaitForSingleObject verhindern, dass der gleiche Eintrag o.ä. "gleichzeitig" bearbeitet und verändert wird.

michagolf4 19. Dez 2007 09:24

Re: Hilfe für TAPI
 
Liste der Anhänge anzeigen (Anzahl: 1)
@ Mapfer hir die TAPI Komponente
einfach mal testen ob sie unter 2006 auch läuft aber wie schon gesagt ich benutze sie unter delphi 7



@ Wotan89 danke für den Tip hat auch so funktioniert und ist jetz soweit für die internen benutzung unserer firma bereit

danke auch an alle anderen die mir so nett geholfen haben
delphi praxis is echt klasse :dp:


tschö michagolf4

Mapfer 19. Dez 2007 10:40

Re: Hilfe für TAPI
 
Herzlichen Dank.
Die Installation hat geklappt.

Nun werde ich ein wenig die Tapi Komponenten ausprobieren ;-)

Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 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