Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bereichsprüfung, aber wie? (https://www.delphipraxis.net/121196-bereichspruefung-aber-wie.html)

Schwedenbitter 23. Sep 2008 23:03


Bereichsprüfung, aber wie?
 
Hallo,

ich verzweifle gerade an der Bereichsprüfung. Es kommt immer die Fehlermeldung "Fehler bei Bereichsprüfung". Bei folgendem Programmausschnitt haben ScanDPI den Wert 200 und Tolerance dern Wert 0:

Delphi-Quellcode:
Var
   Hoehe,HMin,HMax : Integer;

...

// Idealmaß ermitteln
Hoehe:=Round(ScanDPI * 11.7);
Breite:=Round(ScanDPI * 8.3);
// Toleranzfaktoren ermitteln
Case Tolerance Of
   0   :  Begin  // bis 70 % größer oder kleiner werden tolleriert
              HMin:=Round(0.7*Hoehe);  HMax:=Round(1.3*Hoehe);
              BMin:=Round(0.7*Breite); BMax:=round(1.3*Breite);
           End;
   1   :  Begin  // bis 80 % ...
              HMin:=Round(0.8*Hoehe);  HMax:=Round(1.2*Hoehe);
              BMin:=Round(0.8*Breite); BMax:=round(1.2*Breite);
           End;
   2   :  Begin  // bis 90 % ...
              HMin:=Round(0.9*Hoehe);  HMax:=Round(1.1*Hoehe);
              BMin:=Round(0.9*Breite); BMax:=round(1.1*Breite);
           End;
   3   :  Begin  // alles was abweicht an DINA4 bei angegebener DPI
              HMin:=Hoehe;             HMax:=Hoehe;
              BMin:=Breite;            BMax:=Breite;
           End;
End;  // Case Tolerance Of
// Werte des Bildes ermitteln
Hoehe:=Image1.Picture.Bitmap.Height;
Breite:=Image1.Picture.Bitmap.Width;
// Alles anzeigen
ShowMessage(IntToStr(Hoehe)+'x'+IntToStr(Breite)+#13+
            IntToStr(HMin)+ 'x'+IntToStr(BMin)+#13+
            IntToStr(HMax)+ 'x'+IntToStr(BMax));
If Hoehe In [HMin..HMax] Then
   ShowMessage('drin')
Else
   ShowMessage('nicht drin');
Ich habe das ganze mal im Kleinen versucht. Der folgende Code bringt keinerlei Fehlermeldung:

Delphi-Quellcode:
Procedure Bereichspruefung;
Var
   Hoehe,HMin,HMax : Integer;
Begin
   Hoehe:=Round(200 * 11.7); // Pixelhöhe von DINA4 bei 200 dpi
   HMin:=Round(0.7 * Hoehe);
   HMax:=Round(1.3 * Hoehe);
   Hoehe:=Image1.Picture.Bitmap.Height;
   If Hoehe In [HMin..HMax] Then
      ShowMessage('Ist drin.')
   Else
      ShowMessage('Ist nicht drin.');
End;
Eventuell bin ich völlig betriebsblind. Aber ich sehe den Unterschied nicht.
Was mache ich verkehrt?

Hudel1965 23. Sep 2008 23:15

Re: Bereichsprüfung, aber wie?
 
Hi :-)


Der IN operator geht nur von 0..255.

In deinem Testbeispiel müsste es eigentlich auch zu dem Fehler kommen. Vermutlich hast du unter den Compiler-Optionen die Bereichsprüfung ausgeschaltet.

Formulier es zu einem

if (Hoehe>=HMin) and (Hoehe<=Hmax) then

um und gut ist

Gruß

Hudel

alleinherrscher 23. Sep 2008 23:35

Re: Bereichsprüfung, aber wie?
 
Zitat:

Zitat von Hudel1965
Hi :-)


Der IN operator geht nur von 0..255.


Wäre mir neu! Der IN Operator prüft nur ob ein Element a Teil einer Menge [x..y] ist, dabei kann die Menge aus Integers oder Strings oder sonstwas bestehen....

