Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Prüfung auf leere Zelle endet nicht nach Fund (https://www.delphipraxis.net/168017-pruefung-auf-leere-zelle-endet-nicht-nach-fund.html)

MisterKnister 30. Apr 2012 15:12

Prüfung auf leere Zelle endet nicht nach Fund
 
Bitte nicht lachen;)
Ich habe ein variables StringGrid.
Bevor das Programm beendet wird, soll geprüft werden ob die komplette Tabelle ausgefüllt wurde.
Falls dies nicht der Fall ist, soll eine Nachfrage gestellt werden, ob man trotzdem das Programm verlassen will
oder eben nicht.
Dies funktioniert zwar soweit, allerdings wird die Nachfrage bei jeder leeren Zeile gestellt.
(Egal ob "JA" oder "NEIN" betätigt wird).
Da nach einer, ja eh schon die Bedingung erfüllt ist, sollte die Nachfrage also nur für eine/die erste leere Zelle gestellt werden.
Nun die Frage, welches triviale Kommando ich vergessen habe.
Vielen Dank im Voraus!


Delphi-Quellcode:
procedure TForm1.Close1Click(Sender: TObject);
var
i : Integer;
b : Integer;
begin
for i := 0 to StringGrid1.RowCount-1 do
  if StringGrid1.Rows[i].IndexOf('') <> -1 then
  b:= Application.MessageBox('Cells not filled completely. Do you want to leave anyways?','',4+32);
    if b = IDYES then Close;
end;

himitsu 30. Apr 2012 15:14

AW: Prüfung auf leere Zelle endet nicht nach Fund
 
Close sagt nur der Form, daß sie sich schließen soll,
aber wo sagst du der Schleife, daß sie aufhören soll?


Delphi-Referenz durchsuchenBreak / Delphi-Referenz durchsuchenExit / Delphi-Referenz durchsuchenContinue


Wenn du mal etwas auf die Code-Einrückung achten würdest, dann würde dir auffallen, daß das Close garnicht in der Schleife drin ist. ( Tipp: Kennst du Begin-End-Blöcke? )
Und ich bin mir ganz sicher, daß der Compiler dir irgendwas vonwegen "nichtinitialisiertet Variable b" mitteilt.

Tipp 2: Ich würde dir den Debugger ns Herz legen, denn da siehst du auch, was (nicht) so aufgerufen wird, wie du es gern hättest.

MisterKnister 18. Mai 2012 19:40

AW: Prüfung auf leere Zelle endet nicht nach Fund
 
Wenn auch spät, da ich es erst nicht hinbekommen hatte und noch an anderen Sachen gebastelt hatte, wollte ich mich nochmal melden.

Danke himitsu
die Break, exit, Constinue Befehle kannte ich vorher nicht.
Damit hat es nun geklappt, danke!

Hatte auch noch große Probleme damit, dass ich erst nicht verstanden hatte, dass trotz break der Count noch weitergeht und man dies extra berücksichtigen muss. Habe mich auch nicht getraut mich hier wegen des Problems zu melden.

Vor allem auch Danke für den Hinweis mit Close, daraufhin habe ich es dann mit Application.Terminate ersetzt und konnte es auch in FormClose einbauen.

Somit gelöst!


Code:
procedure TForm1.SafeClose;
var
b, c , z : Integer;
begin
 if go then begin
  if not sicher then begin
   c:= Application.MessageBox('Your progress has not been saved yet. Do you want to save it now?','',3+32);
     if c=7 then begin
     sicher:=true;
     end;
     if c=2 then begin
     exit;
     end;
     if c=6 then begin
     SaveProgress;
     end;
  end;

 if sicher then begin;
 for z := 1 to Liste.Count do
  if StringGrid1.Cells[2,z] = ('') then break;
     if z = Liste.Count+1 then begin
     Application.Terminate;
     end;
  b:= Application.MessageBox('Not all pictures were measured yet. Do you want to leave anyways?','',4+32);
     if b=6 then begin //YES
     Application.Terminate;
     end;
     if b=7 then begin //NO
     sicher:=false;
     showmessage('Picture '+IntToStr(z)+' has not been measured!');
     end;
  end;
 end
 else
 Application.Terminate;
end;

Dalai 18. Mai 2012 20:19

AW: Prüfung auf leere Zelle endet nicht nach Fund
 
Ähm, dein Code ist schlechter Stil. Es gibt nicht zum Spaß die Methode FormCloseQuery, die eine Variable CanClose zur Verfügung stellt, die man entsprechend setzen kann. Application.Terminate sollte man vermeiden, ein TForm.Close ist (nahezu) immer vorzuziehen!

Davon abgesehen spielt es bei FormCloseQuery keine Rolle, auf welche Weise das Programm beendet wird (Schließen-Knopf, Button zum Schließen, Alt+F4 usw), die Methode wird immer ausgeführt und erst wenn die ihr OK gibt - über die Variable CanClose, wird beendet.

Ach, noch etwas: warum verwendest du bei Application.MessageBox Zahlen statt der Konstanten? Damit weiß kein anderer was anzufangen (und muss erst nachschauen, welche Zahl was bedeutet) und du selbst in einigen Monaten auch nicht mehr.

MfG Dalai

himitsu 19. Mai 2012 01:30

AW: Prüfung auf leere Zelle endet nicht nach Fund
 
Zitat:

Zitat von Dalai (Beitrag 1167188)
Ach, noch etwas: warum verwendest du bei Application.MessageBox Zahlen statt der Konstanten? Damit weiß kein anderer was anzufangen (und muss erst nachschauen, welche Zahl was bedeutet) und du selbst in einigen Monaten auch nicht mehr.

Und das + ist dort auch noch fehl am Platz ... da gehört ein OR hin.

Furtbichler 19. Mai 2012 13:57

AW: Prüfung auf leere Zelle endet nicht nach Fund
 
Zitat:

Zitat von himitsu (Beitrag 1167220)
Und das + ist dort auch noch fehl am Platz ... da gehört ein OR hin.

Nee, also:
Entweder totalen Murks mit magic number und plus, oder...
richtig mit Konstanten und OR.

Aber so fast falsch oder ein bisserl richtig wäre inkonsequent.

himitsu 19. Mai 2012 14:03

AW: Prüfung auf leere Zelle endet nicht nach Fund
 
Ich meinte natürlich "zusammen mit den Konstanten" :lol:

Wenn schon MagicNumber, dann richtig zusammengerechnet (ohne + und or), damit man garnichts mehr erkennt.

Furtbichler 19. Mai 2012 19:43

AW: Prüfung auf leere Zelle endet nicht nach Fund
 
Zitat:

Zitat von himitsu (Beitrag 1167261)
Wenn schon MagicNumber, dann richtig zusammengerechnet (ohne + und or), damit man garnichts mehr erkennt.

Yes! Das ist professionell!


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