24. maj 2004 - 16:48Der er
11 kommentarer og 1 løsning
2 spørgsmål i delphi
Hej
Jeg er ved at lave et program, og har nu to spørgsmål.
1. Mit program ligger ned ved siden af uret, og jeg har sat det sådan at når man kan se formen, og klikker på krydset oppe i hjørnet, så minimeres det til tray'en. Men så hvis jeg lukker computeren mens programmet køre så kan går den i stå i lukke precessen fordi den ikke kan lukke mit program ned. Det skyldes jo så at jeg bruge canclose := false; , men er der ikke en måde så den kan se at det er windows der lukker programmet?
2. Jeg bruger NMPop3 komponentet, til at slette en mail fra serveren med. Men hver gang den sletter en mail, gemmer den den på harddisken under: Documents and Settings\BRUGER Kan man ikke få den til at lade hver med det?
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
vil da tro at dit tray component (hvis du bruger det) kan håndtere det for dig, altså du kan sige den skal minimere ved close, uden du skal bruge canclose.
Ellers kan du jo fande wm_closequery beskeden og lukke din form manuelt. Kan komme med noget kode hvis det er.
Brug noget anden end NMPop3, den er aligevel væk i de nyere versioner af delphi, og hvis du engang skal opgradere skal du skrive dit program om aligevel. Indy som altid...
OK, så vil jeg så vise dig hvordan du laver et tray-ikon uden et komponent (for det er altså ikke svært) Jeg skriver ikke hele formen ind men håber du kan se hvor de forskellige ting skal hen:
uses ShellAPI; //plus hvad du nu har brug for
const WM_TrayMessage = WM_USER + 1;
//under public under type Form1 = class(TForm) public procedure TrayMessage(var Message: TMessage); message WM_TrayMESSAGE; end;
var Tray: TNotifyIcondata;
procedure TForm1.TrayMessage(var Message: TMessage); var P: TPoint; begin case Message.LParam of WM_RBUTTONDOWN: begin Shell_NotifyIcon(NIM_DELETE, @Tray); Form1.Show; SetForegroundWindow(Handle); end; WM_CLOSEQUERY : begin Shell_NotifyIcon(NIM_DELETE, @Tray); Application.Terminate; end; end; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := caNone; with Tray do begin cbSize := SizeOf(Tray); Wnd := Handle; uID := 0; uFlags := NIF_MESSAGE; uCallbackMessage:= WM_TrayMessage; end; Shell_NotifyIcon(NIM_ADD, @Tray); Form1.Hide; end;
Problemet er at det komponent jeg bruger, kan også vise advanceret hints, ikon rotation. Er der ikke en mulighed for på en eller anden måde, så man kan gøre sådan at når den forsøges lukket, så kan den tjekket om det er windows der prøver at lukke den?
Til spørgsmål to... Har prøvet indy komponentet, men kan ikke få det til at virke. Jeg kan ikke finde det som i NMPOP3 hed getmailmessage(X), from, subject, osv. Altså de bersale funktioner. Hvordan finder man dem?
type TForm1 = class(TForm) private { Private declarations } public { Public declarations } procedure AppMessage(var Msg: TMsg; var Handled: Boolean); procedure WMQueryEndSession(var Msg : TWMQueryEndSession); message WM_QueryEndSession; end;
...
procedure TForm1.WMQueryEndSession(var Msg : TWMQueryEndSession); begin application.Terminate; // Lukker dit program når den modtager msg Msg.Result := 1; end;
procedure TForm1.WMQueryEndSession(var Msg : TWMQueryEndSession); begin Msg.Result := 1; application.Terminate; // Lukker dit program når den modtager msg end;
men det er egentlig ikke så godt at komme ud i at skulle fange den besked, og måske endda sende en ny. Det betyder at der er en fejl i dit program somregel.
Tror du skal se efter om du ikke har en eller anden opgave som kører, evt et komponent som er ved noget.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.