Einige Probleme mit Delphi Programm zusammengefasst
Delphi Programm Maximieren/ Fenster speichern/ CMD Fenster öffnen
Hi @ all
Ich bin mir gerade ein kleines Tool am programmieren was mir meine Arbeit als Netzwerkadministrator erleichern soll. Habe aber jetzt einige Probleme. Hab schon das Web durchsucht aber leider nichts passendes gefunden.
Ich hab das Programm so porgrammiert das es beim minimieren im Systray ablegt. Das klappt auch so weit. Zusätzlich hab ich es so gemacht das, wenn ich ein zweites Formular minimiere sich das ganze Programm im Tray ablegt. Aber wenn ich das Programm wieder aufrufe wird das zweite Formular nicht wiederhergestellt sondern bleibt minimiert. Kann mir da jemand helfen?
Zweites Problem wenn ich das Hauptformular verschiebe und dann schließe wird es wieder an der alten Stelle geöffnet. Kann man das nicht irgendwo einstellen das sich das Fenster am alten Platz öffnet ohne großen Aufwand?
Drittes Problem was ich habe, ist das ich gern ein Dos Fenster öffnen will aber nicht weiß wie es am besten mache. Hat da jemand einen Tipp für mich?
Ich bin leider nicht so der Delphiexperte.
Danke schon mal für eure Hilfe.
MFG
Nemo
Hi @ all
Ich bin mir gerade ein kleines Tool am programmieren was mir meine Arbeit als Netzwerkadministrator erleichern soll. Habe aber jetzt einige Probleme. Hab schon das Web durchsucht aber leider nichts passendes gefunden.
Ich hab das Programm so porgrammiert das es beim minimieren im Systray ablegt. Das klappt auch so weit. Zusätzlich hab ich es so gemacht das, wenn ich ein zweites Formular minimiere sich das ganze Programm im Tray ablegt. Aber wenn ich das Programm wieder aufrufe wird das zweite Formular nicht wiederhergestellt sondern bleibt minimiert. Kann mir da jemand helfen?
Zweites Problem wenn ich das Hauptformular verschiebe und dann schließe wird es wieder an der alten Stelle geöffnet. Kann man das nicht irgendwo einstellen das sich das Fenster am alten Platz öffnet ohne großen Aufwand?
Drittes Problem was ich habe, ist das ich gern ein Dos Fenster öffnen will aber nicht weiß wie es am besten mache. Hat da jemand einen Tipp für mich?
Ich bin leider nicht so der Delphiexperte.
Danke schon mal für eure Hilfe.
MFG
Nemo
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 32006
Url: https://administrator.de/contentid/32006
Ausgedruckt am: 22.11.2024 um 15:11 Uhr
5 Kommentare
Neuester Kommentar
Hi Nemo,
da isser wieder
zu Frage 1: Wird das Proggy beim Start sofort im Tray abgelegt?
Das mit dem zweiten Formular ist mir auch noch nicht ganz schlüssig, ich verstehe das so:
Deine Anwendung besteht aus mehreren Formularen und egal, welches du minimierst, legt sich das ganze Programm im Tray ab - ist das soweit richtig? Und wenn du das Programm wieder aktivierst, soll im Prinzip der Zustand vor dem Minimieren wieder hergestellt werden - richtg?
Zu Frage 2:
Hier gibt es verschiedene Möglichkeiten, wovon für einen Delphi-Laien wahrscheinlich die einfachste ist, sich die Position der Fenster (left, top) in globalen Variablen zu merken und beim Öffnen wieder zu setzen.
Zu Frage 3:
Nur ein DOS-Fenster zu öffnen, geht so:
ShellExecute(Application.Handle, 'open', 'cmd', nil, nil, SW_NORMAL);
Dazu mußt du die ShellApi unter Uses einbinden, falls du was anderes möchtest, schreibe bitte mal genau, was!
Psycho
da isser wieder
zu Frage 1: Wird das Proggy beim Start sofort im Tray abgelegt?
Das mit dem zweiten Formular ist mir auch noch nicht ganz schlüssig, ich verstehe das so:
Deine Anwendung besteht aus mehreren Formularen und egal, welches du minimierst, legt sich das ganze Programm im Tray ab - ist das soweit richtig? Und wenn du das Programm wieder aktivierst, soll im Prinzip der Zustand vor dem Minimieren wieder hergestellt werden - richtg?
Zu Frage 2:
Hier gibt es verschiedene Möglichkeiten, wovon für einen Delphi-Laien wahrscheinlich die einfachste ist, sich die Position der Fenster (left, top) in globalen Variablen zu merken und beim Öffnen wieder zu setzen.
Zu Frage 3:
Nur ein DOS-Fenster zu öffnen, geht so:
ShellExecute(Application.Handle, 'open', 'cmd', nil, nil, SW_NORMAL);
Dazu mußt du die ShellApi unter Uses einbinden, falls du was anderes möchtest, schreibe bitte mal genau, was!
Psycho
Moin,
lass es uns versuchen:
Im uses - Teil benötigst du die ShellAPI
Als nächstes brauchen wir eine globale Konstante:
Da wir mit mehreren Formularen hantieren, verwende ich den public - Bereich für die weiteren Deklarationen,
die Variable vis benutze ich, um festzustellen, ob das zweite Formular geöffnet ist. Die Prozeduren solltest du kennen:
Jetzt die Prozedur, die das/die Fenster versteckt und das Trayicon erzeugt. Hier wird auch abgefragt, ob das zweite Formular sichtbar ist:
Nun die Behandlung des Trayicons, kennst du sicher schon. Hinzu kommt die Abfrage für das zweite Formular:
Beim Öffnen des zweiten Formulars auf die Variable vis achten:
Die Position des Fensters setzen:
Etwas Kosmetik - das Icon wieder zerschiessen:
In der zweiten Unit kommen wir mit privaten Deklarationen aus:
Hier holen wir uns die Prozedur aus Unit1:
Die Variable nicht vergessen:
Ich hoffe, ich habe an alles gedacht!
Viel Spaß beim Testen
Psycho
lass es uns versuchen:
Im uses - Teil benötigst du die ShellAPI
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShellAPI, Menus, StdCtrls;
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShellAPI, Menus, StdCtrls;
Als nächstes brauchen wir eine globale Konstante:
const
WM_TASKBAREVENT =WM_USER + 1;
WM_TASKBAREVENT =WM_USER + 1;
Da wir mit mehreren Formularen hantieren, verwende ich den public - Bereich für die weiteren Deklarationen,
die Variable vis benutze ich, um festzustellen, ob das zweite Formular geöffnet ist. Die Prozeduren solltest du kennen:
public
{ Public-Deklarationen }
vis : Boolean;
procedure TaskBarEvent(var Msg: TMessage);
Message WM_Taskbarevent;
procedure WMSysCommand(var Msg: TWMSysCommand);
Message WM_SysCommand;
end;
{ Public-Deklarationen }
vis : Boolean;
procedure TaskBarEvent(var Msg: TMessage);
Message WM_Taskbarevent;
procedure WMSysCommand(var Msg: TWMSysCommand);
Message WM_SysCommand;
end;
Jetzt die Prozedur, die das/die Fenster versteckt und das Trayicon erzeugt. Hier wird auch abgefragt, ob das zweite Formular sichtbar ist:
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
var
NotifyIconData: TNotifyIconData;
begin
if Form2.Visible then vis := True else vis := False;
if vis then Form2.Hide;
if Msg.CmdType and $FFF0 = SC_MINIMIZE then
Hide
else
inherited;
Fillchar(NotifyIconData.cbSize,Sizeof(NotifyIconData),0);
NotifyIconData.cbSize := Sizeof(NotifyIconData);
NotifyIconData.Wnd := Handle;
NotifyIconData.uFlags := NIF_MESSAGE
or NIF_ICON
or NIF_TIP;
NotifyIconData.uCallbackMessage := WM_TASKBAREVENT;
NotifyIconData.hIcon := Application.Icon.Handle;
NotifyIconData.szTip := 'Blabla';
Shell_NotifyIcon(NIM_ADD, @notifyicondata);
end;
var
NotifyIconData: TNotifyIconData;
begin
if Form2.Visible then vis := True else vis := False;
if vis then Form2.Hide;
if Msg.CmdType and $FFF0 = SC_MINIMIZE then
Hide
else
inherited;
Fillchar(NotifyIconData.cbSize,Sizeof(NotifyIconData),0);
NotifyIconData.cbSize := Sizeof(NotifyIconData);
NotifyIconData.Wnd := Handle;
NotifyIconData.uFlags := NIF_MESSAGE
or NIF_ICON
or NIF_TIP;
NotifyIconData.uCallbackMessage := WM_TASKBAREVENT;
NotifyIconData.hIcon := Application.Icon.Handle;
NotifyIconData.szTip := 'Blabla';
Shell_NotifyIcon(NIM_ADD, @notifyicondata);
end;
Nun die Behandlung des Trayicons, kennst du sicher schon. Hinzu kommt die Abfrage für das zweite Formular:
procedure TForm1.TaskBarEvent(var Msg: TMessage);
var
Point : TPoint;
begin
case Msg.LParam of
WM_LBUTTONDBLCLK:
begin
Form1.Show;
if vis then Form2.Show;
end;
WM_LBUTTONUP:
begin
end;
WM_RBUTTONUP:
begin
SetForegroundWindow(Handle);
GetCursorPos(Point);
PopupMenu1.Popup(Point.x, Point.y);
end;
end;
end;
var
Point : TPoint;
begin
case Msg.LParam of
WM_LBUTTONDBLCLK:
begin
Form1.Show;
if vis then Form2.Show;
end;
WM_LBUTTONUP:
begin
end;
WM_RBUTTONUP:
begin
SetForegroundWindow(Handle);
GetCursorPos(Point);
PopupMenu1.Popup(Point.x, Point.y);
end;
end;
end;
Beim Öffnen des zweiten Formulars auf die Variable vis achten:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
vis := True;
end;
begin
Form2.Show;
vis := True;
end;
Die Position des Fensters setzen:
procedure TForm1.FormShow(Sender: TObject);
begin
Form1.Left := Screen.Width - Form1.Width;
Form1.Top := Screen.Height - Form1.Height - 30;
end;
begin
Form1.Left := Screen.Width - Form1.Width;
Form1.Top := Screen.Height - Form1.Height - 30;
end;
Etwas Kosmetik - das Icon wieder zerschiessen:
procedure TForm1.FormDestroy(Sender: TObject);
var
NotifyIconData: TNotifyIconData;
begin
FillChar(NotifyIconData,Sizeof(NotifyIconData),0);
NotifyIconData.cbSize := Sizeof(NotifyIconData);
NotifyIconData.Wnd := Self.Handle;
NotifyIconData.uFlags := NIF_MESSAGE
or NIF_ICON
or NIF_TIP;
NotifyIconData.uCallbackMessage := WM_TaskBarEvent;
NotifyIconData.hIcon := Application.Icon.Handle;
NotifyIconData.szTip := 'Blabla';
Shell_NotifyIcon(NIM_DELETE, @notifyicondata);
end;
var
NotifyIconData: TNotifyIconData;
begin
FillChar(NotifyIconData,Sizeof(NotifyIconData),0);
NotifyIconData.cbSize := Sizeof(NotifyIconData);
NotifyIconData.Wnd := Self.Handle;
NotifyIconData.uFlags := NIF_MESSAGE
or NIF_ICON
or NIF_TIP;
NotifyIconData.uCallbackMessage := WM_TaskBarEvent;
NotifyIconData.hIcon := Application.Icon.Handle;
NotifyIconData.szTip := 'Blabla';
Shell_NotifyIcon(NIM_DELETE, @notifyicondata);
end;
In der zweiten Unit kommen wir mit privaten Deklarationen aus:
private
{ Private-Deklarationen }
procedure WMSysCommand(var Msg: TWMSysCommand);
Message WM_SysCommand;
public
{ Public-Deklarationen }
end;
{ Private-Deklarationen }
procedure WMSysCommand(var Msg: TWMSysCommand);
Message WM_SysCommand;
public
{ Public-Deklarationen }
end;
Hier holen wir uns die Prozedur aus Unit1:
procedure TForm2.WMSysCommand(var Msg: TWMSysCommand);
begin
if Msg.CmdType and $FFF0 = SC_MINIMIZE then begin
Form1.WMSysCommand(Msg);
Hide
end else
inherited;
end;
begin
if Msg.CmdType and $FFF0 = SC_MINIMIZE then begin
Form1.WMSysCommand(Msg);
Hide
end else
inherited;
end;
Die Variable nicht vergessen:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.vis := False;
end;
begin
Form1.vis := False;
end;
Ich hoffe, ich habe an alles gedacht!
Viel Spaß beim Testen
Psycho
Hi,
natürlich musst du sie nicht ersetzen, du musst aber immer darauf achten, dass du dir merkst, welche Formulare offen sind - sprich du benötigst die entsprechenden Variablen.
Nur so kannst du gewährleisten, dass die richtigen Fenster wieder geöffnet werden.
Psycho
natürlich musst du sie nicht ersetzen, du musst aber immer darauf achten, dass du dir merkst, welche Formulare offen sind - sprich du benötigst die entsprechenden Variablen.
Nur so kannst du gewährleisten, dass die richtigen Fenster wieder geöffnet werden.
Psycho