Tech-Ecke / Delphi Inhalt / TForm

 

     TForm

 


 

   Anwendung ohne Form

damit das Form unsichtbar bleibt, muss:

   Application.ShowMainForm:= false;

gleich nach: "Application.CreateForm(TForm1, Form1);" im Quelltext vom Project (nicht in der Form oder Unit) eingetragen werden. Der Quelltext vom Projekt kann angezeigt werden, indem man in der Projektverwaltung (oben rechts) einen Rechtsklick auf die Anwendung macht und im Kontextmenü "Quelltext anzeigen" wählt.


 


 

   Name in der Taskbar ändern

   Application.Title := 'mal anders heißen';
 


 

   Anwendung nicht in der Taskbar zeigen

Im Objektinspektor zum Form1-Ereignis OnActivate folgende Codezeile einfügen:

   ShowWindow(Application.Handle, SW_HIDE);
 

Ab Delphi 2007 muss man etwas mehr tun:

  • im Qelltext der Anwendung: MainFormOnTaskBar auf false setzen
  • im FormShow Event: ShowWindow(Application.Handle, SW_HIDE);
  • im OnActivate Event: ShowWindow(Application.Handle, SW_HIDE);  
     
    Quelle: http://delphi.about.com


 

   Form mit der Escape-Taste schließen

Im Objektinspektor beim Ereignis (Form) OnCreate folgende Codezeile einfügen:

   KeyPreview := true;
 

Dann im Objektinspektor bei Ereignis (Form) OnKeyPress noch diese Zeile einfügen:

   if Key = #27 then Close;
 


 

   Das Schließen einer Form verhindern/abbrechen

Im Objektinspektor bei Ereignis OnCloseQuery CanClose auf false setzen:

  if MessageDlg('Wirklich beenden?', mtConfirmation, [mbYes,mbNo],0) = mrYes then
   CanClose := true else CanClose := false;
 


 

   Anwendung bei OnFormCreate halbwegs sauber abschießen

Der Befehl "Application.Terminate" bewirkt innerhalb des OnFormCreate Ereignisses nicht das sofortige Beenden der Anwendung. In aller Regel wird auch der Code des Ereignisses OnFormShow noch bearbeitet bis sich die Anwendung tatsächlich aus dem Arbeitsspeicher verkrümelt. Folgender verhindert das Abarbeiten des Ereignisses OnFormShow, wenn bei OnFormCreate terminiert wird.

  showmessage('bin dann mal weg...');
Application.ShowMainForm := false;
Application.Terminate;
 


 

   Eigenen Anwendung in den Fordergrund bringen

Im Grunde gibt es für diesen Zweck ja 'SetForegroundWindow'. Dies funktioniert allerdings nur dann, wenn der Eingabefokus auch noch auf der Anwendung liegt. Ist dieser jedoch auf einer anderen Anwendung, so beginnt lediglich der Taskleisteneintrag an zu blinken, die Anwendung selbst bleibt jedoch im Hintergrund. Abhilfe schafft hier folgende Procedure.

  procedure ShowApplication;
var
      Thread1,

      Thread2: Cardinal;
begin
   Thread1 := GetCurrentThreadId;
   Thread2 := GetWindowThreadProcessId (GetForegroundWindow, nil);
   AttachThreadInput (Thread1, Thread2, true);
   try
      SetForegroundWindow (Application.Handle);
   finally
      AttachThreadInput (Thread1, Thread2, false);
   end;
end;

Quelle: Delphi Library

Aufrufen der Procedure:

   ShowApplication;

 

   Fremde Anwendung in den Vordergrund bringen

   siehe hier


 

   Fenster ohne Rahmen verschiebbar machen

Im Objektinspektor bei Ereignisse zur Form unter OnMouseDown nachfolgende zwei Codezeilen hinterlegen. Somit kann die Form an jeder beliebigen Stelle verschoben werden.

   ReleaseCapture;
 Perform(WM_SYSCOMMAND, $F0120);
 

Dieser Code kann auch verwendet werden um ein Fenster über eine Komponente zu verschieben die sich auf der Form befindet. Dazu den Code dann beim OnMouseDown-Ereignis der entsprechenden Komponente hinterlegen.


 

   Anwendung löscht sich selbst

Möchte man das sich die eigene Anwendung selbst beendet und löscht, so kann man dazu folgenden Schnipsel verwenden:

  procedure DeleteSelf;
var
     PList: TStringList;
begin
   PList := TStringList.Create;
   PList.Add(':Loop');
   PList.Add('del "' + Paramstr(0) + '"');
   PList.Add('if Exist "' + Paramstr(0) + '" goto Loop');
   PList.Add('del "' + ExtractFilePath(Paramstr(0)) +'tmp.bat"');
   try PList.SavetoFile(ExtractFilePath(Paramstr(0)) +'tmp.bat'); finally end;
   PList.Free;
   ShellExecute(0,PChar('open'),PChar(ExtractFilePath(Paramstr(0)) +'tmp.bat'),nil,nil,SW_HIDE);
   Application.Terminate;
end;
 

Aufrufen der Procedure:

   DeleteSelf;

 


 

   Anwendung in den Autostart schreiben

Alternativ zu einer Verknüpfung im Autostartordner des Startmenüs kann ein automatischer Start auch vorgegeben werden indem die Anwendung in der Registry unter "Software\Microsoft\Windows\CurrentVersion\Run" eingetragen wird.

  function Autostart(sName, sFilename: string; AllUsers: Integer): Boolean;
var
      Reg: TRegistry;
begin
Result := False;
Reg := TRegistry.create;
if AllUsers = 1 then // 1 = erfordert Admin Rechte!
   Reg.RootKey := HKEY_LOCAL_MACHINE
else
   Reg.Rootkey:= HKEY_CURRENT_USER;
try
   Reg.Rootkey:= HKEY_CURRENT_USER;
   Result := Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', true);
   Reg.WriteString(sName, sFilename);
finally
   Reg.Free;
end;
end;
 

Aufrufen der Procedure:

  Autostart(Application.Title, ParamStr(0), 0); // Anwendung schreibt sich selbst in den Autostart des aktuellen Benutzers

Autostart(Application.Title, 'notepad.exe', 1); // Notepad wird für alle Benutzer in den Autostart geschrieben

 

Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !

[letzte Aktualisierung 15.02.2015]