![]() |
Schleife abbrechen...
guten morgen ;)
wer mag mir sagen wie ich diese schleife abbrechen kann?
Delphi-Quellcode:
//Gesamt
for i := 1 to StringGrid1.RowCount -1 do
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; |
Re: Schleife abbrechen...
break
|
Re: Schleife abbrechen...
yo
nur.....wenn das ding am laufen ist krieg ich nichts mehr geklickt (oder nach dem 20x mal vielleicht). |
Re: Schleife abbrechen...
Hallo Horst.
schau mal nach "Application.ProcessMessages" bye Claus |
Re: Schleife abbrechen...
hallo :-D
reagiert zwar nicht direkt, aber es klappt. |
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 |
Re: Schleife abbrechen...
hallo...
Zitat:
grüße horst |
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; |
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 ![]() |
Re: Schleife abbrechen...
Zitat:
der Code soll den Ansatz der Notwendigen Schleifenkonstruktion zeigen. Nicht mehr und nicht weniger. Das es noch etwas Feinarbeit benötigt sollte klar sein. |
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... |
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:
|
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; |
Re: Schleife abbrechen...
Zitat:
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; |
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:
meins war ja nicht nur ein wenig falsch.
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; 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. |
Re: Schleife abbrechen...
Zitat:
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!!!
|
Re: Schleife abbrechen...
funktioniert perfekt!
du hast mir damit sehr weiter geholfen, danke. |
Re: Schleife abbrechen...
war zu voreilig...
in meinem stringrid sind 9 reihen es werden nur 7 übergeben, fällt dir spontan was dazu ein? |
Re: Schleife abbrechen...
Hmmm... eigentlich nicht. Welche beiden werden denn nicht übergeben?
|
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 |
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 |
Re: Schleife abbrechen...
danke ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 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