Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Schleife zum Wiederholen eines Sources (https://www.delphipraxis.net/7339-schleife-zum-wiederholen-eines-sources.html)

davidwittesz 9. Aug 2003 19:07


Schleife zum Wiederholen eines Sources
 
Delphi-Quellcode:
unit Unit1;
interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,    Forms,Dialogs, ShellAPI,StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

private
    { Private-Deklarationen }
public
    { Public-Deklarationen }
end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  w : hWnd;
  e : Integer;
begin
 // Externes Programm oeffnen
   while w<>0 do begin
    ShellExecute(0, PChar ('open'), 'C:\Programme\InternetExplorer\IEXPLORE.EXE','', '',SW_SHOWMIMIMIZED);
  for i := 0 to 10 do
  begin
      Label1.Caption := IntToStr(i);
      Label1.Repaint;
      // Pause (in msec)
      Sleep(500);
  end;

  // Externes Programm oeffnen
  w := FindWindow(NIL,'about:blank - Microsoft Internet Explorer');

  if W<>0 then
    PostMessage(W, wm_close, 1, 1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;

end.
[edit=MrSpock]Code Tags eingefügt und Leerzeilen gelöscht[/edit]


WIE KANN ICH DEM PROGRAMM SAGEN DAS ES VON VORNE ANFANGEN SOLL?
:cat:

[edit=MrSpock] Mfg, MrSpock[/edit]
[edit=sakura]Überschrift auf Kleinbuchstaben geändert. Mfg, sakura[/edit]

chris01 9. Aug 2003 19:17

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
Timer!?

MrSpock 9. Aug 2003 19:30

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
Hallo davidwittesz,

in der Regel benutzt man dazu eine Schleife:

Delphi-Quellcode:
repeat
{ hier den Code, der wiederholt werden soll }
until aufhoeren;
aufhoeren muss natürlich irgendwann einmal auf True gesetzt werden, sonst hast du eine Endlosschleife.

[edit=MrSpock]Willkommensgruß vergesseb :mrgreen:[/edit]

Herzlich willkommen im Delphi-PRAXIS Forum.

davidwittesz 9. Aug 2003 19:37

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
wie muss ich den repead befeht einbringen das der prozess vom ersten begin bis zum letzten end; immer und immer wieder wiederholt wird biss ich auf einen butten clicke ?

CalganX 9. Aug 2003 19:38

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
Hi,
theoretisch kann dein Source gar nicht funktionieren, weil ein end; fehlt, dass zur while-Schleife gehört.

Chris

MrSpock 9. Aug 2003 19:51

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
Hallo davidwittesz,

wenn du so etwas machen möchtset, bieten sich Threads an. Du erstellst einen Thread, den du solange laufen lässt, bis ein bestimmtest Event (z.B. das Drücken eines Schalters passiert. Das wichtige ist ja hierbei, dass während dein "Thread läuft" noch ein anderer Thread (das Hauptprogramm) aufpassen musst, wann die Bedingung zum Abbruch erfüllt ist.

davidwittesz 9. Aug 2003 19:58

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
wie sieht den so ein thread aus ? die while schleife ist hier nicht zu beachten die habe ich vergessen zu endfernen, das war der erste versuch das programm zu wiederholen.

danke das ihr alle so fleißig antwortet :D


--------------------------------------------------------------------------
david :cat:

MrSpock 9. Aug 2003 21:08

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
Hallo davidwittesz,

die Online Hilfe erklärt das Prinzip recht gut.

Du leitest eine neue Klasse von TThread ab. Das wichtigste ist die Execute Methode, die du überschreibst:

Delphi-Quellcode:
TMyThread = class(TThread)
    private
      { private-Deklarationen }
      protected
    procedure Execute; override;
   end;

...
procedure TMyThread.Execute;
begin
  while Not Terminated do
  { Deinen Code einfügen, der wiederholt werden soll }
 end;
Das Hauptprogramm terminiert (Arnie lässt grüßen :mrgreen:) den Thread auf Knopfdruck:

Delphi-Quellcode:
procedure THauptForm.Button1Click(Sender: TObject);
begin
  MyThread.Terminate;
end;

davidwittesz 9. Aug 2003 22:33

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
er gibt mir bei



TMyThread= class(TThread)

folgende Fehlermeldung: Expected ':' but '=' found.


wenn ich das = durch einen : ersetze gibt er mir die Meldung:

Expected an identifier but CLASS found


und nu ???

-------------------------------------------------------------------------
jeder mag mich nur mein computer rebelliert!!!!!!

whitey :cat:

Uncle Cracker 9. Aug 2003 22:50

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
Du musst auch vor TMyThread= class(TThread) ein ';' setzten, also so:
Code:
TForm1 = class(TForm);
TMyThread = class(TThread)
    private
      { private-Deklarationen }
      protected
    procedure Execute; override;
   end;

...
procedure TMyThread.Execute;
begin
  while Not Terminated do
  { Deinen Code einfügen, der wiederholt werden soll }
end;

davidwittesz 9. Aug 2003 23:05

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
wenn jemand lust und zeit hatt könnte er mir ja mal den surce debuggen ich komme nicht weiter


Delphi-Quellcode:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ShellAPI,StdCtrls,ExtCtrls;

type
    TForm1 = class(TForm);
    TMyThread= class(TThread)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

private
    { Private declarations }
protected
     procedure Execute; override;
end;

var
       Form1: TForm1;

implementation

{$R *.DFM}

procedure TMyThread.Execute;
begin
  while Not Terminated do
  procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  w : hWnd;
begin
// Externes Programm oeffnen
ShellExecute(0, PChar('open'), 'C:\Programme\Internet Explorer\IEXPLORE.EXE','', '', SW_SHOWMINIMIZED);
for
  i := 0 to 10 do
  begin
    Label1.Caption := IntToStr(i);
    Label1.Repaint;
    // Pause (in msec)
    Sleep(500);
end;
  // Externes Programm schliessen
  w := FindWindow(NIL,'about:blank - Microsoft Internet Explorer');
  if W<>0 then
    PostMessage(W, wm_close, 1, 1);
end;

procedure THauptForm.Button2Click(Sender: TObject);
begin
  MyThread.Terminate;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Close;
end;

end.
danke whitey :cat:

[edit=Luckie]Es geht auch mit weniger Leerzeilen. :roll: Mfg, Luckie[/edit]

Luckie 9. Aug 2003 23:23

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  w : hWnd;
  e : Integer;
begin
// Externes Programm oeffnen
   while w<>0 do
   begin
     ShellExecute(0, 'open', 'C:\Programme\InternetExplorer\IEXPLORE.EXE', '','', SW_SHOWMIMIMIZED);
     for i := 0 to 10 do
     begin
       Label1.Caption := IntToStr(i);
       Label1.Repaint;
       // Pause (in msec)
       Sleep(500);
     end;
     // Externes Programm oeffnen
     w := FindWindow(NIL,'about:blank - Microsoft Internet Explorer');
     if W<>0 then
       PostMessage(W, wm_close, 1, 1);
  end;
end;
Ohne Thread.

davidwittesz 9. Aug 2003 23:47

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
[edit=Luckie]Unformatierten Code mit duzenden überflüssigen Leerzeilen entfernt. Mfg, Luckie[/edit]

davidwittesz 10. Aug 2003 00:14

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ShellAPI,StdCtrls,ExtCtrls;


type
    TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Button3: TButton;



    procedure Button1Click(Sender: TObject);


    procedure Button2Click(Sender: TObject);

private
    { Private declarations }

public
{ public declarations }




end;
var
Form1: TForm1;

implementation
$R *.DFM}
begin
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  w : hWnd;
  e : Integer;
begin
// Externes Programm oeffnen
   while w<>0 do
   begin
     ShellExecute(0, 'open', 'C:\Programme\InternetExplorer\IEXPLORE.EXE', '','', SW_SHOWMIMIMIZED);
     for i := 0 to 10 do
     begin
       Label1.Caption := IntToStr(i);
       Label1.Repaint;
       // Pause (in msec)
       Sleep(500);
     end;
     // Externes Programm oeffnen
     w := FindWindow(NIL,'about:blank - Microsoft Internet Explorer');
     if W<>0 then
       PostMessage(W, wm_close, 1, 1);
  end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
end.
---------------------------------------------------------------------------
jetzt geht gar nichts mehr , das programm startet nicht und es kommt auch keine fehler meldung.

------------------------------------------------------------------------

danke whitey :cat:

[edit=Luckie] Mfg, Luckie[/edit]

davidwittesz 11. Aug 2003 09:37

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
Delphi-Quellcode:
procedure TMyThread.Execute;
begin
  while Not Terminated do
  [U]procedure TForm1.Button1Click(Sender: TObject);[/U]
var
  i : Integer;
  w : hWnd;
begin
__________________________________________________ ______________________

kann es sein das der unterstrichene butten da nicht hingehört und deshalb das programm nicht laufen will ?

mfg whitey :cat:

Luckie 11. Aug 2003 10:13

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
Das wäre möglich. Eine Prozedur-Deklaration hat da nichts verloren.

MrSpock 11. Aug 2003 10:20

Re: SCHLEIFE ZUM WIEDERHOLEN EINES SOURCES
 
Hallo davidwittesz,

zum obigen Code, der auf Luckies Vorschlag basiert, solltest du w noch vorbesetzen. In der while Schleife fragst du ab, ob w <> 0 ist, aber w hat ja zu diesem Zeitpunkt noch keinen definierten Wert. Setze einfach vor der while Schleife w := 1;

Willst du es mit Threads lösen, dann musst es soheißen:

Delphi-Quellcode:
procedure TMyThread.Execute;
var
  i : Integer;
  w : hWnd;
begin
  while Not Terminated do
  begin
    // Externes Programm oeffnen
    ShellExecute(0, PChar('open'), 'C:\Programme\Internet Explorer\IEXPLORE.EXE','', '', SW_SHOWMINIMIZED);
    for i := 0 to 10 do
    begin
      Label1.Caption := IntToStr(i);
      Label1.Repaint;
      // Pause (in msec)
      Sleep(500);
    end;
    // Externes Programm schliessen
    w := FindWindow(NIL,'about:blank - Microsoft Internet Explorer');
    if W<>0 then
      PostMessage(W, wm_close, 1, 1);
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 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