AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Formular geöffnet ist

Ein Thema von Walter Landwehr · begonnen am 4. Apr 2022 · letzter Beitrag vom 5. Apr 2022
Antwort Antwort
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#1

Formular geöffnet ist

  Alt 4. Apr 2022, 13:56
Hallo, gibt es eine Möglichkeit im Netzwerk abzufragen ob ein User ein bestimmtes Formular geöffnet hat.
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
615 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Formular geöffnet ist

  Alt 4. Apr 2022, 14:09
Hallo, na klar! Es gibt für alles eine Möglichkeit. Die Frage ist nur zu welchem Preis.

Was meinst du eigentlich mit Formular?
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Formular geöffnet ist

  Alt 4. Apr 2022, 14:23
eine Form.
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
480 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Formular geöffnet ist

  Alt 4. Apr 2022, 15:05
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.
Bernd
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Formular geöffnet ist

  Alt 4. Apr 2022, 16:50
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?
Peter Below
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
480 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Formular geöffnet ist

  Alt 4. Apr 2022, 17:07
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.
Bernd
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Formular geöffnet ist

  Alt 4. Apr 2022, 18:22
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
615 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Formular geöffnet ist

  Alt 4. Apr 2022, 18:55
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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Formular geöffnet ist

  Alt 4. Apr 2022, 19:27
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
384 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Formular geöffnet ist

  Alt 5. Apr 2022, 13:30
OK Danke da sind gute Lösungen bei.
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:58 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