OnCreate Application Minimize minimiert Lazarus

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

OnCreate Application Minimize minimiert Lazarus

Beitrag von Michl »

Man muss sowas zwar nicht machen aber schreibe ich folgenden Code (habe ich, soweit ich mich erinnern kann, in einem Projekt genutzt, um dieses bei einer fehlerhaften Initialisierung sofort zu beenden):

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.Terminate;
end;  
dann wird das eben gestartete Programm sofort wieder geschlossen - alles gut.

Schreibe ich sowas:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.Minimize;
end;  
dann wird Lazarus an Stelle des Programms minimiert (im OnShow geht das Ganze).

Was meint ihr, sollte ich das im Bugtracker melden oder ist dieser Spezialfall vernachlässigbar?

Windows 7 64bit, Lazarus 32bit Rev. 49884 FPC Rev. 31894

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: OnCreate Application Minimize minimiert Lazarus

Beitrag von Christian »

Ich find es kann nicht schaden das zu melden ob jemand drauf reagiert bleibt den Entwicklern überlassen. Das hört sich nach was an was an ganz anderen Stellen zu "richtigen" Fehlerfällen führen könnte.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

Re: OnCreate Application Minimize minimiert Lazarus

Beitrag von theo »

Michl hat geschrieben:dann wird Lazarus an Stelle des Programms minimiert (im OnShow geht das Ganze).
Also wenn du es aus der IDE startest, nehme ich an? Ausserhalb der IDE passiert wohl nichts?
Kann es gerade nicht testen, weil unter GTK2 mit diesem Code gar nichts passiert.

Eintragen kann man es ja mal, obwohl es wohl kaum zu echten Problemen führen wird.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: OnCreate Application Minimize minimiert Lazarus

Beitrag von Michl »

Danke für die Antworten, werde es dann mal später im Bugtracker melden.
theo hat geschrieben:Also wenn du es aus der IDE startest, nehme ich an? Ausserhalb der IDE passiert wohl nichts?
Genau, ohne die IDE wird das Projekt ganz normal geöffnet - ohne Minimierung. Erst im OnShow wird das Projekt minimiert (WindowState wsMinimized minimiert das Projekt nicht gwünscht, daher dieses Vorgehen).
theo hat geschrieben:Kann es gerade nicht testen, weil unter GTK2 mit diesem Code gar nichts passiert.
Aber im OnShow geht es schon oder?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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

Re: OnCreate Application Minimize minimiert Lazarus

Beitrag von theo »

Michl hat geschrieben:Aber im OnShow geht es schon oder?!
Nö, tut nix.
Ich wollte schreiben, dass es mit WindowState wsMinimized geht, aber da verschwindet die Anwendung komplett. D.h. lässt sich ausserhalb der IDE nur noch mit dem Task Manager beenden.

Lazarus 1.5 r49871M FPC 2.6.4 x86_64-linux-gtk 2
openSUSE 13.2 (Harlequin) (x86_64)

Da ist wohl im Moment der Wurm drin.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: OnCreate Application Minimize minimiert Lazarus

Beitrag von Michl »

mhpf

Ok, Danke!

Soll ich das auch noch im Bugtracker melden oder willst du das machen?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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

Re: OnCreate Application Minimize minimiert Lazarus

Beitrag von theo »

Michl hat geschrieben: Soll ich das auch noch im Bugtracker melden oder willst du das machen?
Kannst du gerne machen.
Die Sache ist die, dass es nicht funktioniert, wenn man es im ObjektInspektor macht, d.h. wenn die Eigenschaft von Anfang an gesetzt ist.
Wenn ich es aber so mache:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
  Form2.WindowState:=wsMinimized;
end;  
Dann geht es.

Ist wahrscheinlich auch so ein Bug der niemandem auffällt, weil es ja auch nicht so sinnvoll ist, das zu tun.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: OnCreate Application Minimize minimiert Lazarus

Beitrag von Michl »

theo hat geschrieben:Ist wahrscheinlich auch so ein Bug der niemandem auffällt, weil es ja auch nicht so sinnvoll ist, das zu tun.
Das Programm wir von einem anderen Programm gestartet. Da ich dieses gern so wieder laden möchte, wie man es beendet hatte, möchte ich dies auch gern minimiert starten. Hast du da eine Idee, wie man das besser realisieren könnte?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

TBug
Beiträge: 179
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: OnCreate Application Minimize minimiert Lazarus

Beitrag von TBug »

Wenn Du das Ganze nur für Windows benötigst, dann kannst Du ein wenig in der lpr-Datei tricksen:

Code: Alles auswählen

 
program Project1;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, unit1
  { you can add units after this };
 
{$R *.res}
 
begin
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
 
  Application.MainFormOnTaskBar := true;
  Application.MainForm.Show;
  Application.MainForm.WindowState := wsMinimized; 
  Application.Run;
end.
 
In der Zuweisung von MainForm.WindowState kannst Du ja auch die Einstellungen nehmen, welche Du aus einer Ini-Datei, zum Beispiel in Form1 oder einem Datenmodul, eingelesen hast.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: OnCreate Application Minimize minimiert Lazarus

Beitrag von Michl »

Mit WindowState := wsMinimized wird das Formular minimiert, nicht wie mittels Minimieren-Icon das Programm minimiert (nur noch auf der Taskleiste sichtbar). Das funktioniert aber per Application.Minimize. Der User soll einfach auf der Taskleiste auf das Programm klicken und es damit maximieren können.

Danke trotzdem für Deine Hilfe!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

TBug
Beiträge: 179
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: OnCreate Application Minimize minimiert Lazarus

Beitrag von TBug »

Michl hat geschrieben:Mit WindowState := wsMinimized wird das Formular minimiert, nicht wie mittels Minimieren-Icon das Programm minimiert (nur noch auf der Taskleiste sichtbar). Das funktioniert aber per Application.Minimize. Der User soll einfach auf der Taskleiste auf das Programm klicken und es damit maximieren können.
Das ist nicht ganz richtig.

Der Code macht genau das, was Du willst. Nach dem Programmstart ist die Anwendung in der Taskleiste.

Wenn Du die Property WindowsState der MainForm auf wsMinimized stellst, dann wird nicht nur das Fenster minimiert, sondern die ganze Anwendung.

Beispiel im Anhang mit zwei Forms.

Auf Form2 ist ein Button mit dem

Code: Alles auswählen

Form1.WindowsState := wsMinimized;
gesetzt wird. Es wird nicht nur die Form1 minimiert, sondern die ganze Anwendung, da Form1 die MainForm der Anwendung ist.

Einfach einmal ausprobieren.

.
Dateianhänge
AppMinimize.zip
(126.3 KiB) 52-mal heruntergeladen

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: OnCreate Application Minimize minimiert Lazarus

Beitrag von Michl »

Interessant, es funktioniert!

Code: Alles auswählen

  Application.MainFormOnTaskBar := true;
Dies macht den Trick. Der Compiler gibt zwar eine Warnung "project1.lpr(18,15) Warning: Symbol "MainFormOnTaskBar" is not portable" aus, aber es funktioniert trotzdem.

Ich habe meinen Code jetzt angepasst:

Code: Alles auswählen

procedure TForm1.FormShow(Sender: TObject);
begin
  if FSavedWindowState = wsMinimized then begin
    Application.MainFormOnTaskBar := true;
    Application.Minimize;
  end;
end; 
Im OnShow kommt es dann nicht zu dem Blinkern des Programms auf der Taskleiste.

Danke für das Beispiel!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten