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 abbrechen... (https://www.delphipraxis.net/11803-schleife-abbrechen.html)

horst 14. Nov 2003 01:32


Schleife abbrechen...
 
guten morgen ;)
wer mag mir sagen wie ich diese schleife abbrechen kann?
Delphi-Quellcode:
  for i := 1 to StringGrid1.RowCount -1 do
//Gesamt
Delphi-Quellcode:
procedure TForm1.Button8Click(Sender: TObject);
var
  FileName, NewFile: OleVariant;
  i, j: Integer;
  s: string;
begin
  for i := 1 to StringGrid1.RowCount -1 do
  begin
    s := StringGrid1.Cells[8, i];
    with TRegistry.Create do
   try
      RootKey := HKEY_CURRENT_USER;
      if OpenKey('\Software\VB and VBA Program Settings\FRITZ!fax\Print', True) then
      begin
        WriteString('Microsoft Word - test.doc', s);
        end;
    finally
      CloseKey;
      Free;
      WordApplication1.Connect;
      FileName := 'C:\test.doc';
      WordApplication1.Documents.Open(FileName, EmptyParam, EmptyParam, EmptyParam,
        EmptyParam, EmptyParam, EmptyParam, EmptyParam,
        EmptyParam, EmptyParam);
      WordDocument1.Close;
      WordApplication1.PrintOut;
      sleep(2000);
      WordDocument1.Disconnect;
    end;
  end;
end;

Luckie 14. Nov 2003 02:37

Re: Schleife abbrechen...
 
break

horst 14. Nov 2003 05:52

Re: Schleife abbrechen...
 
yo
nur.....wenn das ding am laufen ist krieg ich nichts mehr geklickt (oder nach dem 20x mal vielleicht).

Duffy 14. Nov 2003 05:59

Re: Schleife abbrechen...
 
Hallo Horst.
schau mal nach "Application.ProcessMessages"
bye
Claus

horst 14. Nov 2003 06:11

Re: Schleife abbrechen...
 
hallo :-D
reagiert zwar nicht direkt, aber es klappt.

Burning_Chrome 14. Nov 2003 07:04

Re: Schleife abbrechen...
 
hi!

eine schleife mit break abzubrechen ist nur einen hauch weniger haarstraeubend als sie mit goto zu verlassen... es ist besser, sich solche sachen zu verkneifen und statt dessen andere konstruktionen zu verwenden. ich sprech hier aus eigener (bugsuchfrustrations-) erfahrung...

Best_Regards
Burning_Chrome

horst 14. Nov 2003 07:51

Re: Schleife abbrechen...
 
hallo...
Zitat:

und statt dessen andere konstruktionen zu verwenden.
und welche andere konstruktionen sind das?
grüße horst

Sharky 14. Nov 2003 08:09

Re: Schleife abbrechen...
 
Hai horst,

mal so aus dem stehgreif:

Delphi-Quellcode:
var
 abbruch : Boolean  // Globale Variable um die Schleife beenden zu können

procedure TForm1.Button1Click(Sender: TObject);
var
  ndx              : Integer;
begin
  ndx := 1;
  abbruch := False;
  while (ndx < StringGrid1.RowCount - 1) and (not abbruch) do
    begin
      inc(ndx);
    end;
end;

choose 14. Nov 2003 08:13

Re: Schleife abbrechen...
 
Hallo Sharky,

wenn Du eine globale Variable verwendest und mehrere Fenster kreierst, würden alle Schleifen in allen Fenstern abbrechen oder gar nicht erst starten, wenn Du abbruch auf True setzt.

Darüber hinaus birgt der Einsatz von Application.Processmessages viele Gefahren, die ich zT hier dargestellt habe.

Sharky 14. Nov 2003 08:21

Re: Schleife abbrechen...
 
Zitat:

Zitat von choose
...wenn Du eine globale Variable verwendest und mehrere Fenster kreierst, würden alle Schleifen in allen Fenstern abbrechen oder ....

Hai choose,

der Code soll den Ansatz der Notwendigen Schleifenkonstruktion zeigen. Nicht mehr und nicht weniger. Das es noch etwas Feinarbeit benötigt sollte klar sein.

horst 14. Nov 2003 08:24

Re: Schleife abbrechen...
 
hai ;)
danke. was ist
Delphi-Quellcode:
inc(ndx);?
?
wenn ich kein Application.Processmessages verwende krieg ich den button nicht geklickt.
Update funktioniert auch nicht.
was kann ich sonst tun?
grüße...

ims 14. Nov 2003 08:35

Re: Schleife abbrechen...
 
inc(variable) zählt die angegebene variable um 1 hoch, also z.B. von 2 auf 3...

application.processmessages wird benötigt, damit deine anwendung in rechenintensiven operationen weiterhin auf den benutzer reagiert.

Zitat:

Mit der Methode ProcessMessages können Sie eine Anwendung unterbrechen, sodass die Ereigniswarteschlange verarbeitet werden kann.
-> aus der OH

horst 14. Nov 2003 10:52

Re: Schleife abbrechen...
 
irgendwie klappt das nicht auch wenn ich den button anklicke:

habe es so gemacht:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  ndx: Integer;
begin
  ndx := 1;
  abbruch := true;
  while (ndx < StringGrid1.RowCount - 1) and (not abbruch) do
  begin
    inc(ndx);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  FileName: OleVariant;
  i, j: Integer;
  s: string;
begin
  Application.ProcessMessages;
  for i := 0 to StringGrid1.RowCount - 1 do
  begin
    s := StringGrid1.Cells[8, i];
    with TRegistry.Create do
    try
      RootKey := HKEY_CURRENT_USER;
      if OpenKey('\Software\VB and VBA Program Settings\FRITZ!fax\Print', True) then
      begin
        WriteString('Microsoft Word - test.doc', s);
      end;
    finally
      CloseKey;
      Free;
      WordApplication1.Connect;
      FileName := 'C:\test.doc';
      WordApplication1.Documents.Open(FileName, EmptyParam, EmptyParam, EmptyParam,
        EmptyParam, EmptyParam, EmptyParam, EmptyParam,
        EmptyParam, EmptyParam);
      WordDocument1.Close;
      WordApplication1.PrintOut;
      sleep(3000);
      WordDocument1.Disconnect;
    end;
  end;
end;

Sharky 14. Nov 2003 11:17

Re: Schleife abbrechen...
 
Zitat:

Zitat von horst
irgendwie klappt das nicht auch wenn ich den button anklicke:

Hai horst,

so kann das auch nicht gehen.

Vergleiche mal meinen Code mit deinem
Delphi-Quellcode:
procedure Delay(msecs:integer);
var
  FirstTickCount:longint;
begin
  FirstTickCount:=GetTickCount;
  repeat
    Application.ProcessMessages; {allowing access to other controls, etc.}
  until ((GetTickCount-FirstTickCount) >= Longint(msecs));
end;

{****************************************************}

procedure TForm1.Button1Click(Sender: TObject);
var
  ndx              : Integer;
  FileName: OleVariant;
  i, j: Integer;
  s: string;
begin
  Button1.Enabled := False;
  ndx := 1;
  abbruch := false;
  while (ndx < StringGrid1.RowCount - 1) and (not abbruch) do
    begin
      s := StringGrid1.Cells[8, i];
      with TRegistry.Create do
        try
          RootKey := HKEY_CURRENT_USER;
          if OpenKey('\Software\VB and VBA Program Settings\FRITZ!fax\Print', True) then
            begin
              WriteString('Microsoft Word - test.doc', s);
            end;
        finally
          CloseKey;
          Free;
          WordApplication1.Connect;
          Application.ProcessMessages;
          FileName := 'C:\test.doc';
          WordApplication1.Documents.Open(FileName, EmptyParam, EmptyParam, EmptyParam,
            EmptyParam, EmptyParam, EmptyParam, EmptyParam,
            EmptyParam, EmptyParam);
          WordDocument1.Close;
          WordApplication1.PrintOut;
          Delay (3000);
          WordDocument1.Disconnect;
          inc(ndx);
          Application.ProcessMessages;
        end;
    end;
end;

{****************************************************}

procedure TForm1.Button2Click(Sender: TObject);
begin
  abbruch := True;
  Button1.Enabled := True;
end;

horst 14. Nov 2003 11:34

Re: Schleife abbrechen...
 
wow...das funktioniert 100%.
ich verstehe aber nur die hälfte, könntest du evt. dazu ein paar kommentare zu schreiben?
Code:
procedure Delay(msecs:integer);
var
  FirstTickCount:longint;
begin
  FirstTickCount:=GetTickCount;
  repeat
    Application.ProcessMessages; {allowing access to other controls, etc.}
  until ((GetTickCount-FirstTickCount) >= Longint(msecs));
end;
meins war ja nicht nur ein wenig falsch.
nur ist es nun so, dass immer nur die erste nummer übergeben wird und nicht mehr alle anderen aus dem stringgrid.

kann den fehler nicht finden.

Sharky 14. Nov 2003 11:41

Re: Schleife abbrechen...
 
Zitat:

Zitat von horst
ich verstehe aber nur die hälfte, könntest du evt. dazu ein paar kommentare zu schreiben?

Du hattest bei dir die Funktion Sleep verwendet. Diese hält den aktuelle Thread an. (Es werden also in dieser Zeit auch keine Nachrichten verarbeitet.

Die Funktion Delay die ich aus der Code-Library genommen habe macht nichts anderes als in einer Schleife zu waren bis seit der aktuellen "Zeit" (wird mit GetTickCount ermittelt) die angegebene Anzahl von millisekunden verstrichen ist. Wobei Zeit eigentlich falsch ist. Aber das steht in der OnlineHilfe.

Ups... mein Fehler.

Delphi-Quellcode:
  s := StringGrid1.Cells[8, i]; // das i durch ndx ersetzen!!!

horst 14. Nov 2003 11:44

Re: Schleife abbrechen...
 
funktioniert perfekt!
du hast mir damit sehr weiter geholfen, danke.

horst 14. Nov 2003 11:47

Re: Schleife abbrechen...
 
war zu voreilig...
in meinem stringrid sind 9 reihen
es werden nur 7 übergeben, fällt dir spontan was dazu ein?

Sharky 14. Nov 2003 11:58

Re: Schleife abbrechen...
 
Hmmm... eigentlich nicht. Welche beiden werden denn nicht übergeben?

horst 14. Nov 2003 12:02

Re: Schleife abbrechen...
 
die ersten beiden fehlten
damit geht es:
Delphi-Quellcode:
  ndx := 0;
  abbruch := false;
  while (ndx < StringGrid1.RowCount - 0) and (not abbruch) do

Sharky 14. Nov 2003 12:08

Re: Schleife abbrechen...
 
Ha, dann ist bei die wohl die Eigenschaft FixedRows = 0

Dann wäre dieser Code eventuell besser

Delphi-Quellcode:
  ndx := StringGrid1.FixedRows;
  abbruch := false;
  while (ndx < StringGrid1.RowCount - 1) and (not abbruch) do

horst 14. Nov 2003 12:12

Re: Schleife abbrechen...
 
danke ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:19 Uhr.

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