Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Timer (Amateuerfrage) (https://www.delphipraxis.net/90391-timer-amateuerfrage.html)

neus 16. Apr 2007 18:31


Timer (Amateuerfrage)
 
Hi,

mir macht dieses Delphi langsam mehr Spaß als PHP und mein Grundkurs C++ =).
Je mehr ich probiere umso mehr Fragen kommen mir aber auf.

Jetzt stehe ich davor:
"Ich lasse ein Programm laufen, kann aber ads Formular nicht mehr verschieben." Es sieht also so aus wie als wenn das Programm abgestürtzt ist und keine Rückmeldung gibt. In meinen Beispiel wird ein Ping geschickt mit Pausen. Aber solange er die Schleife ping, kann man das Formular nicht bewegen und das sieht irgendwie doof aus.

Was kann ich da tun. Wie verwende ich in meinem Beispiel den Timer , dass er mal funktioniert ?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
        max:=100;
        i:=1;
        ProgressBar1.Max:=max;
        while i < max do
        begin
                IdIcmpClient1.Host := Form1.Edit1.Text;
                IdIcmpClient1.Ping();
                If IdIcmpClient1.ReplyStatus.BytesReceived > 0 Then

                ListBox1.Items.Add(IntToStr(i) + ' ' + IdIcmpClient1.Host+' erreichbar '+ IntToStr(IdIcmpClient1.ReplyStatus.BytesReceived))
                else
                ListBox1.Items.Add(IntToStr(i) + ' ' + IdIcmpClient1.Host+' nicht erreichbar');

                i:=i+1;
                sleep(StrToInt(Edit2.Text));
                ProgressBar1.Position:=i;
        end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
        Timer1.Enabled:=False;
        Form1.Refresh;
        Application.ProcessMessages;
        Timer1.Enabled:=True;
end;

fLaSh11 16. Apr 2007 18:34

Re: Timer (Amateuerfrage)
 
Sleep friert die Form auch ein. Nimm die Prozedur DelayDelay.

neus 16. Apr 2007 18:59

Re: Timer (Amateuerfrage)
 
Zitat:

Zitat von fLaSh11
Sleep friert die Form auch ein. Nimm die Prozedur DelayDelay.

Mir ist es schon fast peinlich, aber kannst du für mein Beispiel den kompletten Source machen ?

Klaus01 16. Apr 2007 19:04

Re: Timer (Amateuerfrage)
 
Delphi-Quellcode:
procedure Delay(Milliseconds: Integer);
var
  Tick: DWord;
  Event: THandle;
begin
  Event := CreateEvent(nil, False, False, nil);
  try
    Tick := GetTickCount + DWord(Milliseconds);
    while (Milliseconds > 0) and
          (MsgWaitForMultipleObjects(1, Event, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
    begin
      Application.ProcessMessages;
      if Application.Terminated then Exit;
      Milliseconds := Tick - GetTickcount;
    end;
  finally
    CloseHandle(Event);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
        max:=100;
        i:=1;
        ProgressBar1.Max:=max;
        while i < max do
        begin
                IdIcmpClient1.Host := Form1.Edit1.Text;
                IdIcmpClient1.Ping();
                If IdIcmpClient1.ReplyStatus.BytesReceived > 0 Then

                ListBox1.Items.Add(IntToStr(i) + ' ' + IdIcmpClient1.Host+' erreichbar '+ IntToStr(IdIcmpClient1.ReplyStatus.BytesReceived))
                else
                ListBox1.Items.Add(IntToStr(i) + ' ' + IdIcmpClient1.Host+' nicht erreichbar');

                i:=i+1;
                delay(StrToInt(Edit2.Text)); // <----
                ProgressBar1.Position:=i;
        end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
        Timer1.Enabled:=False;
        Form1.Refresh;
        Application.ProcessMessages;
        Timer1.Enabled:=True;
end;
Grüße
Klaus

mkinzler 16. Apr 2007 19:05

Re: Timer (Amateuerfrage)
 
Schau dir mal die Signatur an:
Delphi-Quellcode:
procedure Delay(Milliseconds: Integer);
ist doch eigentlich selbsredend


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz