![]() |
Verbindung übergeben
Hallo zusammen,
ich frage mich gerade, ob - und wenn ja, wie - es funktionieren kann, auf einem Form eine Verbindung mit einem IdTCPClient zu öffnen, dann diese Verbindung an ein anderes Formular zu übergeben, und das erste Formular wieder zu schliessen. Hintergrund ist folgender. Ich habe eine Anwendung gebastelt, mit welcher sich der User zuerst an einem Server authentifizieren muss. Dazu habe ich ein Login-Formular gemacht. Dieses Login-Formular erstelle ich in meinem Hauptprogramm, noch bevor Application.Run aufgerufen wird. Das Login-Form wird modal angezeigt. In dem Formular kann der User seinen Benutzer-Namen und das Passwort angeben, dann wird eine Verbindung hergestellt, die Daten übertragen, und dann kommt vom Server entweder OK oder NICHT OK zurück. Entsprechend dieses Ergebnisses wird dann der modale Dialog entweder mit mrOK oder mrCancel geschlossen. Wenn der Dialog mir mrOK geschlossen wird, dann wird die Anwendung normal gestartet, ansonsten wird die Anwendung direkt wieder beendet. Das funktioniert soweit ganz gut. Aber sobald das Login-Form geschlossen wird, ist auch die Verbindung zum Server dahin. Ist es möglich, diese Verbindung aufrecht zu erhalten, und dann an das Main-Form zu übergeben? Sodass das Main-Form dann auch über diese bereits authentifizierte Verbindung mit dem Server kommunizieren kann, um z.B. Berechtigungsdaten abzufragen. Ich glaube in C, bzw. bei den WinSocks konnte man das Handle der Sock übergeben, und damit weiterarbeiten. Ist das mit Indy auch irgendwie möglich? ich hoffe ich mich verständlich ausgedrückt..:-) Gruß Christian |
Re: Verbindung übergeben
Es reicht, das Objekt selber zu übergeben, das hauptformular darf die Komponente im destructor aber nicht löschen. Das heisst wiederum, das Du die Komponente entweder dynamisch erzeugen musst oder aber den Parent auf das neue Form umbiegen musst.
Dann sollte das eigentlich kein Prolem sein. |
Re: Verbindung übergeben
Lege die TIdTCPClient-Komponente auf das Hauptformular und übergeb dem Login-Dialog nur eine Referenz dieser Komponente.
|
Re: Verbindung übergeben
Zitat:
|
Re: Verbindung übergeben
@ Phoenix: Danke, das hört sich schonmal gut an. Auf die Idee war ich nun noch gar net gekommen....irgendwie, obwohl sie ja recht logisch ist.
@ Bernhard Geyer: das geht nicht, da zu der Zeit, wie der Login-Dialog ausgeführt wird, das Hauptform noch gar nicht erstellt wurde. Würde es funktionieren, wenn ich die Komponente in dem Hauptprogramm erzeuge, dann erst ans Login übergebe, und danach ans Mainform? |
Re: Verbindung übergeben
Eine Idee wäre, z.B. ein Datenmodul zu erstellen, das die Verbindung beeinhaltet. Dieses Datenmodul und dessen Verbindung könnte dann sowohl vom Login- als auch vom Hauptformular verwendet werden.
|
Re: Verbindung übergeben
Klingt clever. :lol: THX. Also einfach die Verbindung in einen Container (Datenmodul) stellen, und dann darauf zugreifen. Stimmt, ist ja im Grunde das gleiche, wie die Verbindung zu einer Datenbank. Ein positiver Nebeneffekt ist noch, dass man es tatsächlich nur mit einer Verbindung zu tun hat, und nich durcheinander kommen kann.
|
Re: Verbindung übergeben
Zitat:
Du mußt jedoch darauf achten, das am Programmende irgendjemand dafür sorgt, das die Komponente wieder freigegeben wird. |
Re: Verbindung übergeben
das ganze sieht im Hauptprogramm etwa so aus (habe gerade kein Delphi da, deswegen nur aus dem Gedächtnis):
Delphi-Quellcode:
Es wird also die Anwendung initialisiert. Dann wird das frm_login erstellt, und mit ShowModal angezeigt. Wenn das Result mrOK ist, dann wird das Formular wieder freigegeben, die anderen Forms werden erstellt und die App wird gestartet. Ansonsten wird die App beendet. Das funktioniert soweit.
program MeineAnwendung;
uses .... begin Application.Initialize; with Tfrm_login.create(nil) do begin if showModal=mrOK then begin Free; Application.CreateForm(tfrm_main...); Application.Run; end else begin Free; Application.Terminate; end; end; end. |
Re: Verbindung übergeben
Ich halte zwar nicht viel davon die dpr-Unit entsprechend zu erweitern, aber was solls
Delphi-Quellcode:
program MeineAnwendung;
uses .... var TCPClient: IdTCPClient; begin Application.Initialize; TCPClient := IdTCPClient.Create(nil); with Tfrm_login.create(nil) do begin Client := TCPIPClient; if showModal=mrOK then begin Free; Application.CreateForm(tfrm_main...); Application.Run; end else begin Free; Application.Terminate; end; end; Application.CreateForm(TMainForm, MainForm); MainForm.Client := TCPClient; Application.Run; TCPClient.Free; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:06 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