Salut

Je sais d'avance que vous allez trouver ça c.. mais j'ai un problème pour utiliser les API dans un programme Delphi (suis loin d'être l'experte qu'on a pourtant confirmé).

J'ai coutume d'utiliser les API Windows dans des programmes VB6... d'où ma difficulté. Le problème c'est que c'est sans doute trop simple...

(de plus, il me semble avoir déjà posé la question, mais je ne trouve plus la discussion... sans doute qu'elle aura été flushée)

Voici

Il s'agit de la fonction SetWindowPos. Je l'ai déjà utilisé en VB pour faire en sorte qu'un fenêtre reste au dessus des autres sans empêcher celles-ci d'avoir le focus.

En VB, il faut déclarer une fonction de l'api (dans la section des déclaration) avant de pouvoir l'utiliser.

En Delphi, apparemment, non. A moins que je ne me sois gourée.

So (comme disent les angliches), j'ai un checkBox que s'il est coché cette fonction est activée, sinon la fenêtre se comporte normalement. Du moins, c'est ce qui devrait se passer.

Le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TFrmColorSelector.chbAuDessusClick(Sender: TObject);
begin
if chbAuDessus.Checked then
    begin
    SetWindowPos (handle, HWND_TOPMOST, Left, Top, Width, Height,0);
    // Et pour s'amuser...
    BorderStyle     := bsNone;
    Height          := lgHautMin;
    Color           := clActiveCaption;
    AlphaBlend      := true;
    AlphaBlendValue := 160
    end
  else
    begin
    SetWindowPos (handle, HWND_NOTOPMOST, Left, Top, Width, Height,0);   
    // Un peu de sérieux, tout de même...
    BorderStyle     := bsSingle;
    Height          := lgHautMax;
    Color           := clBtnFace;
    AlphaBlend      := true;
    AlphaBlendValue := 255
    end
end;
De plus, en VB, il faut explicitement déclarer les constantes HWND_TOPMOST et HWND_NOTOPMOST. J'ai donc essayé avec une déclaration de constante, et sans la déclaration. Avec, j'ai un message d'erreur. J'ai aussi essayé avec la syntaxe MajMin (Hwnd_TopMost, par exemple), et là non plus, pas de résultat...

Alors, là, vraiment, je sais plus..


À titre indicatif, le code VB qui marche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
Option Explicit
 
Private Declare Function SetWindowPos Lib "user32" ( _
                ByVal hwnd As Long, _
                ByVal hWndInsertAfter As Long, _
                ByVal x As Long, ByVal y As Long, _
                ByVal cx As Long, ByVal cy As Long, _
                ByVal wFlags As Long) As Long
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
//'*** Fin des déclaration niveau module ***
 
Private Function PositionForm(ByVal Feuille As Form, Optional PrePlan As Boolean = True) As Long
    Dim lgConst As Long
    If PrePlan Then
        lgConst = HWND_TOPMOST
      Else
        lgConst = HWND_NOTOPMOST
    End If
    PositionForm = SetWindowPos(Feuille.hwnd, lgConst, Feuille.Left \ Screen.TwipsPerPixelX, _
                    Feuille.Top \ Screen.TwipsPerPixelY, _
                    Feuille.Width \ Screen.TwipsPerPixelX, _
                    Feuille.Height \ Screen.TwipsPerPixelY, 0)
End Function
 
Private Sub Check1_Click()
    If Check1 Then
        PositionForm Form1, True
      Else
        PositionForm Form1, False
    End If
End Sub
Oui, c'est vrai, il y a une différence.

J'avais essayé aussi, en Delphi, de procéder de cette façon. Vu qu'un fonction, par définition, ça retourne une valeur. Évidemment, d'une modification à l'autre, je n'ai plus le code que j'avais alors tapé... et qui de toutes façons ne fonctionnait pas non plus.

Alors, si vous avez quelques pistes. Histoire de me désembrouiller.