Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Delphi-Anwendung unsichtbar direkt nach Programmstart


bf109g.01 - Mi 01.12.10 21:53
Titel: Delphi-Anwendung unsichtbar direkt nach Programmstart
Hallo ich möchte mein Form1 direkt nach Programmstart unsichtbar machen.

Das hab ich auch probiert -> http://www.festra.com/eng/snip10.htm

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TF.FormActivate(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
  Hide;
end;

HIerbei bekomme ich beim AUsführen aber die FEhlermeldung: "Eigenschaft Visible kann in OnShow und OnHide nicht verändert werden."
Kann ich das irgendwie umgehen?

Danke schonmal.
mfg


jaenicke - Mi 01.12.10 21:59

Setze einfach im Projektquelltext Application.ShowMainForm auf False.


bf109g.01 - Mi 01.12.10 22:08

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Setze einfach im Projektquelltext Application.ShowMainForm auf False.

Wo mache ich das bitte?

Im Quelltext sehe ich diese Zeile nirgends und im Obektinspektor für Form1 finde ich die Zeile auch nicht...

EDIT: Habs schon. Danke!!

EDIT: Ich muss das noch mal genauer beschreiben:
Ich möchte dass das Programm von Anfang an unsichtbar bleibt: Fenster weg und Taskleistensymbol weg. Dann will ich erstmal einige Dialog-Felder aufmachen.
Nur habe ich entweder das Formular, irgendwann selbst wieder auftaucht, oder der blöde Taskleistenblock geht nicht weg.

Und wenn ich Application.ShowMainForm auf False setze, dann kann ich ncihts ausführen, weil das Ereignis OnActivate nie eintritt und wenn ich meine Anweisungen bei FormCreate reinschreibe, verschwindet es logischerweise erst danach... :(


bummi - Do 02.12.10 00:03


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    protected
    Procedure Loaded;override;

  private

....
.....
...
procedure TForm1.Loaded;
begin
 Button1.Click;
// Tuwasimmer Du willst
end;


jaenicke - Do 02.12.10 06:27

user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:
Und wenn ich Application.ShowMainForm auf False setze, dann kann ich ncihts ausführen, weil das Ereignis OnActivate nie eintritt und wenn ich meine Anweisungen bei FormCreate reinschreibe, verschwindet es logischerweise erst danach... :(
Brauchst du denn das Formular überhaupt? Wenn nicht, schmeiß es doch einfach raus...

Jedenfalls gehört der Code zum Laden einfach auch in den Projektquelltext. Der wird beim Start ausgeführt.

Wenn du das Formular nicht anzeigst, ist es irgendwie unlogisch da den Code reinzupacken...


bummi - Do 02.12.10 08:53

@jaenicke

kommt drauf an, vielleicht soll es ja auf ein Events hin angezeigt werden und hat vorher schon einiges aufgebaut.


bf109g.01 - So 05.12.10 18:05

Danke für die Antworten!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Brauchst du denn das Formular überhaupt? Wenn nicht, schmeiß es doch einfach raus...

Wenn du das Formular nicht anzeigst, ist es irgendwie unlogisch da den Code reinzupacken...


Hm, eig brauch ichs wirklich nicht. Wie kann ich denn ohne das Formular arbeiten?
Hab bisher immer Formulare oder Konsolenanwendungen benutzt, aber die Konsole will ich auch nicht sichtbar haben...


jaenicke - So 05.12.10 18:12

Du brauchst lediglich eine Botschaftsbehandlungsschleife, dann brauchst du auch keine Konsolenanwendung. Die Anwendung muss ja nur weiterlaufen bis sie beendet wird.


kalmi01 - So 05.12.10 18:19

Hi,

Du hast mehrere Möglichkeiten, deine Form1 zu "verstecken".
- Width und Height im OnCreate auf 1 setzen, Top und Left auf z.B. -9999
- Alphablend so einstellen, das die Form transparent wird
- im OnPaint Visible := false setzen

Vorteil, man kann die Form bei Bedarf hervor zaubern.


bf109g.01 - So 05.12.10 18:36

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    protected
    Procedure Loaded;override;

  private

....
.....
...
procedure TForm1.Loaded;
begin
 Button1.Click;
// Tuwasimmer Du willst
end;


Ich glaube, ich bin dafür einfach zu blöd...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

    protected
    Procedure Loaded;override;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
  Hide;
end;

procedure TForm1.Loaded;
begin
 Button1.Click;
end;

end.

Also da passiert groß nichts. da bleibt ein Formular, da sieht man den Taskleisten Button...
Nur wenn ich eben auf den Button klicke, ist beides weg... :(


bf109g.01 - So 05.12.10 18:38

user profile iconkalmi01 hat folgendes geschrieben Zum zitierten Posting springen:
Hi,

Du hast mehrere Möglichkeiten, deine Form1 zu "verstecken".
- Width und Height im OnCreate auf 1 setzen, Top und Left auf z.B. -9999
- Alphablend so einstellen, das die Form transparent wird
- im OnPaint Visible := false setzen

Vorteil, man kann die Form bei Bedarf hervor zaubern.


Danke. zT schon probiert. Nur werd ich dann wieder den Button auf der Taskleiste nicht los, oder? ;)

EDIT:
Ich habe hier folgendes gefunden:
http://www.delphi-fundgrube.de/faq01.htm hat folgendes geschrieben:
Um den Taskbar-Eintrag des Programms zu verstecken, muß man das Applikationsfenster (nicht die MainForm!) unsichtbar machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TMainForm.FormShow(Sender: TObject);
var Owner : HWnd;
begin
  Owner:=GetWindow(Handle,GW_OWNER);
  ShowWindow(Owner,SW_HIDE);
end;
Wie / wo wird diese Prozeudr aufgerufen, bzw. wo muss ich sie einfügen, damit sie aufgerufe wird? Einfahc nach implementation eingefügt funktionierts nicht...


jaenicke - So 05.12.10 18:57

user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:
Und wenn ich Application.ShowMainForm auf False setze, dann kann ich ncihts ausführen, weil das Ereignis OnActivate nie eintritt
Wie gesagt: Schreib deinen Quelltext nicht ins Formular, sondern auch direkt dort hin... Der wird ausgeführt, wie du ja daran merkst, dass diese Zeile ausgeführt wird...

Und sonst lass das Formular ganz weg und pack stattdessen eine eigene Botschaftswarteschleife hin.

Es gibt schon genug Möglichkeiten. Was genau jetzt in welcher Reihenfolge bei dir passieren soll ist mir aber bisher nicht klar. Ob du nur auf Botschaften reagieren willst (nur Tray Icon), das Formular doch noch willst, ...


bummi - So 05.12.10 19:15

Mein Posting erfolgte in der Annahme Du hättest Jaenickes Hinweis
Zitat:

Setze einfach im Projektquelltext Application.ShowMainForm auf False.


bereits umgesetzte und hättest folgendes Problem
Zitat:

Und wenn ich Application.ShowMainForm auf False setze, dann kann ich ncihts ausführen, weil das Ereignis OnActivate nie eintritt und wenn ich meine Anweisungen bei FormCreate reinschreibe, verschwindet es logischerweise erst danach.


hier hättest Du mit
Procedure Loaded;override;

einen Einsprungspunkt um etwas zu tun