Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   erweiterte IF - Bedingung (https://www.delphipraxis.net/184659-erweiterte-if-bedingung.html)

MasterDoge 12. Apr 2015 20:52

erweiterte IF - Bedingung
 
Guten Abend ihr,
ich habe mit Lazarus angefangen, für die Schule einen Vertretungsplan zu erstellen.
Ich versuche seit einer Stunde, bei bestimmten Fällen keine Nachricht zu schicken:
if (edit1.text='Sekretäriat') or (edit1.text='sekretäriat') and (edit2.text='Faldera123')
then begin
form2.show;
form1.hide;
end;
then begin
form3.show;
form1.hide;
end;
if
not (edit1.text='Sekretäriat') and (edit2.text='Faldera123')
or not (edit1.text='sekretäriat') and (edit2.text='Faldera123')
or not (edit1.text='Schüler') and (edit2.text='Klasse123')
or not (edit1.text='schüler') and (edit2.text='Klasse123')
then
showmessage('Falsch.');
So weit habe ich das bis jetzt, aber es kommt jetzt jedes Mal die Nachrricht "Falsch".
Könnt ihr mir velleicht weiterhelfen?
Lg Tilman

Helmi 12. Apr 2015 21:02

AW: erweiterte IF - Bedingung
 
setz mal vor dem not jeweils noch eine offene Klammer und vor dem nächsten or eine geschlossene Klammer

oder
Delphi-Quellcode:
var
  S1: String;
  S2: String;

begin
  S1 := AnsiLowerCase(Edit1.Text); //klein schreiben
  S2 := Edit2.Text;
//  S2 := AnsiLowerCase(Edit2.Text);

  If ((S1 <> 'sekretäriat') and (S2 = 'Faldera123')) or ((S1 <> 'schüler') and (S2 = 'Klasse123')) then
    ShowMessage('falsch');
end;
Ich schreibe einfach erstmal alles klein (
Delphi-Quellcode:
AnsiLowerCase
) - so brauch ich nicht auf die Groß-/Kleinschreibung im Vergleich achten!
(case sensitive)

mkinzler 12. Apr 2015 21:05

AW: erweiterte IF - Bedingung
 
Den OR hat eine höhere Priorität wie AND

himitsu 12. Apr 2015 21:06

AW: erweiterte IF - Bedingung
 
Wann kommt falsch und bei welchen Eingabewerten?

Ich würde aber fast wetten du hat ein paar Klammern vergessen.
Denn dein Code macht es aktuell so
Delphi-Quellcode:
if (not (edit1.Text = 'Sekretäriat')) and (edit2.Text = 'Faldera123')
  or (not (edit1.Text = 'sekretäriat')) and (edit2.Text = 'Faldera123')
  or (not (edit1.Text = 'Schüler')) and (edit2.Text = 'Klasse123')
  or (not (edit1.Text = 'schüler')) and (edit2.Text = 'Klasse123')
then
  showmessage('Falsch.');
Delphi-Quellcode:
if ((edit1.Text <> 'Sekretäriat') and (edit2.Text = 'Faldera123'))
  or ((edit1.Text <> 'sekretäriat') and (edit2.Text = 'Faldera123'))
  or ((edit1.Text <> 'Schüler') and (edit2.Text = 'Klasse123'))
  or ((edit1.Text <> 'schüler') and (edit2.Text = 'Klasse123'))
then
  showmessage('Falsch.');
Lösungen:

Delphi-Quellcode:
if not ((edit1.Text = 'Sekretäriat') and (edit2.Text = 'Faldera123'))
  or not ((edit1.Text = 'sekretäriat') and (edit2.Text = 'Faldera123'))
  or not ((edit1.Text = 'Schüler') and (edit2.Text = 'Klasse123'))
  or not ((edit1.Text = 'schüler') and (edit2.Text = 'Klasse123'))
then
  showmessage('Falsch.');
Delphi-Quellcode:
if not (edit1.Text = 'Sekretäriat') and not (edit2.Text = 'Faldera123')
  or not (edit1.Text = 'sekretäriat') and not (edit2.Text = 'Faldera123')
  or not (edit1.Text = 'Schüler') and not (edit2.Text = 'Klasse123')
  or not (edit1.Text = 'schüler') and not (edit2.Text = 'Klasse123')
then
  showmessage('Falsch.');
Delphi-Quellcode:
if (edit1.Text <> 'Sekretäriat') and (edit2.Text <> 'Faldera123')
  or (edit1.Text <> 'sekretäriat') and (edit2.Text <> 'Faldera123')
  or (edit1.Text <> 'Schüler') and (edit2.Text <> 'Klasse123')
  or (edit1.Text <> 'schüler') and (edit2.Text <> 'Klasse123')
then
  showmessage('Falsch.');
Diese drei Lösungen machen alle das Gleiche, wenn man die boolsche Algebra gelernt hat.

Siehe auch
Delphi-Quellcode:
if ((edit1.text='Sekretäriat') or (edit1.text='sekretäriat')) and (edit2.text='Faldera123') then

Wie im Mathe: Punktrechnung vor Strichrechnung ... AND vor OR
und NOT so, wie das Minus von negativen Zahlen.

Also solltest du dieses vielleicht besser lernen, z.B. über eines der unzähligen Tutorials. :wink:



PS: Delphi-Referenz durchsuchenAnsiSameText


[edit]
ähhh, verwende doch bitte [delphi]...[delphi]

@Helmi: Nach den NOT und um beide AND-Operatoren :zwinker:

Helmi 12. Apr 2015 21:10

AW: erweiterte IF - Bedingung
 
Zitat:

Zitat von himitsu (Beitrag 1297365)
@Helmi: Nach den NOT und um beide AND-Operatoren :zwinker:

stimmt - sorry!

Hab meinen Post noch erweitert

himitsu 12. Apr 2015 21:18

AW: erweiterte IF - Bedingung
 
Ich mache die vergleiche meistens gern direkt case-insensitiv, da wo sie es sein sollen. (außer vielleicht wenn es sein muß, bezüglich der Performance auch vorher)

So, und nun sage mal jemand, warum man Mathe lernen soll ... braucht man ja eh nie wieder im Leben. :stupid:



------------

Es gibt 10 Arten von Menschen.
Die, welche binär können, und jene, welche das nicht können.

MasterDoge 12. Apr 2015 21:38

AW: erweiterte IF - Bedingung
 
Also:
Der Pc sagt mir jetzt verschiedene Sachen, unter anderem, bei dem Fall, wo er mich eigentlich einloggen sollte, dass die Eingabe falsch ist, und dann meldet er mich an.
Wenn ich im oberen Fenster falsch bin, zeigt er mir gar keine Nachricht an.
Und wenn ich im unteren Fenster falsch bin, sagt er mir, dass ich Falsch bin, öffnet mir auch gleichzeitig den Vertretungsplan.
ICh habe das mit allen drei der Lösungen ausprobiert, keine funktioniert. :(
Lg Tilman

himitsu 12. Apr 2015 22:37

AW: erweiterte IF - Bedingung
 
Naja, etwas Wichtiges hast du immernoch vergessen zu erklären, was genau du wie prüfen willst.

Versuch es doch mal als deutschen Satz zu beschreiben.

Helmi 13. Apr 2015 05:17

AW: erweiterte IF - Bedingung
 
wir wissen ja nicht, was dein Programm tut, bzw. tun soll

wir kennen bislang nur die paar Zeilen Code, die du uns in deinen ersten Post geschrieben hast

und all unsere Glaskugeln sind zur Reparatur (sehr anfälliges Produkt) :-)

DeddyH 13. Apr 2015 08:42

AW: erweiterte IF - Bedingung
 
Zitat:

Zitat von mkinzler (Beitrag 1297364)
Den OR hat eine höhere Priorität wie AND

Ist das nicht genau andersherum? IIRC gilt: NOT > AND > OR

himitsu 13. Apr 2015 09:00

AW: erweiterte IF - Bedingung
 
OR ~ +
AND ~ *

http://docwiki.embarcadero.com/RADSt...von_Operatoren
http://de.wikipedia.org/wiki/Operatorrangfolge

DeddyH 13. Apr 2015 09:03

AW: erweiterte IF - Bedingung
 
Sag ich ja.

himitsu 13. Apr 2015 09:29

AW: erweiterte IF - Bedingung
 
Ich auch ... nur nochmal zur Sicherheit, falls es keiner glauben will.

#4 :angle2:

DeddyH 13. Apr 2015 09:31

AW: erweiterte IF - Bedingung
 
Das geht in dem Monster-Post allerdings unter, Du solltest vielleicht Psalm und Vers angeben :mrgreen:

BadenPower 13. Apr 2015 09:36

AW: erweiterte IF - Bedingung
 
Unter Berücksichtigung des Programmierstils des TE müsste das so aussehen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin

  if (     ((Edit1.Text = 'Sekretäriat') or (Edit1.Text = 'sekretäriat'))
       and (Edit2.Text = 'Faldera123')
     ) then
   begin
    Form2.Show;
    Form1.Hide
   end;

  if (     ((Edit1.Text = 'Schüler') or (Edit1.Text = 'schüler'))
       and (Edit2.Text = 'Klasse123')
     ) then
   begin
    Form3.Show;
    Form1.Hide
   end;

  if (     ( not ((Edit1.Text = 'Sekretäriat') and (Edit2.Text = 'Faldera123')) )
       and ( not ((Edit1.Text = 'sekretäriat') and (Edit2.Text = 'Faldera123')) )
       and ( not ((Edit1.Text = 'Schüler') and (Edit2.Text = 'Klasse123')) )
       and ( not ((Edit1.Text = 'schüler') and (Edit2.Text = 'Klasse123')) )
     ) then
   begin
    ShowMessage('falsch');
   end;

end;
Aber es sollte doch wohl 'Sekretariat' heissen und nicht 'Sekretäriat'.

DeddyH 13. Apr 2015 09:43

AW: erweiterte IF - Bedingung
 
Das müsste dann logisch diesem hier entsprechen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if ( ((Edit1.Text = 'Sekretäriat') or (Edit1.Text = 'sekretäriat'))
       and (Edit2.Text = 'Faldera123')
     ) then
   begin
    Form2.Show;
    Form1.Hide
   end

  else if ( ((Edit1.Text = 'Schüler') or (Edit1.Text = 'schüler'))
       and (Edit2.Text = 'Klasse123')
     ) then
   begin
    Form3.Show;
    Form1.Hide
   end

  else
   begin
    ShowMessage('falsch');
   end;

end;
[edit] Zu dem Zugriff auf die globale Form1-Variable sag ich mal nichts. [/edit]

BadenPower 13. Apr 2015 10:01

AW: erweiterte IF - Bedingung
 
Zitat:

Zitat von DeddyH (Beitrag 1297436)
[edit] Zu dem Zugriff auf die globale Form1-Variable sag ich mal nichts. [/edit]

Ich habe es bewußt nicht geändert, da ich nicht sicher sein konnte, ob die Abfragen im Programm des TE in Form1 ausgeführt werden.

DeddyH 13. Apr 2015 10:04

AW: erweiterte IF - Bedingung
 
Ich ja auch nicht ;)

