2013-01-02 21 views
5

Stworzyłem program testowy, który ma wielokrotnie zmieniać kolor panelu w systemie Linux (PCLinuxOS), ale nie działa zbyt dobrze. Albo tylko zmienia kolor tła paneli, gdy klikniesz coś, albo klikniesz myszką, a potem przestanie działać albo program się zawiesi po krótkim czasie.Dlaczego panel Winform aktualizuje się tylko po najechaniu kursorem myszy lub kliknięciu myszą?

Oto jak winform wygląda z 2 płyt, przycisk, a licznik:

enter image description here

Oto kod za nim:

namespace TestIndicator; 

interface 

uses 
    System.Drawing, 
    System.Collections, 
    System.Collections.Generic, 
    System.Windows.Forms, 
    System.ComponentModel; 

type 
    /// <summary> 
    /// Summary description for MainForm. 
    /// </summary> 
    MainForm = partial class(System.Windows.Forms.Form) 
    private 
    method d_Click(sender: System.Object; e: System.EventArgs); 
    method timer1_Tick(sender: System.Object; e: System.EventArgs); 
    protected 
    method Dispose(disposing: Boolean); override; 
    public 
    constructor; 
    end; 

var 
    TurnOnRx, TurnOnTx:Boolean; 

implementation 

{$REGION Construction and Disposition} 
constructor MainForm; 
begin 
    // 
    // Required for Windows Form Designer support 
    // 
    InitializeComponent(); 

    // 
    // TODO: Add any constructor code after InitializeComponent call 
    // 
    TurnOnRx := true; 
    TurnOnTx := true; 
end; 

method MainForm.Dispose(disposing: Boolean); 
begin 
    if disposing then begin 
    if assigned(components) then 
     components.Dispose(); 

    // 
    // TODO: Add custom disposition code here 
    // 
    end; 
    inherited Dispose(disposing); 
end; 
{$ENDREGION} 

method MainForm.d_Click(sender: System.Object; e: System.EventArgs); 
begin 
    timer1.Enabled := not timer1.Enabled; 
end; 

method MainForm.timer1_Tick(sender: System.Object; e: System.EventArgs); 
begin 
    if TurnOnTx then 
    begin 
     TurnOnTx:=false; 
     TxLight.BackColor := Color.Red; 
    end 
    else 
    begin 
     TurnOnTx:=true; 
     TxLight.BackColor := Color.black; 
    end; 

    if TurnOnRx then 
    begin 
     TurnOnRx := false; 
     RxLight.BackColor := Color.Lime; 
    end 
    else 
    begin 
     TurnOnRx := true; 
     RxLight.BackColor := Color.Black; 
    end; 
end; 

end. 
+0

Działa tylko po kliknięciu formularza, ponieważ włączasz licznik czasu tylko pod obsługą kliknięcia. Jeśli chcesz, aby panele od razu migały, włącz (lub uruchom) zegar w konstruktorze. A jaki jest błąd, który dostajesz na mysz? Poza tym i tak nie widzę żadnego over-handler'a. – nawfal

+0

@nawfal, miałem na myśli, że po uruchomieniu lub włączeniu timera przez kliknięcie przycisku, backcolor panelu nie aktualizuje się, ale tylko wtedy, gdy przesuniesz wskaźnik myszy nad przyciskiem i/lub kliknij przycisk lub pasek narzędzi Winform, nawet jeśli timer jest włączony. Innym razem po prostu siedzi, nic nie robi. Mogę jednak uruchomić ten sam program i uruchomić go w systemie Windows, który działa zgodnie z oczekiwaniami. – ThN

+0

Mogę jednak uruchomić ten sam program i uruchomić go w systemie Windows, który działa zgodnie z oczekiwaniami. Tak, nie mam żadnej myszy nad wydarzeniem. Program działa tak, jakby wysyłał tylko flagę wiadomości WM_Paint w celu odświeżenia lub odświeżenia, gdy robi się tylko coś z winformem. – ThN

Odpowiedz

0

Może przedział czasowy jest zbyt krótki i kolory zmieniają się zbyt szybko?

namespace TestIndicator; 
interface 
uses 
    System.Drawing, 
    System.Collections, 
    System.Collections.Generic, 
    System.Windows.Forms, 
    System.ComponentModel; 

type 
    /// <summary> 
    /// Summary description for MainForm. 
    /// </summary> 
    MainForm = partial class(System.Windows.Forms.Form) 
    private 
    method d_Click(sender: System.Object; e: System.EventArgs); 
    method timer1_Tick(sender: System.Object; e: System.EventArgs); 
    protected 
    method Dispose(disposing: Boolean); override; 
    public 
    constructor; 
    end; 

var 
    TurnOnRx, TurnOnTx:Boolean; 

implementation 

{$REGION Construction and Disposition} 
constructor MainForm; 
begin 
    // 
    // Required for Windows Form Designer support 
    // 
    InitializeComponent(); 

    // 
    // TODO: Add any constructor code after InitializeComponent call 
    // 
    TurnOnRx := true; 
    TurnOnTx := true; 

    timer1.Inverval := 1000; 
end; 

method MainForm.Dispose(disposing: Boolean); 
begin 
    if disposing then begin 
    if assigned(components) then 
     components.Dispose(); 

    // 
    // TODO: Add custom disposition code here 
    // 
    end; 
    inherited Dispose(disposing); 
end; 
{$ENDREGION} 

method MainForm.d_Click(sender: System.Object; e: System.EventArgs); 
begin 
    timer1.Enabled := not timer1.Enabled; 
end; 

method MainForm.timer1_Tick(sender: System.Object; e: System.EventArgs); 
begin 
    if TurnOnTx then 
    begin 
     TurnOnTx:=false; 
     TxLight.BackColor := Color.Red; 
    end 
    else 
    begin 
     TurnOnTx:=true; 
     TxLight.BackColor := Color.black; 
    end; 

    if TurnOnRx then 
    begin 
     TurnOnRx := false; 
     RxLight.BackColor := Color.Lime; 
    end 
    else 
    begin 
     TurnOnRx := true; 
     RxLight.BackColor := Color.Black; 
    end; 

    TxLight.Refresh(); 
    RxLight.Refresh(); 

    Application.DoEvents(); 
end; 

end.