Schleife nur für bestimmte Werte ausführen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Varus
Beiträge: 19
Registriert: Fr 29. Nov 2013, 15:03

Schleife nur für bestimmte Werte ausführen

Beitrag von Varus »

Hallo zusammen,
ich komm nicht mehr weiter vielleicht kann mir jmd von euch helfen!?

Und zwar möchte ich gerne eine Schleife erstellen allerdings soll der Zählwert "i" nur bestimmte Werte wie z.B. 3,5,7,9,12,15,17, annehmen. Die einzige Lösung die mir einfällt ist dass ich der 3 den Wert 1 der 5=2, 7=3, 9=4.... zuteile. In meinem Programm ginge das sogar aber wenns mal eine "globale" sache wird dann kanns Probleme geben. Außerdem möchte ich ja gerne dazu lernen. Oder gibt es die möglichkeit z.B. Werte für den Zählwert aus einer Listbox zu entnehmen? Wenn ja wie?

Ich danke, gruß Varus!

Hier noch ein Auszug von dem Programm und kurze erklärung.
Ich möchte ein Griffbrett einer Gitarre zeichnen und füge nun die Markierungspunkte zwischen den Bünden ein. Das heißt an Bund 3,7,9,12,15,17,19,21,24 müssen Punkte angezeigt werden. Nun hier ist meine recht, naja komplizierte Lösung denke ich. Weiß aber nicht wie ich das elgeganter lösen könnte.

Code: Alles auswählen

 
  xp,yp,radius                                          :Integer;
  xp3,xp31,yp31,xp32,yp32                      :Integer;            //Punkte
  xp5,xp51,yp51,xp52,yp52                      :Integer;            //Punkte
  xp7,xp71,yp71,xp72,yp72                      :Integer;            //Punkte
  xp9,xp91,yp91,xp92,yp92                      :Integer;            //Punkte
  xp12,xp121,yp121,xp122,yp122                 :Integer;           //Punkte
  xp15,xp151,yp151,xp152,yp152                 :Integer;           //Punkte
  xp17,xp171,yp171,xp172,yp172                 :Integer;           //Punkte
  xp19,xp191,yp191,xp192,yp192                 :Integer;           //Punkte
  xp21,xp211,yp211,xp212,yp212                 :Integer;           //Punkte
  xp24,xp241,yp241,xp242,yp242                 :Integer;           //Punkte
 
yp:=image1.Height div 2 -13;
       radius:=15;
 
 
      //Punkt Bund 3
       xp3:=150;
 
       xp31:=xp3-radius div 2;
       yp31:=yp-radius div 2;
       xp32:=xp3+radius div 2;
       yp32:=yp+radius div 2;
 
       image1.canvas.Pen.Color:=RGBtoColor(0,0,0);
       image1.canvas.Pen.Width:=1;
       image1.Canvas.Brush.Color:=RGBtoColor(0,0,0);
       image1.canvas.Ellipse(xp31,yp31,xp32,yp32);
 
 
       //Punkt Bund 5
       xp5:=250;
 
       xp51:=xp5-radius div 2;
       yp51:=yp-radius div 2;
       xp52:=xp5+radius div 2;
       yp52:=yp+radius div 2;
 
       image1.canvas.Pen.Color:=RGBtoColor(0,0,0);
       image1.canvas.Pen.Width:=1;
       image1.Canvas.Brush.Color:=RGBtoColor(0,0,0);
       image1.canvas.Ellipse(xp51,yp51,xp52,yp52);
 
 
       //Punkt Bund 7
       xp7:=350;
 
       xp71:=xp5-radius div 2;
       yp71:=yp-radius div 2;
       xp72:=xp5+radius div 2;
       yp72:=yp+radius div 2;
 
       image1.canvas.Pen.Color:=RGBtoColor(0,0,0);
       image1.canvas.Pen.Width:=1;
       image1.Canvas.Brush.Color:=RGBtoColor(0,0,0);
       image1.canvas.Ellipse(xp71,yp71,xp72,yp72);
 
       //... hier gehts dann weiter für Punkt 9,12,15,17,19,21,24 mit jeweils ähnlichem Qcode
 
Zuletzt geändert von Varus am Mi 5. Feb 2014, 14:14, insgesamt 1-mal geändert.

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Schleife nur für bestimmte Werte ausführen

Beitrag von baumina »

Mein Vorschlag : mach eine procedure draus:

Code: Alles auswählen

 
procedure MalePunkt(wo : Integer);
begin
  xp := wo-radius div 2;       
  ...
  image1.canvas.Ellipse(xp,yp,xp2,yp2);
end;
 
....
// Aufruf 
  MalePunkt(150);
  MalePunkt(250);
  ...
 
// oder als Schleife
  i := 150;
  repeat 
    MalePunkt(i);
    i := i + 100;
    if i > 1000 then break; // 1000 ist von mir frei erfunden, da bitte den richtigen Wert einsetzen
  until 1<>1;
 
.

Varus
Beiträge: 19
Registriert: Fr 29. Nov 2013, 15:03

Re: Schleife nur für bestimmte Werte ausführen

Beitrag von Varus »

Okay das sieht sehr übersichtlich aus, allerdings was passiert da? Sry, eigene Procedures zu erstellen, soweit bin ich noch nicht :oops: .
Ich muss doch noch irgendwie dem "wo" eine definition geben!? Ich verstehe das nicht so ganz, ich habe nun folgendes daraus abgeleitet:

Code: Alles auswählen

 
procedure MalePunkt(wo : Integer);
var
xp,yp,xp2,yp2          :Integer;
radius                      :Integer;
 
begin
 
radius:=15;
 
 xp  :=wo-radius div 2;
 yp  :=wo-radius div 2;
 xp2 :=wo+radius div 2;
 yp2 :=wo+radius div 2;
 
       image1.canvas.Pen.Color:=RGBtoColor(0,0,0);
       image1.canvas.Pen.Width:=1;
       image1.Canvas.Brush.Color:=RGBtoColor(0,0,0);
       image1.canvas.Ellipse(xp,yp,xp2,yp2);
 
 
       MalePunkt(150);
       MalePunkt(250);
       MalePunkt(350);
 
end;
 
Er haut mir eine fehlermeldung raus "Illegal Expression" und markiert "procedure" und "begin" und "end"--> Okay das ist gelöst ein "end;" hat vorweg gefehlt.

Allerdings mault er: "Identifier not found "image1"" was ja damit zu tun hat dass er nicht weiß wo er suchen soll, somit "Tform1." vor Malepunkt gesetzt damit er weiß wo er suchen soll. Dann mault er "..doesen´t match any methode...". Wie kann ich das beheben?

Ich danke!

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Schleife nur für bestimmte Werte ausführen

Beitrag von baumina »

Code: Alles auswählen

 
type
  TForm1 = class(TForm)
    Image1 : TImage;
   ....
    procedure FormCreate(Sender: TObject);
  private
    procedure MalePunkt(wo : Integer);
  end;
 
procedure TForm1.MalePunkt(wo : Integer);
var
  xp,yp,xp2,yp2 : Integer;
  radius             : Integer; 
 
begin 
  radius:=15;  
  xp  :=wo-radius div 2; 
  yp  :=wo-radius div 2; 
  xp2 :=wo+radius div 2; 
  yp2 :=wo+radius div 2;        
  image1.canvas.Pen.Color:=RGBtoColor(0,0,0);       
  image1.canvas.Pen.Width:=1;       
  image1.Canvas.Brush.Color:=RGBtoColor(0,0,0);       
  image1.canvas.Ellipse(xp,yp,xp2,yp2); 
end;
 
// und dann weiß ich nicht wann du zeichnen willst z.B. im FormCreate
procedure TForm1.FormCreate(Sender: TObject);
begin
  MalePunkt(150);
  MalePunkt(250);
 
  // oder als Schleife wie oben beschrieben
end;
 
 
.

Varus
Beiträge: 19
Registriert: Fr 29. Nov 2013, 15:03

Re: Schleife nur für bestimmte Werte ausführen

Beitrag von Varus »

Hey es klappt! Vielen Dank!So ganz was das passiert verstehe ich zwar noch nicht :roll: aber im moment zählt das Ergebnis :lol: . Gibts da ein Tutorial zu, oder wonach sollte ich mal suchen damit ich mir die Basics beibringen kann. Weil das sieht sehr lohnend aus sich das mal genauer anzuschauen!

Gruß Varus

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Schleife nur für bestimmte Werte ausführen

Beitrag von baumina »

Hier hats z.B. tolle Informationen zur Sprache, Tutorials und Tipps http://www.delphi-treff.de
Dass es hier um Delphi und nicht FreePascal/Lazarus geht ist nicht weiter schlimm, denn die Unterschiede sind gering.
.

Antworten