UniqueInstance Richtig an / Abschalten [gelöst]

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

UniqueInstance Richtig an / Abschalten [gelöst]

Beitrag von corpsman »

Hallo Zusammen,

ich habe eine Anwendung geschrieben, welche "normalerweise" nicht mehrfach gestartet werden soll => Klarer Fall für UniqueInstance.
Wenn ich nun aber meine Anwendung Teste, dann benötige ich doch mehrere Instancen.
Die Idee war nun das ganze mittels eines Kommandozeilen Parameter zu steuern:

Code: Alles auswählen

Procedure TForm1.UniqueInstance1OtherInstance(Sender: TObject;
  ParamCount: Integer; Const Parameters: Array Of String);
Begin
  BringToFront;
  showmessage('Other Instance detected');
End;

Procedure TForm1.FormCreate(Sender: TObject);
Var
  i: Integer;
Begin
  label1.caption := 'Disabled';
  For i := 1 To ParamCount Do Begin
    If ParamStr(i) = '-d' Then Begin
      UniqueInstance1.Enabled := true;
      label1.caption := 'Enabled';
    End;
  End;
End;
Das Problem ist aber, dass das nicht geht, wenn ich im OE Enabled auf True stelle ist es immer an, wenn ich es aus mache immer aus, es scheint keine Möglichkeit zu geben das zur "Create" zeit zu entscheiden, oder übersehe ich hier etwas ?
Dateianhänge
Demo2.zip
(2.03 KiB) 57-mal heruntergeladen
Zuletzt geändert von corpsman am Do 18. Jan 2024, 16:21, insgesamt 1-mal geändert.
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: UniqueInstance Richtig an / Abschalten

Beitrag von corpsman »

Ahh, wenn man es in der .lpr Datei macht, dann scheint es zu gehen:

Code: Alles auswählen

Program project1;

{$MODE objfpc}{$H+}

Uses
{$IFDEF UNIX}
  cthreads,
{$ENDIF}
{$IFDEF HASAMIGA}
  athreads,
{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, unit1
  { you can add units after this }
  , UniqueInstanceRaw, UniqueInstance;

{$R *.res}

Var
  CheckInstance: Boolean;
  ui: TUniqueInstance;
  i: Integer;

Begin
  CheckInstance := true;
  For i := 1 To ParamCount Do Begin
    If ParamStr(i) = '-d' Then Begin
      CheckInstance := false;
    End;
  End;
  If CheckInstance Then Begin
    If InstanceRunning('Blubber_Blub') Then Begin
      halt;
    End;
  End;
  RequireDerivedFormResource := True;
  Application.Scaled := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  If CheckInstance Then Begin
    ui := TUniqueInstance.Create(form1);
    ui.Name := 'UniqueInstance1';
    ui.Identifier := 'Blubber_Blub';
    ui.Enabled := true;
    ui.OnOtherInstance := @form1.UniqueInstance1OtherInstance;
  End;
  Application.Run;
End.

Die Frage ist nun, wie sauber ist das ?
--
Just try it

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: UniqueInstance Richtig an / Abschalten

Beitrag von fliegermichl »

Ich vermute mal, daß FormCreate zu früh ist. Es werden die Eigenschaften des Formulares und seiner Komponenten erst später geladen und somit dein Enabled/disabled wieder übergebügelt.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: UniqueInstance Richtig an / Abschalten

Beitrag von corpsman »

Naja in dem Beispiel das funktioniert erstelle ich alles noch deutlich for Form.Create, also meinst du eher zu Spät ...
--
Just try it

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: UniqueInstance Richtig an / Abschalten

Beitrag von theo »

corpsman hat geschrieben:
Do 18. Jan 2024, 06:27
Die Frage ist nun, wie sauber ist das ?
Was verstehst du unter "sauber"?
Wenn's funktioniert wird es wohl richtig sein.

Ein bisschen viele unnötige begin..end hast du noch drin.

Den ganzen Block:

Code: Alles auswählen

 For i := 1 To ParamCount Do Begin
    If ParamStr(i) = '-d' Then Begin
      CheckInstance := false;
    End;
  End;
  If CheckInstance Then Begin
    If InstanceRunning('Blubber_Blub') Then Begin
      halt;
    End;
  End;
könnte man verlustlos auch so schreiben:

Code: Alles auswählen

 For i := 1 To ParamCount Do 
   If ParamStr(i) = '-d' then CheckInstance := false;
If CheckInstance and InstanceRunning('Blubber_Blub') then halt;
Wenn du bei CheckInstance := false; ein begin...end möchtest, dann nutze es um mit "break" aus der Schleife zu springen.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: UniqueInstance Richtig an / Abschalten

Beitrag von corpsman »

*g*,
es ging mir nicht um Codierrichtlinen, den die sind ja wie Religion, mir ging es eher um "sachgemäße" Benutzung. Nur weil etwas funktioniert, heist es nicht dass es Richtig ist.

Aber Danke, setze es auf gelöst.
--
Just try it

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: UniqueInstance Richtig an / Abschalten

Beitrag von theo »

corpsman hat geschrieben:
Do 18. Jan 2024, 16:21
Nur weil etwas funktioniert, heist es nicht dass es Richtig ist.
Bei Multithreading und Unicode gebe ich dir recht! :lol:
Aber das hier ist ja recht überschaubar. Teste es und gut.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: UniqueInstance Richtig an / Abschalten

Beitrag von fliegermichl »

corpsman hat geschrieben:
Do 18. Jan 2024, 14:30
Naja in dem Beispiel das funktioniert erstelle ich alles noch deutlich for Form.Create, also meinst du eher zu Spät ...
Aehm nö. In der lpr wird Application.CreateForm(TForm1, Form1) aufgerufen und erst danach die Instanz der TUniqueInstance erstellt.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: UniqueInstance Richtig an / Abschalten [gelöst]

Beitrag von corpsman »

Ich meinte den Aufruf von:
InstanceRunning
Der erstellt im Hintergrund den Server ;)
--
Just try it

Antworten