Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Pascal: Delphi: ikkunan pienennys

Janezki [24.12.2005 19:52:01]

#

Miten ikkuna pienennetään?

No jos ihan vakavia ollaan niin pitkän opiskelun ja tutkiskelun jälkeen sain selville, että se on se pieni viivanappi, mutta nyt on kyse aivan jostain muusta. Siis: Resoluutiota vaihtavissa ohjelmissa olisi hyvä olla pakoreitti käyttöjärjestelmään alt + tab -yhdistelmällä. Tämähän hoituu helposti abstraktilla komponentilla TApplicationEvents. Laitoin OnDeactivate - kohtaan ensin Application.Minimize ja sitten resoluution palautus, mutta pian huomasin, että kyseinen pienennyskäsky aktivoi sovelluksen uudelleen, joka johtaa uudelleen resoluution vaihtumiseen sovelluksen resoluutioon. Tässä se on selvällä pascalin kielellä:

procedure TDMMainModule.EventsActivate(Sender: TObject);
begin
 Check_And_ChangeResolution;
end;

procedure TDMMainModule.EventsDeactivate(Sender: TObject);
begin
 Application.Minimize; //Tämä aktivoi sovelluksen uudelleen
 RestoreResolution;
end;

Tässä vielä ohjelman kulku
- alt+tab, ohjelma deaktivoituu
- ohjelma pienennetään(ja se aktivoituu uudelleen)
- Resoluutio palautuu käyttöjärjestelmän oletukselle
- Koska ohjelmalla on aktivoitumisviesti jonossa, EventsActivate -proceduuri vaihtaa reson takaisin sovelluksen oletukselle.

Miten tämän voi ratkaista ilman viestihandlereita, kun en niitä vielä hallitse kovinkaan hyvin.

Metabolix [24.12.2005 21:48:58]

#

Eikö toimisi sillä, että ensin vaihtaisi resoluution takaisin ja sitten vasta pienentäisi ikkunan?

Janezki [25.12.2005 10:46:28]

#

Ei. Olen kokeillut, mutta eihän sen pitäisikään vaikuttaa mitenkään.

Metabolix [25.12.2005 11:55:12]

#

Niinpä tietysti. Enpä tullut ajatelleeksi. Onneksi (tai toisinaan harmiksi) myös Timer toimii viesteillä (WM_TIMER).

procedure TDMMainModule.EventsDeactivate(Sender: TObject);
begin
  MinimizeTimer.Interval := 1;
  MinimizeTimer.Enabled := True;
  RestoreResolution;
end;

procedure TDMMainModule.MinimizeTimerTimer(Sender: TObject);
begin
  Application.Minimize;
  MinimizeTimer.Enabled := False;
end;

Janezki [26.12.2005 09:11:33]

#

Mutta sovellushan aktivoituu kuitenkin application.minimizen kohdalla. Kokeilin kuitenkin tuotakin, mutta ei tuottanut ratkaisua.

Kun puhuin alussa viestihandlereista, niin olin väsännyt tällaisen pätkän:

type
  TDMMainModule = class(TDataModule)
   Events: TApplicationEvents;
   procedure EventsActivate(Sender: TObject);
   procedure EventsDeactivate(Sender: TObject);
  protected
   procedure MSGHookActivation(var Message: TCMActivate); message CM_ACTIVATE;
  end;

var
 DMMainModule   : TDMMainModule;
  HookActivation : Boolean;

procedure TDMMainModule.EventsActivate(Sender: TObject);
begin
 if EnabledResolution then
  Check_And_ChangeResolution;
end;

procedure TDMMainModule.EventsDeactivate(Sender: TObject);
begin
 if EnabledResolution then
  begin
   HookActivation := True;
   Application.ProcessMessages;
   RestoreResolution;
  end;
end;

procedure TDMMainModule.MSGHookActivation(var Message: TCMActivate);
begin
 if not HookActivation then
  begin
   EventsActivate(Nil);
   Exit;
  end;
 HookActivation := False;
end;

Mutta nyt resoluutio ei vaihdu ollenkaan, deaktivoinnin ja aktivoinnin aikana. Tätä tarkoitin sillä, että en oikein hallitse viestejä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta