Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi problem mit schleife (https://www.delphipraxis.net/23145-problem-mit-schleife.html)

herrentor 29. Mai 2004 14:40


problem mit schleife
 
ich hab ein problem mit einer for schleife. und zwar werden bei jedem durchlauf immer alle ergebnise geändert, sprich er liest zeile eins (i=1) aus und erkennt z.b. rechteck, gibt das ergebnis richtig aus, dann liest er zeile zwei (i=2) und erkennt z.b dreieck, gibt das ergebnis dafür richtig aus, ändert jedoch auch das ergebnis der ersten zeile so, als würde dort auch dreieck ausgewählt worden sein.

vielen dank im voraus.

download der *.exe datei

Code:

procedure TForm1.berechnenClick(Sender: TObject);    {Berechnung}
 var i:integer;                                      {deklarieren der Variablen}
     mass1,mass2,Lx,Ly,Sx,Sy,s,b,h:real;
     Xs,Ys,A,AGes,XsGes,YsGes,Vx,Vy:single;

begin

 XsGes:=0; YsGes:=0; AGes:=0;                        {initialisieren}
 flaecheges.caption:='0';
 xsge.caption:='0';
 ysge.caption:='0';

For i:=1 to 6 Do                                     {Anfang der Schleife}
 begin

     mass1:=StrToFloat(Tab.Cells[3,i]);               {umwandeln der Eingabewerte}
     mass2:=StrToFloat(Tab.Cells[4,i]);
     Lx:=StrToFloat(Tab.Cells[5,i]);
     Ly:=StrToFloat(Tab.Cells[6,i]);
     Sx:=StrToFloat(sxge.text);
     Sy:=StrToFloat(syge.Text);

      Xs:=0; Ys:=0; A:=0;                            {initialisieren}

   case ComboBox1.ItemIndex of                       {Fallunterscheidung}

    0: begin                                         {Rechteck}
        A:=mass1*mass2;                              {Fläche}
        Xs:=Lx+mass1/2;                              {Schwerpunkt auf der X-Achse}
        Ys:=Ly+mass2/2;                              {Schwerpunkt auf der Y-Achse}
       end;

    1: begin                                         {Dreieck}
        A:=(mass1*mass2)/2;                          {Fläche}
        Xs:=Lx+mass1/3;                              {Schwerpunkt auf der X-Achse}
        Ys:=Ly+mass2/3;                              {Schwerpunkt auf der Y-Achse}
       end;

    2: begin                                         {Kreissektor}
       A:=pi*sqr(mass1)*mass2/360;                   {Fläche}
       s:=2*mass1*sin(mass2/2*pi/180);               {Sehne}
       b:=pi*mass1*mass2/180;                        {Bogenlänge}
       Xs:=Lx;                                       {Schwerpunkt auf der X-Achse}
       Ys:=Ly+((2/3)*(mass1*s)/b);                   {Schwerpunkt auf der Y-Achse}
      end;

    3: begin                                         {Kreisabschnitt}
        b:=pi*mass1*mass2/180;                       {Bogenlänge}
        s:=2*mass1*sin(mass2/2*pi/180);              {Sehne}
        h:=2*mass1*sqr(sin(mass2/4*pi/180));         {Bogenhöhe}
        A:=(mass1*(b-s)+s*h)/2;                      {Fläche}
        Xs:=Lx;                                      {Schwerpunkt auf der X-Achse}
        Ys:=Ly+(1/12)*((s*s*s)/A);                   {Schwerpunkt auf der Y-Achse}
       end;

    4: begin                                         {Kreis}
        A:=pi*sqr(2*mass1)/4;                        {Fläche}
        Xs:=Lx+0;                                    {Schwerpunkt auf der X-Achse}
        Ys:=Ly+0;                                    {Schwerpunkt auf der Y-Achse}
       end;

   end;

 if (ComboBox2.ItemIndex = 1) then                   {bei negativen Vorzeichen wird die Fläche aktualisiert}
  begin
   A:=A*(-1);
  end;

   Tab2.Cells[0,i]:=FloatToStrF(Xs,ffFixed,7,2);     {umwandeln der Ergebniswerte in i-te Zeile und ausgeben}
   Tab2.Cells[1,i]:=FloatToStrF(Ys,ffFixed,7,2);
   Tab2.Cells[2,i]:=FloatToStrF(A,ffFixed,7,2);

   AGes:=AGes+A;                                     {aktualisieren der Gesamtfläche}
   XsGes:=XsGes+Xs;                                  {aktualisieren des Gesamtschwerpunktes in X-Richtung}
   YsGes:=YsGes+Ys;                                  {aktualisieren des Gesamtschwerpunkets in Y-Richtung}

end;                                                 {Ende der Zählschleife}

XsGes:=XsGes/2;                                      {berechnen des Gesamtschwerpunktes in X-Richtung}
YsGes:=YsGes/2;                                      {berechnen des Gesamtschwerpunktes in Y-Richtung}

Vx:=2*pi*(YsGes+Sx)*AGes/1000000;                    {berechnen des Rotationsvolumens um die X-Achse}
Vy:=2*pi*(XsGes+Sy)*AGes/1000000;                    {berechnen des Rotationsvolumens um die Y-Achse}


xsge.Caption:=Format('%.2f mm  ',[XsGes]);          {umwandeln und ausgeben des Gesamtschwerpunktes in X-Richtung}
ysge.Caption:=Format('%.2f mm  ',[YsGes]);          {umwandeln und ausgeben des Gesamtschwerpunktes in Y-Richtung}
vxge.Caption:=Format('%.2f dm³   ',[Vx]);            {umwandeln und ausgeben des Rotationsvolumens um die X-Achse}
vyge.Caption:=Format('%.2f dm³   ',[Vy]);            {umwandeln und ausgeben des Rotationsvolumens um die Y-Achse}
flaecheges.Caption:=Format('%.2f mm²  ',[AGes]);     {umwandeln und ausgeben der Gesamtfläche}

end;

kiar 29. Mai 2004 14:58

Re: problem mit schleife
 
hallo herrentor

willkommen in der dp :hi:

kannst du den teil mal spezifizieren, in dem du den fehler erwartest, es ist ziemlich unübersichtlich

lass dir mal den Combobox.itemindex in deiner procedure anzeigen

raik

herrentor 29. Mai 2004 15:49

Re: problem mit schleife
 
ich denke der fehler liegt in dieser zeile:

Code:

  Tab2.Cells[2,i]:=FloatToStrF(A,ffFixed,7,2);
A hat je nach combobox auswahl andere formeln. das problem liegt darin, dass die formel der letzte auswahl für alle ergebnisse gilt.

wie kann ich die combobox.itemindex denn anzeigen lassen? hab die items in einer anderen procedure definiert.

kiar 29. Mai 2004 15:58

Re: problem mit schleife
 
Delphi-Quellcode:

showmessage(inttostr(combobox.itemindex));

kiar 29. Mai 2004 16:09

Re: problem mit schleife
 
frage nimmst du immer die gleiche combobox in der auswahl deiner flächen?

du mustt die berechnung im event der combobox machen, sonst kriegst du probleme oder du nimmst ein array.

herrentor 29. Mai 2004 16:18

Re: problem mit schleife
 
die combobox bleibt immer die selbe

Code:

with Combobox1 do
  begin
    Tab.DefaultRowHeight := Height;
    Visible := False;
    Items.Add('Rechteck');
    Items.Add('Dreieck');
    Items.Add('Kreissektor');
    Items.Add('Kreisabschnitt');
    Items.Add('Kreis');
    Text := '';
  end;
du meinst ich soll dann gleich hinter der jeweiligen auswahl die formeln setzen?
was ist ein array?
ich sollte vielleicht dazu sagen, dass ich mich erst seit 2 wochen mit delphi beschäftige.

kiar 29. Mai 2004 16:24

Re: problem mit schleife
 
damit liest er immer den gleichen wert aus der combobox wenn du die statisch abfragst, wie in deinem fall.

für dich ist es erstmal am einfachsten, wenn du jeder zeile eine combobox zuordnest.

ansonsten gucke mal hier in der suche nach 'Delphi einsteiger' da findest du auf jeden fall einige sachen, die dir in delphi weiterhelfen

herrentor 29. Mai 2004 16:30

Re: problem mit schleife
 
mit der combobox gibt es auch keine problem, er erkennt was ich ausgewählt habe, jedoch wenn eine zeile darunter etwas anderes ausgewählt, wird auch das ergebniss der anderen zeile geändert.

kiar 29. Mai 2004 16:37

Re: problem mit schleife
 
hallo herrentor,

eine möglichkeit habe ich noch,

du deklarierst eine globale variable und lädst da den itemindex rein
Delphi-Quellcode:
var
  index : integer;

procedure TForm1.ComboBox1Change(Sender: TObject);

begin
  index := combobox1.itemindex;
end;

 // in deiner routine
  case index of

IngoD7 29. Mai 2004 16:57

Re: problem mit schleife
 
Ich nehme an, er lässt die Schleife mehrmals durchlaufen. Der Fehler liegt höchstwahrscheinlich da, wo ihn alle vermuten: Der ItemIndex der ComboBox wird ja in der Schleife nicht verändert.

Ich versuche das gerade hier, ihm beizubringen.

In Delphi-Groups haben sie seinen Thread schon in die Tonne getreten, wegen Cross-Posting. Und ich hätte mich da auch nicht so lange mit befasst, wenn ich das vorher gesehen hätte ... :roll:

herrentor 29. Mai 2004 17:02

Re: problem mit schleife
 
ok, danke erstmal. ich werd das mal versuchen.

herrentor 29. Mai 2004 17:12

Re: problem mit schleife
 
@ ingod7

ich find es übrigens nur legitim, wenn man sich möglichst viele informationen zu seinem problem einholt auch von anderen plattformen.

außerdem war mir nicht bewusst, wie aktiv die foren sind.

kiar 29. Mai 2004 17:24

Re: problem mit schleife
 
herrentor

schon erfolge?

IngoD7 29. Mai 2004 17:57

Re: problem mit schleife
 
Zitat:

Zitat von herrentor
@ ingod7

ich find es übrigens nur legitim, wenn man sich möglichst viele informationen zu seinem problem einholt auch von anderen plattformen.

Ich finde das allermeistens nicht.

Weil sich dann "tausend" Leute die gleichen Gedanken machen, die - so es in unterschiedlichen Foren geschieht - nichts voneinander wissen.

Ein gutes Beispiel ist kiar hier und ich im Delphi-Forum. kiar kümmert sich hier um dein Problem und macht dir Lösungsvorschläge. Ich versuche an anderer Stelle, dir überhaupt erstmal klar zu machen, wo genau dein Logikfehler steckt. Kannst du uns beiden folgen? Kannst du uns beiden gerecht werden? Oder hörst du irgendwann einem von uns nur noch mit halben Ohr zu, weil die Ansätze, dir zu helfen, völlig verschieden sind.

kiar und ich wissen ja nicht unbedingt voneinander. Wir wissen nicht unbedingt, was du mit dem jeweils anderen schon herausgefunden hast. Da kann viel Arbeit für die Tonne draus erwachsen.

Ich bin momentan z.B. der Meinung, dass wenn du erstmal wirklich verstanden hast, wo der (Logik-)Fehler in deinem Code steckt, du kiars Lösungsvorschläge hier nicht mehr verwenden wirst, weil ich denke, dass du dann die Logik deines Codes gänzlich umstellen wirst (ich kann mich natürlich täuschen, aber trotzdem). kiars Arbeit wäre damit umsonst.

Anders herum: Sollte kiar dir hier irgendwann irgendwie Copy&Paste-fähigen Code präsentieren, der dein Problem umschifft, so wirst du den liebend gerne nehmen, wirst froh sein, dass dein Problem endlich vom Tisch ist und meine Mühen im anderen Forum waren umsonst.

Um sowas zu verhindern, werden in Delphi-Groups Cross-Postings in die Tonne getreten. Zurecht, wie ich meine.

Es ist durchaus möglich, dass man irgendwann zusätzlich die Hilfe einer anderen Community in Anspruch nehmen möchte/muss. Aber nicht gleich sofort am Anfang.

Ende der Predigt. :roll: :wink:

herrentor 29. Mai 2004 18:06

Re: problem mit schleife
 
Liste der Anhänge anzeigen (Anzahl: 1)
ok, so hab ich das noch nicht gesehen. akzeptiert.

zu kiar's vorschlag: jetzt rechnet er nur noch item 0

hier mal das komplette programm, vielleicht bin auch nur zu verpeilt:

[Schnipp Schnapp]

[edit=Sharky]Solche überlangen Codes bitte als Datei anhängen. Danke :-D Mfg, Sharky[/edit]

IngoD7 29. Mai 2004 18:56

Re: problem mit schleife
 
Zitat:

Zitat von herrentor
zu kiar's vorschlag: jetzt rechnet er nur noch item 0

Weil es immer noch derselbe - mit Verlaub - Unfug ist. index hat bei dir während sämtlicher Schleifendurchläufe immer den Wert, den es bei der letzten ComboBox-Änderung bekommen hat. Deshalb rechnet er alle Zeilen mit derselben Rechenart.

Wenn ich deinen Code halbwegs verstehe, so klickst du irgendwann per ComboBox1 die Rechenart in deine Tab-Zeilen. Dann musst du auch in der Schleife statt index das Feld aus Tab benutzen, welches du mit den Klicks gefüllt hast und in dem steht, welche Rechenart für die jeweilige Zeile genutzt werden soll.

alcaeus 29. Mai 2004 19:10

Re: problem mit schleife
 
@herrentor: Auch wenn ich kein Mod bin, aber bitte hänge bei so langem Code die Dateien an, anstatt den Code einzufügen. Dadurch bleibt der Thread übersichtlich.

Nikolas 29. Mai 2004 19:40

Re: problem mit schleife
 
[etwas OT:] Es erhöht auch die Leserlichkeit deines Textes, wenn du bei functionen wie reset einfach 2 For-Schleifen nutzt und nicht solche MonsterBlöcke hinschreibst. [/etwas OT:]

herrentor 30. Mai 2004 03:00

Re: problem mit schleife
 
endlich! was für eine schwere geburt. danke nochmal an alle die sich meiner probleme angenommen haben. allerdings hab ich noch eine frage.
das programm läuft jetzt, weil ich diesen teil geändert habe:

Code:

   case ComboBox1.ItemIndex of                       {Fallunterscheidung} 

    0: begin                                         {Rechteck} 
        A:=mass1*mass2;                              {Fläche} 
        Xs:=Lx+mass1/2;                              {Schwerpunkt auf der X-Achse} 
        Ys:=Ly+mass2/2;                              {Schwerpunkt auf der Y-Achse} 
       end;

    1: begin                                         {Dreieck} 
        A:=(mass1*mass2)/2;                          {Fläche} 
        Xs:=Lx+mass1/3;                              {Schwerpunkt auf der X-Achse} 
        Ys:=Ly+mass2/3;                              {Schwerpunkt auf der Y-Achse} 
       end;

    2: begin                                         {Kreissektor} 
       A:=pi*sqr(mass1)*mass2/360;                   {Fläche} 
       s:=2*mass1*sin(mass2/2*pi/180);               {Sehne} 
       b:=pi*mass1*mass2/180;                        {Bogenlänge} 
       Xs:=Lx;                                       {Schwerpunkt auf der X-Achse} 
       Ys:=Ly+((2/3)*(mass1*s)/b);                   {Schwerpunkt auf der Y-Achse} 
      end;

    3: begin                                         {Kreisabschnitt} 
        b:=pi*mass1*mass2/180;                       {Bogenlänge} 
        s:=2*mass1*sin(mass2/2*pi/180);              {Sehne} 
        h:=2*mass1*sqr(sin(mass2/4*pi/180));         {Bogenhöhe} 
        A:=(mass1*(b-s)+s*h)/2;                      {Fläche} 
        Xs:=Lx;                                      {Schwerpunkt auf der X-Achse} 
        Ys:=Ly+(1/12)*((s*s*s)/A);                   {Schwerpunkt auf der Y-Achse} 
       end;

    4: begin                                         {Kreis} 
        A:=pi*sqr(2*mass1)/4;                        {Fläche} 
        Xs:=Lx+0;                                    {Schwerpunkt auf der X-Achse} 
        Ys:=Ly+0;                                    {Schwerpunkt auf der Y-Achse} 
       end;

   end;
und zwar folgendermaßen:

Code:

    if Tab.Cells[1,i] = ComboBox1.Items[0] then      

       begin                                         {Rechteck}
        A:=mass1*mass2;                              {Fläche}
        Xs:=Lx+mass1/2;                              {Schwerpunkt auf der X-Achse}
        Ys:=Ly+mass2/2;                              {Schwerpunkt auf der Y-Achse}
       end;

    if Tab.Cells[1,i] = ComboBox1.Items[1] then

       begin                                         {Dreieck}
        A:=(mass1*mass2)/2;                          {Fläche}
        Xs:=Lx+mass1/3;                              {Schwerpunkt auf der X-Achse}
        Ys:=Ly+mass2/3;                              {Schwerpunkt auf der Y-Achse}
       end;

    if Tab.Cells[1,i] = ComboBox1.Items[2] then

      begin                                         {Kreissektor}
       A:=pi*sqr(mass1)*mass2/360;                   {Fläche}
       s:=2*mass1*sin(mass2/2*pi/180);               {Sehne}
       b:=pi*mass1*mass2/180;                        {Bogenlänge}
       Xs:=Lx;                                       {Schwerpunkt auf der X-Achse}
       Ys:=Ly+((2/3)*(mass1*s)/b);                   {Schwerpunkt auf der Y-Achse}
      end;

    if Tab.Cells[1,i] = ComboBox1.Items[3] then

       begin                                         {Kreisabschnitt}
        b:=pi*mass1*mass2/180;                       {Bogenlänge}
        s:=2*mass1*sin(mass2/2*pi/180);              {Sehne}
        h:=2*mass1*sqr(sin(mass2/4*pi/180));         {Bogenhöhe}
        A:=(mass1*(b-s)+s*h)/2;                      {Fläche}
        Xs:=Lx;                                      {Schwerpunkt auf der X-Achse}
        Ys:=Ly+(1/12)*((s*s*s)/A);                   {Schwerpunkt auf der Y-Achse}
       end;

    if Tab.Cells[1,i] = ComboBox1.Items[4] then

       begin                                         {Kreis}
        A:=pi*sqr(2*mass1)/4;                        {Fläche}
        Xs:=Lx+0;                                    {Schwerpunkt auf der X-Achse}
        Ys:=Ly+0;                                    {Schwerpunkt auf der Y-Achse}
       end;
wie kann ich das mit einer fallunterscheidung (case) realisieren? wie kann ich folgendes anders schreiben, so dass es akzeptiert wird?

Code:

   case Tab.Cells[1,i] = ComboBox1.ItemIndex of

alcaeus 30. Mai 2004 04:06

Re: problem mit schleife
 
nein, die OH (:!:) sagt folgendes:
Delphi-Quellcode:
case selectorExpression of
  caseList1: statement1;
   ...
  caseListn: statementn;
  else
    statements;
end;
SelectorExpression ist eine Ordinalvariable, also kein String oder auch kein Float. Eine Integer-Variable kann damit aber immer abgeprüft werden:
Delphi-Quellcode:
case i of
  1: //Einzelner Wert
  2, 5, 7: //Auflistung
  8..13: //Bereich
  else
    //Ansonsten...
end;
Natürlich sind auch überall begin-end-Blöcke möglich.

Greetz
alcaeus

IngoD7 30. Mai 2004 08:55

Re: problem mit schleife
 
Zitat:

Zitat von herrentor
endlich! was für eine schwere geburt.

Das kannst du laut sagen ... 8)

Zitat:

Zitat von herrentor
wie kann ich das mit einer fallunterscheidung (case) realisieren? wie kann ich folgendes anders schreiben, so dass es akzeptiert wird?

Du müsstest bei den Eintragungen in Tab eine Spalte haben, die du später mit case benutzen kannst (strings funktionieren mit case nicht, wie hier schon geschrieben wurde).

Wenn du also in Tab nicht wie bisher den String aus der ComboBox ablegst, sondern statt dessen (oder zusätzlich) das ItemIndex, dann kannst du es später (über kleine Umwege) benutzen.

Ablegen in deine Tab kannst du es nur als String, also ==> IntToStr.
Bei Case sollte dann ...
Delphi-Quellcode:
case Tab.Cells[1,i][1] of //Kunstgriff "[1]" notwendig, da Case mit einzelnen Zeichen funktioniert
  '0' : ....
  '1' : ....
  end;
... funktionieren.


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