Avatar billede lifeweb Nybegynder
28. februar 2004 - 18:13 Der er 6 kommentarer og
1 løsning

Aktiver/fokuser form

Hej..!

Jeg har lavet en form som åbner Internet Explorer, hvilken bliver aktiv.

Derefter har jeg lave således at når man flytter musen henover formen(formstyle=StayOnTop), så markeres et af edit.felterne...

Dette er dog ikke nok, da formen ikke er aktiv/fokus.

Hvordan aktiverer/fokuserer jeg den..?

Jeg tror der er en funktion, men kan ikke finde den...

pft..!
Avatar billede hrc Mester
28. februar 2004 - 19:21 #1
Prøvede selv med Application.BringToFront; Edit1.SetFocus;, men det duede ikke. Markøren stillede sig godt nok det rette sted, men programmets knap i TaskBar'en blinkede og formen fik ikke fokus (blev blå)

Så prøvede jeg med Google og fandt dette link til Torry:
http://www.swissdelphicenter.ch/torry/showcode.php?id=261

Der nævnes flere muligheder og mon ikke du kan finde en der passer dit program.
Avatar billede Slettet bruger
28. februar 2004 - 19:24 #2
Prøv med SetForegroundWindow:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  SetForegroundWindow(Handle);
  Edit1.SetFocus;
end;
Avatar billede hrc Mester
28. februar 2004 - 19:26 #3
Det virker i alt fald med den første af rutinerne:

procedure TfrmMain.FormMouseMove(Sender: TObject; Shift: TShiftState;
                                X, Y: Integer);
begin
  if not Self.Focused then begin
    ForceForegroundWindow(Self.Handle);
    Memo1.SetFocus;
  end;
end;
Avatar billede hrc Mester
28. februar 2004 - 19:34 #4
hejhej: Når jeg prøver SetForegroundWindows så sker det samme som med BringToFront: Markøren stiller sig det rigtige sted, men programmets knap i TaskBar'en blinker og formen får ikke fokus.

function ForceForegroundWindow(hwnd: THandle): Boolean;
const
  SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
  SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
  ForegroundThreadID: DWORD;
  ThisThreadID: DWORD;
  timeout: DWORD;
begin
  if IsIconic(hwnd) then ShowWindow(hwnd, SW_RESTORE);

  if GetForegroundWindow = hwnd then
    Result := True
  else begin
    // Windows 98/2000 doesn't want to foreground a window when some other
    // window has keyboard focus

    if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
      ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
      ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
      (Win32MinorVersion > 0)))) then
    begin
      // Code from Karl E. Peterson, www.mvps.org/vb/sample.htm
      // Converted to Delphi by Ray Lischner
      // Published in The Delphi Magazine 55, page 16

      Result := False;
      ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
      ThisThreadID := GetWindowThreadPRocessId(hwnd, nil);
      if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then begin
        BringWindowToTop(hwnd); // IE 5.5 related hack
        SetForegroundWindow(hwnd);
        AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
        Result := (GetForegroundWindow = hwnd);
      end;

      if not Result then begin
        // Code by Daniel P. Stasinski
        SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
          SPIF_SENDCHANGE);
        BringWindowToTop(hwnd); // IE 5.5 related hack
        SetForegroundWindow(hWnd);
        SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
      end;
    end
    else begin
      BringWindowToTop(hwnd); // IE 5.5 related hack
      SetForegroundWindow(hwnd);
    end;

    Result := (GetForegroundWindow = hwnd);
  end;
end; { ForceForegroundWindow }
Avatar billede lifeweb Nybegynder
28. februar 2004 - 20:06 #5
det virker ikke helt som jeg gerne vil have det til, da jeg har en timer til at animere det...

enten skal det skrives om så det kun sker een gang - og det har jeg forsøgt, dog uden held...
kan du/i evt. skrive det om så det virker sammen med en timer og kun een gang fokuserer formen...

eller er der en bedre løsning..?
Avatar billede hrc Mester
29. februar 2004 - 19:25 #6
Tjaa. Ved mig virker det fint at placere aktiveringskoden i denne if-sætning:

if not Self.Focused then begin
...

Kun når musen er over den form som du vil have aktiveret, så tjekkes den via OnMouseMove-eventen og hvis den ikke har fokus, så aktiveres den - er det ikke det du mangler?
Avatar billede lifeweb Nybegynder
29. juni 2004 - 16:57 #7
lukker... fik ikke et svar jeg kunne bruge 100%
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