Entwickler-Ecke
Sonstiges (Delphi) - boolean und case anweisung
Toastbrotbaby - Mi 01.02.06 16:43
Titel: boolean und case anweisung
aalso, folgendes problem ...
als beispiel ...
ich habe 6 Checkboxen.
Wenn Checkbox a aktiviert wird, wird box b und d sichtbar.
wird b aktiviert soll c und e sichtbar werden.
wird d aktiviert soll f sichtbar werden.
wird c aktiviert sollen e und f unsichtbar werden
wird e aktiviert sollen c und f unsichtbar werden
wird f aktiviert sollen c und e unsichtbar werden
Sooo ... ich hab das mal mit ner if anweisung versucht aber das is ja waaaaaaaaaaaahnsinn da wird man ja bekloppt bei.
so nun dachte ich müsste es doch machbar sein das man das mit einer case of anweisung besser hinkriegt oder? Aber eine Case of anweisung habe ich bisher nur mit Integer gemacht, hab also keinen plan wie ich das mit nem boolean machen muss/kann ...
allerdings habe ich im allgemeinen grad keine ahnung ... wie ich das am geschicktesten anstelle. Vorallem da ja die oben beschriebenen events nicht die einzigen sind die da ablaufen ... als kleine info zwischendurch sind es derzeit glaube ich 250 labels, 120 Checkboxen und 7 TEdit felder. Und das ist noch nicht mal die hälfte. Bin allerdings schon bei 6500 zeilen Code. Und wenn ich das da oben alles mit if .. then begin ... end mache hab ich das gefühl das ich in 2 wochen nicht mehr weiss was sache ist. Zu mal noch n fehler auftauchte und ich nach ner minute nimmer wusste wo ich suchen muss ... bitte bitte bitte hilf mir jemand mit einem kleinen beispiel ... ich dreh sonst durch *dreh*
Gruss
Toasti
digi_c - Mi 01.02.06 16:56
Ich glaube ne gute Lösung wäre für Alle Ereignisse ein Ereignis zu nehmen(wird im Eigenschaftseditor auch angezeigt) und jeder Checkbox nen Tag zu verpassen.
In dieser einen Prozedur kannst du dann ein Case Sender.Tag of machen und dann schön strukturiert darauf reagieren.
Toastbrotbaby - Mi 01.02.06 17:07
plz die antwort nochmal für newbs ... ich hab jetzt von dem echt kein wort verstanden .. aber cool das überhaupt jemand gerallt hat was ich da versucht habe von mir zu geben :)
Gruss
Toast
AXMD - Mi 01.02.06 17:10
Alternativ auch über den Namen der Komponente und FindComponent. Einfach mal im Forum ein bisschen suchen ;)
AXMD
digi_c - Mi 01.02.06 21:00
Ich mag das nicht Leuten fertigen Code zu geben also nochmal langsam:
1.Case funktioniert nur bei ordinalen Variablen ergo brauchst du eine Zahl/Char/... was Aufzählbares
2.Jede Komponente hat eine Eigenschaft Tag, die ist Integer => bestens geeignet
3.Jedes Ereignis einer Komponente endet in einer Funktion(Button1Click()), welche das ist kannst du frei im Objektinstektor-Ereignisse-Combobox des Ereignisses wählen
4.Diese tragen immer das Sender Objekt mit, mit dessen Hilfe du rauskriegen kannst welche Komponente deine 5.Funktion jetzt aufgerufen hat
6.Du kannst mehren Komponenten die selbe Ereignisfunktion zuweisen
7.Dadrin kannst du dann mit einem Case Sender.Tag of die tagNr. deiner Listenboxen abfragen und darauf reagieren und zwar in schönen unverschachtelten begin...end Blöcken
Toastbrotbaby - Do 02.02.06 10:55
digi_c hat folgendes geschrieben: |
Ich mag das nicht Leuten fertigen Code zu geben also nochmal langsam:
|
diese diskussion hatte ich schon 100 mal hier im forum ... und ich kann auch noch 1 mio mal sagen das ich das garnicht will ... aber an hand von einem beispiel verstehe ich sowas leichter als an solchen worten ... Auch mit dem folgenden wiederhole ich mich. Ich will ja nur verstehen was ich da tue, also habe ich 0 interesse daran das jemand mein programm schreibt, das is mir ausserdem viel zu doof wenn ich das nicht selbst mache.
Geht mir nur ums verstehen ...
Weil so wie du es sagst versteh ich nur Bahnhof, vorallem wenn es etwas ist was ich noch nicht wirklich gemacht habe ...
Gruss
Toast
PS: habe das gestern abend mal mit einer Case of und if .. then kombination versucht. Scheint zu funktionieren. Was nicht heisst das ich es nicht gerne einfacher machen will.
digi_c - Do 02.02.06 13:41
Ich will dir das auch überhauptnicht unterstellen aber du weißt ja das viele Leute einfach bloß blind STRG+C/STRG+V machen und dann posten "es geht nicht" ;-)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure AllComboboxClick(Sender:TObject) begin case Sender.Tag of 1: begin if (Sender as TComboBox).ItemIndex > -1 then... end; 2: begin end; ... end;
procedure TForm1Show(Sender:TObject); begin Form1.Combobox1.Tag:=1; Form1.Combobox2.Tag:=2; Form1.Combobox3.Tag:=3; Form1.Combobox4.Tag:=4; ... Form1.ComboBox1.OnClick:=AllComboboxClick; Form1.ComboBox2.OnClick:=AllComboboxClick; end; |
Das ganze im Form Show kannst du wie gesagt auch direkt beim Programmentwurf im Objektinspektor einstellen.
Toastbrotbaby - Fr 03.02.06 10:57
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1Show(Sender:TObject); begin Form1.Combobox1.Tag:=1; Form1.Combobox2.Tag:=2; Form1.Combobox3.Tag:=3; Form1.Combobox4.Tag:=4; ... Form1.ComboBox1.OnClick:=AllComboboxClick; Form1.ComboBox2.OnClick:=AllComboboxClick; end; |
also den teil mit
Form1.Combobox1.Tag:=1;
..
kann man also auch während des erstellens des programmes in dem mann die eigenschaft des Tags auf den entsprechenden wert setzt, richtig?
Und den teil mit
Form1.Combobox1.Onclick:=AllComComboboxClick;
besagt doch nur das beim klicken der Combobox die Prozedur aufgerufen wird und die abfrage gestartet wird, auch richtig, oder?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure AllComboboxClick(Sender:TObject) begin case Sender.Tag of 1: begin if (Sender as TComboBox).ItemIndex > -1 then... end; 2: begin end; ... end; |
und es muss auch immer case Sender.Tag of und dann wie bei einer normalen case of aufzählung die nummer mit ihrer aktion, richtig?
sprich also
Delphi-Quelltext
1: 2: 3: 4: 5:
| case Sender.Tag of 1: begin Label1.Caption := 'Hallo'; end; |
...
wäre das so korrekt, nur als beispiel? soll zwar kein label ändern, aber es geht ja auch nur ums verstehen :)
Aber wenn ich jetzt zb Checkbox1 habe und der Sender.Tag 1 ist und dann auf den button klicke, wo muss dann definiert werden was passiert wenn da was angeklickt ist. Es gibt ja zb auch kombinationen aus verschiedenen boxen die zeitgleich angeklickt sein müssen damit ein bestimmter effekt eintritt ...
Da habe ich dann doch noch einen kleinen knoten im kopf
Aber danke schon mal ...
Gruss
Toast
digi_c - Fr 03.02.06 13:50
Genau, laut deinen Vorgaben würde ich das so anfangen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure AllComboboxClick(Sender:TObject) begin case Sender.Tag of 1: begin if (Sender AS Checkbox).Enabled then begin ResetAllCheckboxes(); Checkbox2.Visible:=true; Checkbox4.Visible:=true; end; end; 2: begin if (Sender AS Checkbox).Enabled then begin ResetAllCheckboxes(); Checkbox3.Visible:=true; Checkbox5.Visible:=true; end; ... end; |
entweder du nutzt
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure ResetAllCheckboxes(); begin Checkbox1.Visible:=false; ... end; |
oder du schreibst jeweils explezit rein welche dann ausgeblendet werden müssen.
Toastbrotbaby - Sa 04.02.06 12:35
hmmm okay ... ein paar kleine fragen habe ich noch bevor ich mich da an die arbeit mache.
Delphi-Quelltext
1:
| if (Sender AS Checkbox).Enabled then |
das steht dafür das wenn die Checkbox angeklickt ist, richtig? wenn ja sollte also auch theoretisch
Delphi-Quelltext
1:
| if (Sender AS Checkbox).Disabled then |
funktionieren sofern man das ereignis haben will wenn die deaktiviert ist, richtig?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| begin if (Sender AS Checkbox).Enabled then begin ResetAllCheckboxes(); Checkbox2.Visible:=true; Checkbox4.Visible:=true; end; |
dazu dann noch die frage .... wofür das ResetAllCheckboxes();??? hat das einen speziellen hintergrund?
und dann muss ich ja am ende nur jeder Checkbox die das betrifft die Procedure AllComboboxClick (in diesem fall hier) zuweisen, richtig?
Gruss
Toast
GTA-Place - Sa 04.02.06 13:23
Geht auch etwas kürzer ohne if:
Delphi-Quelltext
1: 2:
| Checkbox2.Visible := (Sender AS Checkbox).Enabled; Checkbox4.Visible := (Sender AS Checkbox).Enabled; |
Toastbrotbaby - So 05.02.06 19:31
Zitat: |
dazu dann noch die frage .... wofür das ResetAllCheckboxes();??? hat das einen speziellen hintergrund?
und dann muss ich ja am ende nur jeder Checkbox die das betrifft die Procedure AllComboboxClick (in diesem fall hier) zuweisen, richtig? |
Die beiden fragen wurden mir noch nicht so konkret beantwortet.
Öhm ... ach und thx gta ... der tip ist auch noch recht nützlich was die übersicht angeht.
Danke schon mal ...
Gruss
Toast
Toastbrotbaby - Di 07.02.06 23:55
soo ... ich hab da jetzt mal so einiges probiert, aber geklappt hat davon bisher noch nix.
Ich habe mir testweise mal ein komplett neues programm geschrieben was nur diese 6 Checkboxen enthält.
Dann habe ich die Prozedur geschrieben wie sie hier ja nun mehrfach vor kam, aber halt so das sie auf die Checkboxen passen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure AllComboboxClick(Sender:TObject) begin case Sender.Tag of 1: begin if (Sender AS Checkbox).Enabled then begin ResetAllCheckboxes(); Checkbox2.Visible:=true; Checkbox4.Visible:=true; end; end; 2: begin if (Sender AS Checkbox).Enabled then begin ResetAllCheckboxes(); Checkbox3.Visible:=true; Checkbox5.Visible:=true; end; ... end; |
so zum testen nahm ich mir mal davon einen teil vor. so bin grad an dem rechner wo ich kein delphi drauf habe, aber ich kann mich noch dran erinnern wo die fehler liegen, allerdings nicht den genauen wortlaut der fehlermeldungen. Hoffe das jemand trotz dessen schon ein antwort geben kann, die hilft.
da fängt er schon an zu nögeln.
dann wieder bei dem
Delphi-Quelltext
1:
| (Sender AS TCheckbox).enabled; |
da dann auch noch. Aber da halt auch direkt mal wieder 2 fehler, halt einmal das irgendwas mit dem Sender nicht stimmt und dann wieder irgendwas mit .enabled oder der ) ... is doof das ich mir das vorhin nicht aufgeschrieben habe ...
naja ... ich dachte mir das kanns ja nicht sein. Habe dann erstmal selbst geguckt, und ausprobiert. habe die verschiedensten dinge geändert. Als das so auch nicht geklappt hat, habe ich die Delphi Hilfe geöffnet, aber irgendwie auch nichts konkretes gefunden. Jedenfalls nichts was mich so auf anhieb weiter bringen würde.
Dann habe ich jetzt hier im Forum mal ein weilchen gesucht, aber irgendwie auch nicht so recht das gefunden was ich haben will. Deshalb dann hier nochmal die frage was ich da wie definieren muss damit ich ein ergebnis kriege.
Ach und bevor es jetzt wieder heisst das ich ja doch nur strg+c/strg+v mache ... kann ich nur sagen das ich es nicht tue ... nur bevor ich in dem programm los schreibe wo es mal rein soll teste ich das erstmal alles vorher und gucke mir genau an was da passiert und wie und warum ...
Gruss
Toast
digi_c - Mi 08.02.06 09:52
Nein ich wollte dich da oben auch nicht in diese Rubrik stellen, aber gerade Anfänger neigen dazu einfach alles unhinterfregt zu kopieren und wundern sich dann wieso etwas nicht geht bzw lernen nix. :-)
Ohne die Meldungen wüßte ich jetzt nicht woran es liegen könnte aber ich habe das wirklich nur aus dem Kopf zusammengeschrieben, möglich das ich was falsch gemacht habe....
Lannes - Mi 08.02.06 11:15
Hallo,
Toastbrotbaby hat folgendes geschrieben: |
da fängt er schon an zu nögeln. |
da hat er auch allen Grund zu :wink:
Wenn Du Dir mal die Declaration anschaust, siehst Du das Sender vom typ TObject ist.
Delphi-Quelltext
1:
| procedure AllComboboxClick(Sender:TObject); |
Die Eigenschaft Tag ist erst ab TComponent vorhanden.
Folglich wird die Fehlermeldung so ähnlich lauten: "Undefinierter Bezeichener: Tag"
Da musst Du einen Typecast vornehmen, der hier auch schon mehrmals gepostet wurde:
Delphi-Quelltext
1:
| Case (Sender as TCheckbox).Tag of |
Toastbrotbaby hat folgendes geschrieben: |
dann wieder bei dem
Delphi-Quelltext 1:
| (Sender as TCheckbox).enabled; | |
da wird er nicht meckern, vermut das in Deinem Code den Du ausführst, das steht:
Delphi-Quelltext
1:
| if (Sender AS Checkbox).Enabled then |
Checkbox ist kein Type, da fehlt das
T.
Ein Typecast kannst Du auch in folgender Form vornehmen:
Delphi-Quelltext
1:
| if TCheckBox(Sender).Enabled then |
Zu dem Thema kann ich Dir den Thread empfehlen:
(x as TControl) / TControl(x) - Wo ist der Unterschied? [
http://www.delphi-forum.de/viewtopic.php?t=37422&start=0&postdays=0&postorder=asc&highlight=]
digi_c - Mi 08.02.06 11:47
Verdammt es war mittags :oops: sry
Toastbrotbaby - Mi 08.02.06 15:00
hi,
danke schon mal lannes für die gründliche antwort. Das mit dem TObject erklärt natürlich so einiges ... ich würde sogar mal behaupten das es das einzige war was ich noch nicht ausprobiert hatte. *grübel*
Delphi-Quelltext
1:
| if (Sender AS Checkbox).Enabled then |
das hatte ich allerdings auch mit TCheckbox und TObject ausprobert, ging aber beides nicht. Wenn ich mich grad recht entsinne kam die fehlermeldung nach oder bei dem ). ...
kann mich auch täuschen und es kann auch sein das der erste fehler sämtliche meiner fehler aus der welt schiebt. Aber das wird schon.
so und um den ersten fehler mal zu beheben muss ich doch nur den Sender abändern, richtig?
Delphi-Quelltext
1:
| procedure AllComboboxClick(Sender:TObject); |
das muss dann also eigentlich so aussehen?
Delphi-Quelltext
1:
| procedure AllComboboxClick(Sender:TCheckbox); |
*gleich mal ausprobieren geh*
Sollte das so alles klappen sage ich schon mal denke an euch beide, habt mir wirklich sehr geholfen.
Gruss
Toast
digi_c - Mi 08.02.06 16:50
Nein die Deklaration der Prozedur sollte eigentlich unverändert bleiben, da die Checkboxen für ihre Ereignisse ja Funktionen mit bestimmten Aufrufparameter aufrufen.
Caste den doch einfach in am Anfang deiner AllClick Prozedur mit TCheckbox(Sender).Tag.
Toastbrotbaby - Fr 10.02.06 01:04
soooooooooooooo ...
problem 1 ist gelöst ... die prozedur scheint zu funktionieren. hoffe ich jedenfalls. Konnte sie nämlich noch nicht perfekt testen, da noch ein weiteres problem auf trat.
Ich konnte die prozedur nicht aufrufen.
ich habe in der Delphi hilfe mal geguckt, und ich hab es genau so gemacht wie es da steht. den namen der prozedur und dahinte (). wurde sogar hier im thread schon demonstriert. es ist mir ein rätsel. Die Fehlermeldung lautet "nicht genügend wirkliche parameter". also ich hab da keine ahnung was da nu wieder das problem ist.
öhm und dann noch eine frage. Wie ich das sehe funktioniert das ganze ja nur sehr einseitig. nämlich so das es nicht so funktioniert wie das
Delphi-Quelltext
1:
| Checkbox2.Visible := Checkbox1.Checked; |
bei dem wäre ja die Checkbox 2 immer nur dann sichtbar wenn die 1 angeklickt ist. aber bei der Case of die hier so ausführlich besprochen wurde müsste ich doch theoretisch noch eine weitere Case of schreiben oder?
und wie sieht das aus wenn mehrere checkboxes angeklickt sein müssen damit die entsprechende checkbox aktiv wird muss ich doch nur
Delphi-Quelltext
1: 2:
| case n of 1,2: Checkbox3.Visible := true; |
schreiben oder????
Gruss
Toast
digi_c - Fr 10.02.06 10:05
Nicht genügend Parameter: da musst du hinten den Sender noch übergeben aber dadurch rufst du die Methode auf, weißt sie aber nicht zu.
Ja du kannst bei einem Case auch 1..3:begin machen
Lannes - Fr 10.02.06 14:36
Hallo,
Toastbrotbaby hat folgendes geschrieben: |
...und wie sieht das aus wenn mehrere checkboxes angeklickt sein müssen damit die entsprechende checkbox aktiv wird muss ich doch nur
Delphi-Quelltext 1: 2:
| case n of 1,2: Checkbox3.Visible := true; |
schreiben oder????
... |
Das ist jetzt eine ganz andere Bedingung als in Deinem Anfangs-Post beschrieben.
Da steht im Grunde genommen:
Wenn z.B. CheckBox A gechecked wird,
sollen CheckBox X und Y sichtbar werden und Checkbox Z verborgen werden.
Jetzt kommt hinzu
... und das aber nur wenn CheckBox B schon gechecked ist.
Das kannst Du mit
1,2 : begin oder
1..3 : begin nicht erreichen.
Darin wird über die Tag-Eigenschaft der Sender-Checkbox überprüft ob sie beispielsweise in 1,2 enthalten ist. Ist der Wert darin enthalten wird der Code zwischen
beginn und
end ausgeführt.
Dazwischen gehört die zusätzliche Bedingung, etwa so:
Angenommen die CheckBoxA wird gechecked und hat die Tag-Eigenschaft 1.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Case (Sender as TCheckbox).Tag of 1 : begin if (Sender as TCheckbox).checked) and (CheckboxB.checked) then begin CheckboxX.Visible:=True; CheckboxY.Visible:=True; CheckboxZ.Visible:=False; end; end; |
//Edit: in Zeile bei CheckboxZ war Fehler ethalten, bereinigt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!