himitsu 13. Apr 2015 10:11

AW: erweiterte IF - Bedingung
 
Wenn der TE das dann mal anpasst, dann könnte er seinen Units, Forms und Komponenten auch gleich ein paar sprechende Bezeichner verpassen. :stupid:

Jumpy 13. Apr 2015 11:22

AW: erweiterte IF - Bedingung
 
[OT]
Sollte es nicht lieber Sekretariat heißen. Das hat zwar nichts mit dem Fehler zu tun, würde aber die spätere Akzeptanz des Programms beim Deutschlehrer steigern.

Hoffentlich hab ich jetzt keinen Rechtschreibfehler in meinem besserwisserischen Beitrag hier. :-D
[/OT]

MasterDoge 13. Apr 2015 11:24

AW: erweiterte IF - Bedingung
 
Also: Ich habe in der Schule das Fach Informatik seit einem drei viertel Jahr.
Wir haben über die Osterferien die Aufgabenstellung erhalten, irgendetwas zu programmieren.
Ich bin auf die Idee gekommen, einen Vertretungsplan zu erstellen, welcher nicht für die Schule an sich geeignet ist, sondern einfach eine gute Note gibt, da dieses Projekt ein bisschen umfangreicher ist. Ich habe mit einer Anmeldeform angefangen, welche sich nach richtiger Benutzer - und Passworteingabe entweder in die (neue) Form 2 des Schülers oder in die Form 3 des Sekretariats übergeht:
Code:
procedure TForm1.Button1Click(Sender: TObject);
begin

  if (edit1.text='Sekretariat') or (edit1.text='sekretariat') and (edit2.text='123')
  then begin
  form2.show;
  form1.hide;
  end;
  if (edit1.text='Schüler') or (edit1.text='schüler') and (edit2.text='456')
  then begin
  form3.show;
  form1.hide;
  end;
Das eigentliche Problem, dass sich mir dann gestellt hast, ist dass ich versucht hatte, eine Nachicht anzeigen zu lassen, wenn der Nutzername, oder das Passwort falsch ist.

Delbor 13. Apr 2015 11:25

AW: erweiterte IF - Bedingung
 
Hi zusammen

Zitat:

Wenn der TE das dann mal anpasst, dann könnte er seinen Units, Forms und Komponenten auch gleich ein paar sprechende Bezeichner verpassen.
Au ja!! Und nicht mehr die Textinhalte der Edits direkt vergleichen, sondern diese in Variablen schreiben und diese dann verwenden.
In einem Record könnten die Inhalte der Edits abgelegt werden. Da unbekannt ist, was der TE damit genau festhält/vergleichen will, verzichte ich hier allerdings - auch zur Verdeutlichung - auf sprechende Namen.

Delphi-Quellcode:
MemberRecord = record
  Edit1Text: String;
  Edit2Text :String;
Nun kann geprüft werden, ob die Felder den richtigen Inhalt haben.
Delphi-Quellcode:
begin
  if MemberRecord.Edit1Text = AnsiLowerCase('Sekretariat') then begin
    if MemberRecord.Edit2Text <> 'Faldera123' then
      ShowMessage('Falsch');
  end;

  if MemberRecord.Edit1Text = AnsiLowerCase('Schüler') then begin
    if MemberRecord.Edit2Text <> 'Klasse123' then
      ShowMessage('Falsch');
  end
end;
Es scheint mir hier allerdings um 'Benutzer' einer Schule zu gehen - und die sind entweder Schüler oder Angestellte. Von daher müsste das wohl nochmal anders gelöst werden, zB. mit einer Klasse TSchulhausMembers...

Gruss
Delbor

BadenPower 13. Apr 2015 11:27

AW: erweiterte IF - Bedingung
 
Zitat:

Zitat von Jumpy (Beitrag 1297456)
Hoffentlich hab ich jetzt keinen Rechtschreibfehler in meinem besserwisserischen Beitrag hier. :-D

Rechtschreibfehler habe ich in Deinem Beitrag jetzt keine gesucht, aber eine Leseschwäche gefunden.:-D

Aber das von Dir Bemängelte steht schon in #15.

BadenPower 13. Apr 2015 11:31

AW: erweiterte IF - Bedingung
 
Zitat:

Zitat von MasterDoge (Beitrag 1297459)
Das eigentliche Problem, dass sich mir dann gestellt hast, ist dass ich versucht hatte, eine Nachicht anzeigen zu lassen, wenn der Nutzername, oder das Passwort falsch ist.

Dann sollten die Vorschläge #15 oder besser #16 für Dich das Richtige sein.

MasterDoge 13. Apr 2015 12:57

AW: erweiterte IF - Bedingung
 
Jap, du hattest Recht, es funktioniert. Danke :D :thumb:
Liebe Grüße, Tilman


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