2012-05-07 1 views
5

Screen ShotPourquoi cette erreur continue-t-elle à tordre les barres d'outils XE2 IDE?

enter image description here

Le code source suivant a été utilisé pour produire l'erreur ci-dessus. Tout ce que vous avez à faire est de compiler le programme et assurez-vous que l'IDE est toujours en cours d'exécution (l'erreur ne se produit pas si l'IDE est fermé), cliquez sur le bouton 12 à 15 fois et l'erreur apparaîtra.

Une fois l'erreur survenue, revenez à l'IDE, toutes les barres d'outils de l'EDI ont ensuite disparu. Vous devez arrêter l'IDE et recommencer, pour qu'ils réapparaissent.

Source Code

unit MainUnit; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, Winapi.ShlObj, System.SysUtils, 
    System.Variants, System.Classes, System.StrUtils, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.StdCtrls; 

type 
    TMainFrm = class(TForm) 
    Button1: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    MainFrm: TMainFrm; 
    hDesktop: HWND; 

implementation 

{$R *.dfm} 

function GetHandle(theHandle: HWND; NotUsed: NativeInt): LongBool; stdcall; 
begin 
    if (theHandle <> 0) then 
    begin 
    hDesktop := FindWindowEx(FindWindowEx(theHandle, 0, 'SHELLDLL_DefView', 
     nil), 0, 'SysListView32', nil); 
    end; 
    Result := (hDesktop = 0); 
end; 

procedure TMainFrm.FormCreate(Sender: TObject); 
var 
    lpss: TShellState; 
begin 
    ZeroMemory(@lpss, SizeOf(lpss)); 
    try 
    SHGetSetSettings(lpss, SSF_HIDEICONS, False); 
    finally 
    Button1.Caption := IfThen(lpss.fHideIcons, 'Show Icons', 'Hide Icons'); 
    end; 
    EnumWindows(@GetHandle, 0); 
    Button1.Enabled := (hDesktop <> 0); 
end; 

procedure TMainFrm.Button1Click(Sender: TObject); 
const 
    nCmdShow: array [Boolean] of NativeInt = (SW_HIDE, SW_SHOW); 
var 
    lpss: TShellState; 
begin 
    ZeroMemory(@lpss, SizeOf(lpss)); 
    try 
    SHGetSetSettings(lpss, SSF_HIDEICONS, False); 
    ShowWindow(hDesktop, nCmdShow[lpss.fHideIcons]); 

    lpss.fHideIcons := (not BOOL(lpss.fHideIcons)); 
    Button1.Caption := IfThen(lpss.fHideIcons, 'Show Icons', 'Hide Icons'); 
    finally 
    SHGetSetSettings(lpss, SSF_HIDEICONS, True); 
    end; 
end; 

end. 

écran d'application Prise de

enter image description here

Toute aide serait grandement appréciée.

MISE À JOUR

Les barres d'outils IDE ne disparaissent plus, et l'erreur ne semble pas plus, grâce à TOndrej pour les informations sur la désactivation de la « barre d'outils Profiler ». Maintenant, je reçois un scintillement très ennuyeux qui prend parfois de 10 à 15 secondes pour revenir à la normale.

+0

Je vous suggère d'essayer le Delphi XE, si vous le pouvez, il semble plus stable. – none

Répondre

5

Avez-vous installé AQTime? Le problème semble disparaître si vous masquez simplement la barre d'outils Profiler.

+0

Je suppose que cela ne sera pas lié à AQTime. Je ne l'ai pas, mais toutes les barres d'outils sur toutes les fenêtres (pas seulement Delphi IDE) scintillent lorsque les icônes sont affichées ou cachées sur ma machine. Cependant, je n'ai pas obtenu l'erreur * Un appel à une fonction du système d'exploitation a échoué *. – TLama

+0

@TLama Flicker n'est pas lié, l'erreur est probablement; Reproductible chaque fois que la barre d'outils Profiler est affichée, ne peut pas être reproduite lorsqu'elle est masquée. –

+0

Je ne m'attendais pas au scintillement. Et vous avez mon +1 parce que cela confirme juste votre théorie puisque je n'ai pas installé AQTime ;-) – TLama