Avatar billede fun22 Nybegynder
24. maj 2004 - 16:48 Der 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?
Avatar billede dkn Nybegynder
24. maj 2004 - 17:33 #1
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...
Avatar billede fun22 Nybegynder
24. maj 2004 - 19:32 #2
lige nu bruger jeg denne kode:

if mainform.TBXItem1.Checked = true then begin
CanClose := true;
end
else begin
mainform.Hide;
CanClose := false;
end;

Hvordan kan den skrives om så windows kan lukke den når windows lukker?
Jeg har ikke sådanne en funktion på mit tray komponent...
Avatar billede nlf Nybegynder
24. maj 2004 - 22:22 #3
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;
Avatar billede fun22 Nybegynder
25. maj 2004 - 17:38 #4
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?
Avatar billede dkn Nybegynder
25. maj 2004 - 21:41 #5
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;
Avatar billede dkn Nybegynder
25. maj 2004 - 21:47 #6
ups du skal kun bruge:
procedure WMQueryEndSession(var Msg : TWMQueryEndSession); message WM_QueryEndSession;

men det kunne self også laves med TAppMessage
Avatar billede fun22 Nybegynder
04. juni 2004 - 16:43 #7
dkn >> nu lukker den godt nok programmet, men den stopper stadig med at lukke computeren... Så der skal klikkes "luk computeren" to gange...

Undskyld det har taget så lang tid, men har haft en del arbejde...
Avatar billede dkn Nybegynder
04. juni 2004 - 16:55 #8
prøv sådan:

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.
Avatar billede fun22 Nybegynder
06. juni 2004 - 10:37 #9
dkn >> har fået løst det problem nu,, men jeg mangler stadig, at få Indy pop3 til at virke...

Hvordan bruger man det?
Avatar billede dkn Nybegynder
06. juni 2004 - 13:14 #10
Avatar billede fun22 Nybegynder
06. juni 2004 - 17:20 #11
så er mit program næsten fundlendt.. nu mangler det bare at blive testet.. Takker for hjælpen...
Avatar billede dkn Nybegynder
06. juni 2004 - 17:27 #12
okay godt, var så lidt
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester