![]() |
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:
danke schon mal im vorraus für eure hilfe
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; |
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 |
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 |
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. |
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:
iNum als globale variable...
var
Form1: TForm1; iNum : integer; 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:
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...
procedure CreateTAPIRecord(iNum: Integer; sMSN, sIntBez: String);
procedure FreeTAPIRecord(iNum: Integer); gruß reli |
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 |
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.
|
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 |
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 10:38 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 by Thomas Breitkreuz