eifeladmin
Goto Top

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

Content-Key: 32006

Url: https://administrator.de/contentid/32006

Printed on: April 18, 2024 at 23:04 o'clock

Mitglied: 8644
8644 May 10, 2006 at 14:48:45 (UTC)
Goto Top
Hi Nemo,

da isser wieder face-wink

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
Member: Eifeladmin
Eifeladmin May 11, 2006 at 15:35:32 (UTC)
Goto Top
Hi

also das Programm legt sicher erst beim Minimieren in den Tray.
Entweder sollen sich beim wiederherstellen beide Formulare wiederherstellen oder nur das Hauptformular. Momentan bleibt das zweite halt minimiert. Mir ist es eigentlich egal welche Variante von beiden, was einfach ist.

Ich hätte gerne das sich das Programm unten Rechts öffnet. Kannst du mir vielleicht genauer erklären wie ich das mach? (weist ja Leihe face-smile)

Schon mal Danke für den Tipp mit dem "CMD" das werd ich gleich direkt mal einbinden.

MFG
Nemo
Mitglied: 8644
8644 May 12, 2006 at 07:08:52 (UTC)
Goto Top
Moin,

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;

Als nächstes brauchen wir eine globale Konstante:

const
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;

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;

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;

Beim Öffnen des zweiten Formulars auf die Variable vis achten:

procedure TForm1.Button1Click(Sender: TObject);
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;

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;

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;

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;


Die Variable nicht vergessen:

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.vis := False;
end;

Ich hoffe, ich habe an alles gedacht!
Viel Spaß beim Testen face-big-smile

Psycho
Member: Eifeladmin
Eifeladmin May 12, 2006 at 07:21:22 (UTC)
Goto Top
Hi

danke schön!

Ich werds nachher mal testen.
Funktioniert das auch mit mehreren Formularen? Ich noch welche hinzugefügt.
Muss ich die Funktionen hier mit meinen ersetzten? Ich hab mit ablegen im Tray ja schon drin.

MFG
Nemo
Mitglied: 8644
8644 May 12, 2006 at 07:24:37 (UTC)
Goto Top
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