AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bereichsprüfung, aber wie?

Ein Thema von Schwedenbitter · begonnen am 24. Sep 2008 · letzter Beitrag vom 24. Sep 2008
Antwort Antwort
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Bereichsprüfung, aber wie?

  Alt 24. Sep 2008, 00:03
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?
Alex Winzer
  Mit Zitat antworten Zitat
Hudel1965

Registriert seit: 4. Nov 2005
Ort: Köln
32 Beiträge
 
Delphi XE3 Professional
 
#2

Re: Bereichsprüfung, aber wie?

  Alt 24. Sep 2008, 00:15
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
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Bereichsprüfung, aber wie?

  Alt 24. Sep 2008, 00:35
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....
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Bereichsprüfung, aber wie?

  Alt 24. Sep 2008, 00:38
Zitat von alleinherrscher:
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Bereichsprüfung, aber wie?

  Alt 24. Sep 2008, 00:47
Zitat von Neutral General:
Zitat von alleinherrscher:
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
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
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Roachford
(Gast)

n/a Beiträge
 
#6

Re: Bereichsprüfung, aber wie?

  Alt 24. Sep 2008, 01:08
Zitat von Hudel1965:
if (Hoehe>=HMin) and (Hoehe<=Hmax) then
Alternativ: if InRange(Hoehe, HMin, HMax) then
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Bereichsprüfung, aber wie?

  Alt 24. Sep 2008, 09:36
Zitat von alleinherrscher:
Einverstanden, ein Set darf nur 256 Elemente enthalten, aber die Elemente dürfen ja wohl aus beliebigen typen bestehen...
Nö.
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.
Uli Gerhardt
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Bereichsprüfung, aber wie?

  Alt 24. Sep 2008, 10:28
Zitat von Hudel1965:
if (Hoehe>=HMin) and (Hoehe<=Hmax) then
Zitat von Roachford:
Alternativ: 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
Alex Winzer
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:52 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