2012-05-07 8 views
5

zrzut ekranuDlaczego ten błąd nadal psuje paski narzędzi XE2 IDE?

enter image description here

Poniższy kod źródłowy został użyty do wytworzenia błąd powyżej. Wszystko, co musisz zrobić, to skompilować program i upewnić się, że IDE nadal działa (błąd NIE występuje, jeśli IDE jest zamknięty), kliknij przycisk od 12 do 15 razy i pojawi się błąd.

Po wystąpieniu błędu przełącz się z powrotem na IDE, zniknęły wszystkie paski narzędzi dla IDE. Musisz zamknąć IDE i uruchomić ponownie, aby ponownie się pojawili. Ekran

kod źródłowy

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. 

Zastosowanie Strzał

enter image description here

Każda pomoc będzie mile widziana.

UPDATE

Paski narzędzi IDE znika już, a błąd nie pojawia się już, dzięki TOndrej do informacji o wyłączenie „paska narzędzi Profiler”. Teraz dostaję bardzo denerwujące migotanie, które czasami zajmuje 10 do 15 sekund, aby powrócić do normy.

+0

Proponuję wypróbować Delphi XE, jeśli możesz, wygląda bardziej stabilnie. – none

Odpowiedz

5

Czy masz zainstalowany system AQTime? Problem zniknie, jeśli po prostu ukryjesz pasek narzędzi Profila.

+0

Myślę, że nie będzie to związane z AQTime. Nie mam go, ale wszystkie paski narzędzi we wszystkich oknach (nie tylko w Delphi IDE) migają, gdy ikony są pokazywane lub ukrywane na moim komputerze. Jednak nie udało mi się uzyskać * błędu wywołania funkcji systemu operacyjnego *. – TLama

+0

@ Migotanie Tlamy nie ma związku, prawdopodobnie jest to błąd; powtarzalne za każdym razem, gdy pasek narzędzi Profila jest pokazany, nie mógł się powielać, gdy jest ukryty. –

+0

Nie spodziewałem się migotania. I dostałem moje +1, ponieważ to tylko potwierdza twoją teorię, ponieważ nie mam zainstalowanego AQTime ;-) – TLama