![]() |
Formular geöffnet ist
Hallo, gibt es eine Möglichkeit im Netzwerk abzufragen ob ein User ein bestimmtes Formular geöffnet hat.
|
AW: Formular geöffnet ist
Hallo, na klar! Es gibt für alles eine Möglichkeit. Die Frage ist nur zu welchem Preis.
Was meinst du eigentlich mit Formular? |
AW: Formular geöffnet ist
eine Form.
|
AW: Formular geöffnet ist
Wenn es eine gemeinsame Datenbank gibt, könnte man das dort eintragen. Ich mache das mit einer entsprechenden Tabelle sowohl für Tabellen, einzelne Datensätze als auch Formulare. Das läuft mit Firebird 3 mittels eines eindeutigen Indexes.
|
AW: Formular geöffnet ist
Zitat:
|
AW: Formular geöffnet ist
Da gibt es mehrere Möglichkeiten.
1. Die Verbindungsid wird in den Datensatz mit eingetragen und beim Server nachgefragt ob die Verbindung noch besteht. Dafür gibt es eine Tabelle in der Datenbank MON$ATTACHMENTS. 2. Über eine extra Datei im Netz die Gültigkeit prüfen (share bzw. Lock eines Teilstücks der Datei. Das ist komplizierter umzusetzen. |
AW: Formular geöffnet ist
Du kannst z.B. an die Einträge in der Datenbank einen Zeitstempel eintragen und alle, die älter als z.B. 5 Minuten sind (je nachdem wie zeitkritisch das ist) periodisch löschen. Dazu erneuerst du die Einträge alle z.B. 3 Minuten.
Auf diese Weise hast du stets den aktuellen Stand. Je kürzer der Zeitrahmen gesetzt wird, desto mehr Last landet natürlich beim DB-Server. Das musst du für deinen Anwendungszweck genau überlegen. |
AW: Formular geöffnet ist
Ich verwende dafür Session- und Nutzerkennung. Wenn sich der gleiche Nutzer wieder anmeldet räumt er seinen alten Mist weg. Doppelanmeldung oder Highjacking wird durch eine offene Tempdatei verhindert. Windows macht die von alleine zu, wenn das Programm das die Datei erstellt hat, verloren gegangen ist.
|
AW: Formular geöffnet ist
Ein enorm simples Beispiel findest Du
![]() Falls die Quelle verloren geht, hier der Client Quelltext:
Delphi-Quellcode:
und hier der Server Quelltext:
unit Unit1_Check;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, ComCtrls, ShellAPI; type TForm1 = class(TForm) ListBox1: TListBox; Label3: TLabel; edtFileName: TEdit; Label1: TLabel; Label2: TLabel; Timer1: TTimer; StatusBar1: TStatusBar; procedure Timer1Timer(Sender: TObject); procedure FormShow(Sender: TObject); procedure StatusBar1DblClick(Sender: TObject); private { Private declarations } _FileStream:TFileStream; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Timer1Timer(Sender: TObject); var Err:Boolean; i:Integer; FileName:String; begin FileName := edtFileName.Text; Self.ListBox1.Color := clYellow; Self.Repaint; // proteccion try // Existe el fichero de bloqueo ? if not FileExists(FileName) then begin // Crear el fichero de bloqueo Self._FileStream := TFileStream.Create(FileName, fmCreate); Self._FileStream.Free; end; // Abrirlo Self._FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone); Self.ListBox1.Items.Clear; // Buscar en todas las posiciones for i := 0 to 255 do begin // intentar bloquear Err := not Windows.LockFile(Self._FileStream.Handle, i, 0, 1, 0); // Está bloqueado if (Err) then begin Self.ListBox1.Items.Add (IntToStr(i)); end else begin // Lo desbloqueo Windows.UnLockFile(Self._FileStream.Handle, i, 0, 1, 0); end; end; finally Self.ListBox1.Color := clWindow; end; end; procedure TForm1.FormShow(Sender: TObject); begin Self.Left := 0; Self.Top := 0; end; procedure TForm1.StatusBar1DblClick(Sender: TObject); begin ShellExecute(Handle, 'open', 'http://neftali.clubdelphi.com/', nil, nil, SW_SHOW); end; end.
Delphi-Quellcode:
unit Unit1Ej;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, SHEllAPI; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; edtIP: TEdit; Label3: TLabel; edtFileName: TEdit; StatusBar1: TStatusBar; procedure FormShow(Sender: TObject); procedure StatusBar1Click(Sender: TObject); private { Private declarations } _FileStream:TFileStream; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); var Err:Boolean; i, cont:Integer; FileName:String; begin // Obtiene un número entre 1 y 255 Randomize; i := Random(255) + 1; edtIP.Text := IntToStr(i); Self.Left := Screen.Width - Self.Width; Self.Top := i; Self.Caption := Self.Caption + ' - ' + edtIP.Text; FileName := edtFileName.Text; // Existe el fichero de bloqueo ? if not FileExists(FileName) then begin // Crear el fichero de bloqueo Self._FileStream := TFileStream.Create(FileName, fmCreate); Self._FileStream.Free; end; // Abrirlo Self._FileStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyNone); Err := True; cont := 0; // Varios intentos while (Err) and (cont < 5) do begin sleep(300); // Al entrar bloqueamos el byte correspondiente al número Err := not Windows.LockFile(Self._FileStream.Handle, i, 0, 1, 0); cont := cont + 1; end; if Err then begin MessageDlg('No se ha podido conectar devido a que no ha podido bloquear el byte: ' + IntToStr(i), mtError, [mbOK], 0); Application.Terminate; end; end; procedure TForm1.StatusBar1Click(Sender: TObject); begin ShellExecute(Handle, 'open', 'http://neftali.clubdelphi.com/', nil, nil, SW_SHOW); end; end. |
AW: Formular geöffnet ist
OK Danke da sind gute Lösungen bei.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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