Entwickler-Ecke

Windows API - Form1 beim starten nicht anzeigen


ObscurusNox - Mi 09.10.02 11:38
Titel: Form1 beim starten nicht anzeigen
Hallo!

Hab ein Problem. Mein Programm verschwindet gleich nach dem Start in den SysTray, aber das MainForm (Form1) wird zur Zeit trotzdem noch kurz angezeigt, weil das Laden in den SysTray und das verstecken des Fensters per Timer funktioniert.

Ich will aber, dass das Form1 gar nicht erst angezeigt wird, sind zwar nur 10tel Sekunden, aber trotzdem.

Ich habe schon versucht gleich im TForm1.FormCreate ein Hide einzubauen, aber das mag Delphi anscheinend nicht, auf jeden Fall zeigt das keine Wirkung.

Habe auch schon Visible von Form1 auf false gesetzt, aber das nützt auch gar nix.

Vielleicht hat ja einer ne Idee.
Schonmal Danke ich vorraus.

Markus.


PS: Hoffe ich hab nicht schon wieder ein Posting übersehen, wo das schon behandelt wurde.


LCS - Mi 09.10.02 12:01

Hi
Primitive Methode wäre: Verschieb den Fenster so weit nach rechts, dass es ausserhalb des Bildschirms liegt.

Quelltext
1:
2:
3:
4:
procedure TForm1.FormCreate...
begin
  Left := Screen.Width;
end;


Gruss Lothar


Moewe2 - Mi 09.10.02 12:57
Titel: Bitte Nicht
Bitte Nicht so.
Jeder Computerbenutzer, der mehrere Monitore angeschlossen hat ist es Leid, dass viele Programmierer ihre eigentlich unsichtbaren Fenster einfach nach rehcts oder links oder sonstewohin rausgeschoben haben. Es kommt bei mir oft vor, dass auf meinem Zweitmonitor, der links neben dem richtigen steht, irgendwelche leeren Fenster erscheinen, die man dann oft sogar noch nicht einmal wegbekommt.
Also, bitte nicht.
Ich glaube es gibnt die Möglichkeit gar nicht erst ein Formular zu erstellen, aber das hab ich auch nie geschafft. Dann wäre es besser, vielleicht für die 10tel Sekunde das Fenster erscheinen zu lassen und es vielleicht auch nur 1 Pixel groß zu machne und die Buttons und die Leiste oben zu deaktiviern.


O'rallY - Mi 09.10.02 13:27

probier einfach mal den Befehl

Quelltext
1:
   Application.ShowMainForm := false;                    


Muss dann natürlich beim wiederherstellen aus dem SysTray wieder rückgängig gemacht werden.


tommie-lie - Mi 09.10.02 13:55

Oder, wenn der Timer nicht allzu lang eingestellt ist, müsste es doch auch klappen, wenn man das Fenster beim Erstellen einfach minimiert. Dann erscheint es für eine kurze Zeit in der Taksleiste, aber je nachdem, wie der Timer eingestellt ist (< 1 sekunde sollten auch schon gehen) fällt das kaum auf...


Delete - Mi 09.10.02 14:02

Hört bitte mit dem Basteln aud. o'rally hat die Lösung gepostet. Und im Unit Code geht es mit

Quelltext
1:
Form1.Hide := TRUE;                    

Aber das geht wohl nicht im OnCreate-Ereignis, da zu diesem Zeitpunkt das Fenster noch nicht existiert.


tommie-lie - Mi 09.10.02 14:36

Deine Antowrt habe ich auch ausprobiert, Luckie. Und ich wollte sie auch zuerst schreiben. Aber wenn ich schon im Object-Insprector meine Hauptform verstecke (mit dem Hide), dann klappt das nicht. Anscheindend kann man durch das Property seine Hauptform nicht verstecken. Oder ich habe etwas falsch gemacht (hmmm, Hide auf True, was kann man da falsch machen?)...

Tschüß
Thomas


ObscurusNox - Mi 09.10.02 17:39

Freut mich ja, dass sich soviele Leute um mein Problem bemühen :D

Aber irgendwie funktionieren eure Vorschläge nicht ganz.
Habe folgendes ausprobiert:


Quelltext
1:
2:
3:
4:
5:
6:
begin
  Application.Initialize;
  Application.ShowMainForm := false;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


Hat keine Wirkung.
Und das hier auch nicht, war eigentlich auch das Problem weswegen ich den Timer eingebaut hab:


Quelltext
1:
2:
3:
4:
procedure TForm1.FormCreate(Sender: TObject);
begin
   Hide;
end;


Und das akzeptiert der Debugger nicht:

Quelltext
1:
Form1.Hide := TRUE;                    


Fehlermeldung: [Error] Unit1.pas(392): Left side cannot be assigned to

Das mit dem nach links verschieben hab ich jetzt nicht ausprobiert, würde wohl gehen, aber soll ja nicht so schön sein.
Hm... schonmal vielen Dank für euer Bemühen, vielleicht findet ja noch einer die Lösung.

Markus.


SMI - Mi 09.10.02 18:08

Warum Benutzt du nicht einen Datenmodul anstatt einem Form? Da Datenmodule immer unsichtbar sind, fände ich die Benutzung hier irgendwie sinnvoll. Wenn du dann dein Form brauchst erstellst du es am Besten dynamisch. Damit umgehst du ein Problem von Anfang an und sparst sogar nebenbei noch Speicher.

SMI


O'rallY - Mi 09.10.02 20:00

Schreib das ShowMainForm in das Create-Event, dann müsste es eigentlich klappen.


Alibi - Mi 09.10.02 20:03

Args, einen Timer... Nenene.
Und Hide ist keine Property, sondern eine Funktion.
Mach in OnActivate oder so einfach eine einzige Zeile:
Hide;
Und fertig.


Delete - Do 10.10.02 07:34

"OnActivate" wird aber u.U. nicht nur einmal aufgerufen während das Programm läuft. Schau mal in die Hilfe zu diesem Ereignis.

Mein Vorschlag: setze die TNA-Funktionen in dein eigenes "OnMinimize"-Event (Beispiel gibt´s hier bei AUQ.de) und starte dann aber die Form gleich minimiert (einzustellen im Objektinspektor). Dadurch siehst du sie nicht. Weder auf einem Bildschirm, noch auf mehreren ...

Oder -wenn das TNA-Icon grundsätzlich immer zu sehen sein soll: dann schreib in das "OnMinimize"-Event nur den Code zum Ausblenden der Form, und starte es trotzdem minimiert. Funktioniert letzten Endes genauso.


ObscurusNox - Fr 11.10.02 12:42

@SMI: Das mit dem Datenmodul wäre wohl 'ne gute Idee, aber dazu müsste ich das ganze Programm mehr oder weniger neu schreiben. Ist mir zu kompliziert.

@O'rallY:

Quelltext
1:
2:
3:
4:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.ShowMainForm := false;
end;

Das zeigt komischer weise keine Wirklung. Wenn ich das bei einem ganz neuen Project einfüge, dann geht's, bei meinem Programm irgendwie nicht.

@Moewe2:
Wäre es denn in Ordnung, wenn ich das Fenster nach unten aus dem Bildschirm schiebe?? Das ist zur Zeit meine beste Lösung und dürfte eigentlich niemanden stören, oder?

@Alibi:
Ich weiß, dass Hide eine Funktion ist, wollte nur auf den Fehler von Luckie hinweisen.


Moewe2 - Fr 11.10.02 21:33

Es wäre möglich es außerhalb des sichtbaren Bereiches zu schieben, dann aber nicht nur ein bisschen, sondern richtig. Also zum Beispiel an Position 3000*3000 oder so. Wenn das nicht geht, mache es nach unten, ja. Die meisten Leute werden ihren Zweitmonitor links oder rechts zu stehen haben, und die paar Leute, die 4 oder 5 Monitore haben kann man nun wirklich vernachlässigen. Abe rversuchs erst mit richtig weit weg.