Avatar billede cms Nybegynder
03. august 2001 - 16:56 Der er 10 kommentarer og
1 løsning

Activation af form

Hvordan får man aktiveret en form. Det skal være relativt platformsuafhængigt, dvs. virke på både Win9x, NT og 2K.

Jeg har selvfølgelig prøvet med alt fra:

  BringWindowToTop(Handle);
  SetActiveWindow(Application.Handle);
  SetForegroundWindow(Handle);
  SetActiveWindow(Handle);
  SetFocus;
  SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE or SWP_SHOWWINDOW or SWP_NOSIZE);
  ShowWindow(Handle, SW_SHOW);

og jeg ved ikke hvad jeg ikke har prøvet.

ØNSKET:
For at give et eksempel på hvordan det skal bruges kan vi sige at man sætter en timer på 10 sekunder, eller 5. når man kører programmet skifter man over til notepad og begynder at skrive en masse gylle. efter de fem sekunder er gået skal formen blive aktiveret og sætte sin focus til en memokomponent. i memo\'en vil teksten så komme.
Man er stædig og går over i notepad igen og skriver. efter yderligere 5 sekunder vil den igen hoppe over til mit program\'s memo.

I virkeligheden skal det dog bruges til noget helt andet.
Avatar billede erikjacobsen Ekspert
03. august 2001 - 17:03 #1
fornavn.show;
eller
formnavn.showmodal;
Avatar billede cms Nybegynder
03. august 2001 - 17:35 #2
nej for formen er jo visible, den er bare ikke aktiv.
Avatar billede cms Nybegynder
03. august 2001 - 17:43 #3
den skal i øvrigt ikke være modal. det giver ikke mening, for der er kun én form.

den skal bare være ovenover alle andre vinduer i windows. men den skal ikke være topmost - altså permanent øverst.
Avatar billede erikjacobsen Ekspert
03. august 2001 - 17:45 #4
Ok, det kan man godt - hvordan er det nu lige ..... jeg prøver måske senere.
Avatar billede cms Nybegynder
03. august 2001 - 17:51 #5
håber :-)

forresten skal den heller ikke bare blinke nede på taskbaren, det kræver at brugeren trykker med musen og det gi\'er vi ikk :-)
Avatar billede jesperhansen Nybegynder
03. august 2001 - 22:06 #6
Hmm. SetFocus virker perfekt på windows 2000, er der nogle platforme som den ikke virker på?
Avatar billede erikjacobsen Ekspert
03. august 2001 - 22:22 #7
Det kommer nu nok an på hvordan man kalder den. Jeg har prøvet dette, uden
held, og nu vil jeg vente og se hvad du har gjort.

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
  for i:=1 to 20 do
  begin
    sleep(5000);
    setfocus;
  end;
  showmessage(\'slut\');
end;
Avatar billede jesperhansen Nybegynder
04. august 2001 - 00:21 #8
Jeg havede to forme, på den første havde jeg to knapper.

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  Form2.SetFocus;
end;

Men det løser vist ikke dit problem..
Måske kunne man prøve noget i stil med dette:
  FormStyle := fsStayOnTop;
  FormStyle := fsNormal;




Avatar billede pellelil Nybegynder
04. august 2001 - 13:25 #9
Direkte fra Delphi\'s hjælp:
<SNIP>
The following code uses two forms. Form1 has a button on it. The second form is used as a tool palette. This code makes the palette form visible, and ensures it is the top form by bringing it to the front.
To run this example, you must add Unit2 in the uses clause of your unit.

procedure TForm1.ShowPaletteButtonClick(Sender: TObject);

begin
if Form2.Visible = False then Form2.Visible := True;
Form2.BringToFront;

end;
</SNIP>
Avatar billede cms Nybegynder
04. august 2001 - 14:28 #10
<SNIP>
  FormStyle := fsStayOnTop;
  FormStyle := fsNormal;
</SNIP>

... virker fint til at få formen forrest. Men hvis man bruger en timer med interval på 5000 og man sidder og skriver i notepad og bare fortsætter, så får formen ikke focus.
Det hjælper ikke med SetFocus eller SetActiveWindow, ej heller BringToFront...
Avatar billede cms Nybegynder
04. august 2001 - 16:56 #11
følgende kode virker:

function GetAnimation: Boolean;
var
  Info: TAnimationInfo;
begin
  Info.cbSize := SizeOf(TAnimationInfo);
  if SystemParametersInfo(SPI_GETANIMATION, SizeOf(Info), @Info, 0) then
    Result := Info.iMinAnimate <> 0 else
    Result := False;
end;

procedure SetAnimation(Value: Boolean);
var
  Info: TAnimationInfo;
begin
  Info.cbSize := SizeOf(TAnimationInfo);
  BOOL(Info.iMinAnimate) := Value;
  SystemParametersInfo(SPI_SETANIMATION, SizeOf(Info), @Info, 0);
end;

procedure ShowWinNoAnimate(Handle: HWnd; CmdShow: Integer);
var
  Animation: Boolean;
begin
  Animation := GetAnimation;
  if Animation then SetAnimation(False);
  ShowWindow(Handle, CmdShow);
  if Animation then SetAnimation(True);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if GetActiveWindow=Handle then exit;
  ShowWinNoAnimate(Application.Handle, SW_MINIMIZE);
  ShowWinNoAnimate(Application.Handle, SW_RESTORE);
end;
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