Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Formular geöffnet ist (https://www.delphipraxis.net/210310-formular-geoeffnet-ist.html)

Walter Landwehr 4. Apr 2022 13:56

Formular geöffnet ist
 
Hallo, gibt es eine Möglichkeit im Netzwerk abzufragen ob ein User ein bestimmtes Formular geöffnet hat.

Sinspin 4. Apr 2022 14:09

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?

Walter Landwehr 4. Apr 2022 14:23

AW: Formular geöffnet ist
 
eine Form.

BerndS 4. Apr 2022 15:05

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.

peterbelow 4. Apr 2022 16:50

AW: Formular geöffnet ist
 
Zitat:

Zitat von BerndS (Beitrag 1504242)
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.

Und wie läuft das, wenn eine Programm-Instanz nicht sauber beendet wird (crash, kill via task manager etc.)? Wer räumt dann die Einträge auf, die zu dieser Instanz gehörten?

BerndS 4. Apr 2022 17:07

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.

jaenicke 4. Apr 2022 18:22

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.

Sinspin 4. Apr 2022 18:55

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.

KodeZwerg 4. Apr 2022 19:27

AW: Formular geöffnet ist
 
Ein enorm simples Beispiel findest Du hier, da geht es um die WinApi LockFile() und UnLockFile().

Falls die Quelle verloren geht, hier der Client Quelltext:
Delphi-Quellcode:
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.
und hier der Server Quelltext:
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.

Walter Landwehr 5. Apr 2022 13:30

AW: Formular geöffnet ist
 
OK Danke da sind gute Lösungen bei.


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