Autor |
Beitrag |
Toastbrotbaby
      
Beiträge: 98
|
Verfasst: Mi 01.02.06 16:43
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
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: 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 
      
Beiträge: 98
|
Verfasst: 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
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: 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
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: 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 
      
Beiträge: 98
|
Verfasst: 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
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: 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 
      
Beiträge: 98
|
Verfasst: 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
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: 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 
      
Beiträge: 98
|
Verfasst: 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
      

Beiträge: 5248
Erhaltene Danke: 2
WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
|
Verfasst: 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; |
_________________ "Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
|
|
Toastbrotbaby 
      
Beiträge: 98
|
Verfasst: 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 
      
Beiträge: 98
|
Verfasst: 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.
Delphi-Quelltext
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
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Mi 08.02.06 11:15
Hallo,
Toastbrotbaby hat folgendes geschrieben: | Delphi-Quelltext
da fängt er schon an zu nögeln. |
da hat er auch allen Grund zu
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?
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
digi_c
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: Mi 08.02.06 11:47
Verdammt es war mittags  sry
|
|
Toastbrotbaby 
      
Beiträge: 98
|
Verfasst: 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
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: 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 
      
Beiträge: 98
|
Verfasst: 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
      
Beiträge: 1905
W98, XP
D7 PE, Lazarus, WinAVR
|
Verfasst: 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
|
|