Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi goto befehl (https://www.delphipraxis.net/36063-goto-befehl.html)

mr.floppy81 15. Dez 2004 11:42


goto befehl
 
habe versucht einen gotosprung wie in der delphi hilfe zu basteln...

Problematisch ist jedoch, dass er mir beim compilieren anzeigt:

"label wurde deklariert und referenziert, aber nicht gesetzt: 'abmessung' "

is wahrscheinlich total billig aber an solchen problemen scheitert es ja meist :gruebel:

habe mir das so gedacht, dass ich wenn eine Bedingung erfüllt nicht erfüllt ist, der pointer solange auf auf 'abmessung' zurückspringt.
bis eine gültige eingabe erfolgt
so zum bsp.

var x:float
label abmessung;

begin

x:=edit1.text;
if x=0 then goto abmessung

....

Luckie 15. Dez 2004 11:46

Re: goto befehl
 
Lass die Finger von gotos's! Es gibt zwar ein paar Ausnahmen, wo sie Sinn machen, in der Reegel machen sie einen Quellcode nur unübersichtlich und unstrukturiert.

Aber davon mal abgesehen, zeig doch mal Code?

SubData 15. Dez 2004 11:47

Re: goto befehl
 
Beispiel:

Delphi-Quellcode:
function Blah(): String;
label
  MeinLabel;

begin
  // Tu was...
  if (x = 1) then goto MeinLabel;
  // Tu was anderes
  MeinLabel:
end;
Edit: Tippfehler und ausserdem muss ich Luckie zustimmen... Goto Anweisungen sind nur SEHR selten nützlich :)

Ultimator 15. Dez 2004 11:47

Re: goto befehl
 
Manchmal ist die OH ein Segen ;-)
Code:
Die Syntax für goto-Anweisungen lautet

goto Label

Eine goto-Anweisung setzt die Ausführung des Programms mit der Anweisung fort, die mit dem angegebenen Label markiert ist. Zur Markierung einer Anweisung deklarieren Sie zunächst das Label. Dann fügen Sie vor der zu markierenden Anweisung das Label und einen Doppelpunkt ein:

Label: Anweisung

Labels werden folgendermaßen deklariert:

label Label;

Es können auch mehrere Labels gleichzeitig deklariert werden:

label Label1, ..., Labeln;

Als Label können jeder gültige Bezeichner und jede Zahl zwischen 0 und 9999 verwendet werden.

Da Labels keine Sprünge aus einer Prozedur bzw. Funktion in eine andere erlauben, müssen sich die Label-Deklaration, die markierte Anweisung und die goto-Anweisung innerhalb eines Blocks befinden (siehe Blöcke und Gültigkeitsbereich). In einem Block darf jedes Label nur einmal zur Markierung einer Anweisung verwendet werden. * 

Beispiel:

label StartHere;
...
StartHere: Beep;
goto StartHere;

Dieser Quelltext ergibt eine Endlosschleife, in der immer wieder die Prozedur Beep aufgerufen wird.

In einem Block darf jedes Label nur einmal zur Markierung einer try/finally- oder try/except-Anweisung verwendet werden.

Im Sinne eines guten Programmierstils sollten goto-Anweisungen so sparsam wie möglich eingesetzt werden. In bestimmten Fällen bieten sie sich aber an, um eine verschachtelte Schleife zu verlassen. Dazu ein Beispiel:

procedure FindFirstAnswer;
var X, Y, Z, Count: Integer;
label FoundAnAnswer;
begin
  Count := SomeConstant;
  for X := 1 to Count do
    for Y := 1 to Count do
      for Z := 1 to Count do
        if ... { Eine Bedingung, die X, Y und Z abfragt } then
          goto FoundAnAnswer;

  ... {Quelltext, der ausgeführt wird, wenn keine Antwort gefunden wird}

  Exit;

  FoundAnAnswer:
    ... { Quelltext, der ausgeführt wird, wenn eine Antwort gefunden wird }
end;

Die goto-Anweisung wird hier eingesetzt, um eine verschachtelte Schleife zu verlassen. Das Label einer goto
-Anweisung darf sich nicht innerhalb einer anderen Schleife oder strukturierten Anweisung befinden, da dies zu unvorhersehbaren Ergebnissen führen könnte.

mr.floppy81 15. Dez 2004 11:53

Re: goto befehl
 
seid mal net so schnell, sonst schaff ich es gar net euch was reinzustellen
[delphi]
procedure TForm1.Button2Click(Sender: TObject);

label abmessung;

begin



if (checkbox1.checked=false)then Artikelbeschreibung:=artikel.text
else Artikelbeschreibung:=edit5.text;
if (checkbox1.checked=false)then bezeichnung1:=dbedit1.text
else bezeichnung1:=edit6.text;
if (checkbox1.checked=false)then bezeichnung2:=dbedit2.text
else bezeichnung2:=edit7.text;
if (checkbox1.checked=false)then ho:=strtofloat(dbedit3.text)
else ho:=strtofloat(edit8.text);
if (checkbox1.checked=false)then br:=strtofloat(dbedit4.text)
else br:=strtofloat(edit10.text);
if (checkbox1.checked=false)then ti:=strtofloat(dbedit5.text)
else ti:=strtofloat(edit12.text);

if (ho=0) or (ti=0) or (br=0)then abmessungen.showmodal;

if (ho=0) or (ti=0) or (br=0)then
goto abmessung;

hoinm:=ho/1000; brinm:=br/1000; tiinm:=ti/1000;

[delphi]

das ist der quelltext, wenn ho,ti oder br = 0 sind soll er solange zurück zum label abmessung springen bis was anderes eingegeben wird

wenn ho und ti und br ungleich null soll er im Prog weitermachen

SubData 15. Dez 2004 11:56

Re: goto befehl
 
Benutz doch bitte die Delphi Tags...

Du hast das Label zwar deklariert aber nirgendwo hingesetzt... Das geht einfach mit "Label:"
Dann springt er da hin, wo das steht...

Edit:

Du kannst bei If Abfragen auch begin und end verwenden... Spart Platz, Zeit und is übersichtlicher (Ausserdem schneller)

Delphi-Quellcode:
if not (checkbox1.checked) then
begin
  Artikelbeschreibung:=artikel.text;
  bezeichnung1:=dbedit1.text;
  bezeichnung2:=dbedit2.text;
  ho:=strtofloat(dbedit3.text);
  br:=strtofloat(dbedit4.text);
  ti:=strtofloat(dbedit5.text);
end else
begin
  bezeichnung1:=edit6.text;
  bezeichnung2:=edit7.text;
  ho:=strtofloat(edit8.text);
  br:=strtofloat(edit10.text);
  ti:=strtofloat(edit12.text);
end;

Luckie 15. Dez 2004 12:00

Re: goto befehl
 
Delphi bietet die Möglichkeit mit Blöcken Programmcode zu strukturieren:
Delphi-Quellcode:
if a <> b then
begin

end
else if a > b then
begin

end
else
begin

end;
Die Verwendung von goto's ist vollkommen überflüssig in deinem Fall.

mr.floppy81 15. Dez 2004 12:22

Re: goto befehl
 
jepp so gehts auch :party:

zu früh gefreut...

mache das so wie subdata das vorgeschlagen hat, alle anderen bitte net böse sein,

@ subdata, es war der doppelpunkt mit dem pointernamen der mir fehlte, also nur ne kleinigkeit....

die ideen sind gut aber der Anwender (ich) ist schlecht :cry:


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