Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphi Bug? (for i := 1 to componente.width) (https://www.delphipraxis.net/3286-delphi-bug-i-%3D-1-componente-width.html)

Maa83 5. Mär 2003 07:28


Delphi Bug? (for i := 1 to componente.width)
 
Also ich hab da wa seltsames festgestellt... vielleicht bin ich auch nur zu doof :)

und zwar hab ich z.B. eine PaintBox und möchte eine for Schleife machen die folgendermaßen aussieht:

Code:
for i := 1 to paintbox1.width do begin
//tue irgendwas
end;
so jetzt sollte er die Schleife solange wiederholen bis width erreicht ist... Delphi macht aber folgendes:

entweder geht Delphi gar nicht in die Schleife rein
oder er ignoriert das Ende der Schleife und zählt einfach weiter und kommt nicht mehr raus...

mach ich was falsch oder ist das ein fieser Delphi-Bug?

das selbe passiert mit der Eigenschaft .Height
Auch wenn ich diese Werte mit Hilfsvariablen zwischenspeichere:
Code:
w := paintbox1.width;
for i := 1 to w do begin
...
end;

janjan 5. Mär 2003 07:38

Bei mir klappt das problemlos:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
  for i:= 1 to PaintBox1.Width do
    begin
      PaintBox1.Canvas.Pixels[i,random(PaintBox1.Height)]:=1;
    end;
end;

Maa83 5. Mär 2003 07:49

mhhh.... :|

kann das vielleicht mal einer mit Delphi6 Enterprise versuchen...
vielleicht hat sich da ja irgendwas eingeschlichen...

ich glaube nicht das ich bei so einer einfachen Anweisung Fehler mache...

komisch ist das aber schon :shock:

janjan 5. Mär 2003 07:54

Ich bin grad auf der Arbeit und hab das mit Delphi 7 getestet, nicht mit Delphi 4.

Ich hab die Vermutung das der Fehler eher innerhalb der Schleife liegt, es wäre hilfreich wenn du den teil mal posten könntest.

MrSpock 5. Mär 2003 08:13

Hallo Maa83,

häufig kommt sowas zustande, wenn (aus Versehen) der Schleifenindex in der Schleife verändert wird.

Maa83 5. Mär 2003 08:19

Dank euch erst mal
aber hilft mir alles nix

i wird nicht verändert!

der Fehler tritt bei mir immer auf egal was ich in der Schleife mache
z.B. auch bei dieser hier:

Code:
x := 0;
for i := 1 to paintbox1.width do begin
    inc(x);
end;
ShowMessage(x);
BUHU :cry:

Ich hab das bei mir daheim und auch im Geschäft getestet (jeweils Delphi6 Enterprise)

City Light 5. Mär 2003 08:53

Hallo Maa83

Ich habe diesen Code mal getestet und läuft bei mir super! Ich habe Delphi 6 Enterprise + update 2 (Build 6.240)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
x,y,i: Integer;
begin
  x := 0;
for i := 1 to paintbox1.width do begin
    inc(x);
end;
ShowMessage(inttostr(x));
end;
Gruß Tino

Maa83 5. Mär 2003 09:06

mhhhh...
kapier ich nicht...

naja vielleicht klappts ja irgendwann Delphi ist sicher sauer auf mich :)

wisst ihr eigentlich wie beschissen 800x600 ist WÜRG
muss ein Programm gerade bei dieser Auflösung testen da unserer Kunden diese Auflöung haben WÄHHHH

also dann wünsch ich noch schönes :coder:

MrSpock 5. Mär 2003 09:41

Hallo Maa83,

füge doch bitte noch einmal folgende Zeile ein uns poste, was ausgegeben wird:

Delphi-Quellcode:
   ShowMessage(IntToStr(paintbox1.width));

Maa83 5. Mär 2003 09:49

es wird die richte Zahl ausgegeben (in diesem Fall 485)
wenn ich die Zahl ganz normal in der Schleife angeben funktioniert es natürlich auch nur mit .width eben nicht

sakura 5. Mär 2003 10:31

HALLO IHR TRÄUMER, (Maa83 ausgenommen :) )

0-basierte Listen sind in Delphi üblich, wenn auch nicht Pflicht, dass heisst, dass das erste Element nicht den Index 1, sondern den Index 0 hat!

Aus
Delphi-Quellcode:
for i:= 1 to PaintBox1.Width do
wird also
Delphi-Quellcode:
for i:= 0 to PaintBox1.Width-1 do
und schon läuft alles, zumindest bei mir ;)

...:cat:...

Helld_River 5. Mär 2003 11:07

Einfahc mal ein Gedanke:
Da sich die Width-Eigenschaft während des Durchlaufs der Schleife auch ändern kann, solltest Du vielleicht mal probieren, vorher den Wert von Width einer variablen zuzuweisen und dann die Schleife bis zu dieser Variable laufen zu lassen !!!

Gruß, Helld

sakura 5. Mär 2003 11:29

Zitat:

Zitat von Helld_River
Einfahc mal ein Gedanke:
Da sich die Width-Eigenschaft während des Durchlaufs der Schleife auch ändern kann, solltest Du vielleicht mal probieren, vorher den Wert von Width einer variablen zuzuweisen und dann die Schleife bis zu dieser Variable laufen zu lassen !!!

Fast genauso funktioniert ein for-Schleife in Delphi auch. Die Anzahl der gesamten Durchläufe wird vorher ermittelt und im ECX Register gespeichert (Performance!). Deine Lösung würde also keine Vorteil bringen ;) Sinnvoller wäre es, wenn sich die Breite ändern kann immer wieder die aktuelle "Width" zu testen, z.B. durch eine while-Schleife.

...:cat:...

Maa83 5. Mär 2003 12:01

@sakura: Also das mit index 0 oder 1 ist ja eigentlich wurscht (schreibst du ja auch das es nicht notwendig sondern nur üblich ist)...

Ich habs auf jeden Fall nochmal ausprobiert und jetzt klappts auf einmal !? Ich hab am Code nichts verändert :(
Delphi will mich verarschen :?

Naja danke für eure Hilfe ich werd jetzt mal weiter :coder:

sakura 5. Mär 2003 12:16

Zitat:

Zitat von Maa83
@sakura: Also das mit index 0 oder 1 ist ja eigentlich wurscht (schreibst du ja auch das es nicht notwendig sondern nur üblich ist

Da hast Du mich falsch verstanden. Es ist garantiert nicht "wurscht", da es von Borland für die Controls von 0 bis Breite-1 definiert wurde. Wenn Du Deine eigenen Arrays machst, dann ist es fast wurscht, aber nicht bei denen anderer Entwickler.

...:cat:...


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