Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Einige Probleme mit Delphi Programm zusammengefasst

Frage Entwicklung Pascal und Delphi

Mitglied: Eifeladmin

Eifeladmin (Level 1) - Jetzt verbinden

09.05.2006, aktualisiert 12.05.2006, 8418 Aufrufe, 5 Kommentare

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.

Mit freundlichen Grüßen
Nemo
Mitglied: 8644
10.05.2006 um 16:48 Uhr
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
Bitte warten ..
Mitglied: Eifeladmin
11.05.2006 um 17:35 Uhr
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 )

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

Mit freundlichen Grüßen
Nemo
Bitte warten ..
Mitglied: 8644
12.05.2006 um 09:08 Uhr
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

Psycho
Bitte warten ..
Mitglied: Eifeladmin
12.05.2006 um 09:21 Uhr
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.

Mit freundlichen Grüßen
Nemo
Bitte warten ..
Mitglied: 8644
12.05.2006 um 09:24 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Windows 7
gelöst Sind euch verstärkte Probleme bei Windows 7 Updates aufgefallen? (4)

Frage von RadioHam zum Thema Windows 7 ...

Cloud-Dienste
gelöst OwnCloud 8 Probleme mit Vorschaubildern auf Mobilgeräten (1)

Frage von zeroblue2005 zum Thema Cloud-Dienste ...

Windows 10
gelöst VPN Verbindung Probleme (6)

Frage von Yeter2 zum Thema Windows 10 ...

Windows 10
Windows 10 Start-Probleme - Hilfe (9)

Frage von clragon zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...