Neutral General 23. Sep 2008 23:38

Re: Bereichsprüfung, aber wie?
 
Zitat:

Zitat von alleinherrscher
Zitat:

Zitat von Hudel1965
Hi :-)


Der IN operator geht nur von 0..255.


Wäre mir neu! Der IN Operator prüft nur ob ein Element a Teil einer Menge [x..y] ist, dabei kann die Menge aus Integers oder Strings oder sonstwas bestehen....

Dann deklariere in Delphi mal ein Set of String oder Integer und drück F9 :stupid:

alleinherrscher 23. Sep 2008 23:47

Re: Bereichsprüfung, aber wie?
 
Zitat:

Zitat von Neutral General
Zitat:

Zitat von alleinherrscher
Zitat:

Zitat von Hudel1965
Hi :-)


Der IN operator geht nur von 0..255.


Wäre mir neu! Der IN Operator prüft nur ob ein Element a Teil einer Menge [x..y] ist, dabei kann die Menge aus Integers oder Strings oder sonstwas bestehen....

Dann deklariere in Delphi mal ein Set of String oder Integer und drück F9 :stupid:

Einverstanden, ein Set darf nur 256 Elemente enthalten, aber die Elemente dürfen ja wohl aus beliebigen typen bestehen...Naja, gut, wieder was gelernt... Aber trotzdem ist "Der IN operator geht nur von 0..255" etwas unpräzise formuliert, zu meiner ehrenrettung :angel:

Roachford 24. Sep 2008 00:08

Re: Bereichsprüfung, aber wie?
 
Zitat:

Zitat von Hudel1965
if (Hoehe>=HMin) and (Hoehe<=Hmax) then

Alternativ:
Delphi-Quellcode:
if InRange(Hoehe, HMin, HMax) then

uligerhardt 24. Sep 2008 08:36

Re: Bereichsprüfung, aber wie?
 
Zitat:

Zitat von alleinherrscher
Einverstanden, ein Set darf nur 256 Elemente enthalten, aber die Elemente dürfen ja wohl aus beliebigen typen bestehen...

Nö. :mrgreen:
Zitat:

Zitat von Delphi-Hilfe
Eine Menge setzt sich aus mehreren Werten desselben ordinalen Typs zusammen. [...] Die Ordinalpositionen der Werte müssen zwischen 0 und 255 liegen.

Damit fallen sowohl Integer als auch String flach.

Schwedenbitter 24. Sep 2008 09:28

Re: Bereichsprüfung, aber wie?
 
Zitat:

Zitat von Hudel1965
if (Hoehe>=HMin) and (Hoehe<=Hmax) then

Zitat:

Zitat von Roachford
Alternativ:
Delphi-Quellcode:
if InRange(Hoehe, HMin, HMax) then

Danke für die vielen Erklärungen. Wäre ja auch zu einfach gewesen.

Ich habe es jetzt erstmal wie Hudel1965 gemacht. Aus zwei Grüden:

Ich frage nicht nur die Hoehe, sondern auch die Breite ab. Und außerdem muss jedesmal ein Not davorstehen, weil ich nur dann in die If-Alternative springen möchte, wenn die Größe gerade nicht passt. Da sieht mir
Delphi-Quellcode:
If (Hoehe<HMin) Or (Hoehe>HMax) Or (Breite<BMin) Or (Breite>BMax) Then
...
einfacher aus.
Außerdem muss ich die Unit Math noch mit einbinden, was mich zu einer allgemeinen Frage führt: Mein Programm soll möchlichst im Hintergrund laufen und schön klein bleiben. Kommt eine weitere Unit dazu, dann wird das Programm (auf der Festplatte) größer und es braucht mehr RAM, oder? Sollte das nicht der Fall sein, würde ich InRange nehmen, wenn es mir einen Geschwindigkeitsvorteil bringt...
Ich werde mir die Routine aber für die Zukunft vormerken.

Gruß, Alex


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