2011-06-20 43 views
1

在Windows 7下使用DelphiXE編譯的下面一段delphi代碼在Windows XP系統上以不同方式運行。 在表單中,我們有一個處理用戶對VK_Fxx鍵的響應的過程。在WinXP和Win7下delphi代碼執行的區別。爲什麼?

procedure TfrmGA010.FormKeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
begin 
inherited; 
KillKey := False; 

if bvMF1Panel.Enabled then 
begin 
case Key of 
    VK_F3 : begin 
       ........... 
       key := 0; 
       KillKey := True; 
       exit; 
       end; 
    VK_F4 : begin 
       ............ 
       key := 0; 
       KillKey := True; 
       exit; 
       end; 
    VK_F5 : begin 
       ........... 
       key := 0; 
       KillKey := True; 
       exit; 
       end; 
    VK_F7 : begin 
       ....... 
       key := 0; 
       KillKey := True; 
       exit; 
       end; 
    VK_F8 : begin 
       ........ 
       key := 0; 
       KillKey := True; 
       exit; 
       end; 
    VK_F11 : begin 
       if YesNoMsg('Delete?') then 
       begin 
        .......... 
        **F5.Click;**    
       end; 
       exit; 
       end; 
    end; 
end; 

行代碼F5.Click是在Windows XP而不是Windows 7的其中跳過,並計劃繼續下一步下執行。請幫忙嗎?

+2

@巴克斯喬治,你可以請給出完整的代碼VK_F11塊。 –

+0

@Gamecat,VK_F11塊中缺少的代碼行只是調用一個firebird存儲過程來刪除幾條記錄。 –

+0

如果你註釋掉這些行,它仍然不起作用?但YesNoMsg行被執行?缺少的行可能有一個例外... – Birger

回答

1

您可以調試代碼並查看VK_FXX是否與KEY類似。

3

基本診斷將涉及將可疑代碼放入try塊,並在異常處理程序中使用基本ShowMessage。

try 
    if YesNoMsg('Delete?') then 
    begin 
     .......... 
     **F5.Click;**    
    end; 
except 
    on E: Exception do 
    ShowMessage(E.ClassName + #13#10 + E.Message); 
end; 

如果你不喜歡ShowMessage,你總是可以有一個TMemo你的表格,你可以添加文字

Memo1.Lines.Add('2 records deleted successfully, about to click F5 :-) '); 

上。另外,防禦性編程建議你檢查前行的結果的代碼,然後繼續下一條指令(特別是如果它是刪除一對記錄的子例程)。你應該把它變成一個子例程,它返回至少2個不同的可能結果,加上它自己的異常處理程序(至少你可以在你想要的時候放入一個斷點),而不是簡單地把它放在一個返回True的函數中最後。

此外,我會將該F5.Click行移動到名爲DeleteSomething的過程中,然後調用該過程。

如果一切都失敗了,請記錄它的生命週期。當調試器無法提供幫助時,日誌記錄是次佳選擇。

相關問題