Autor Beitrag
Toastbrotbaby
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Do 02.02.06 10:55 
user profile icondigi_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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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" ;-)

ausblenden 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
      //Aktionen die bei der ersten Combobox ausgeführt werden sollen z.b.
      if (Sender as TComboBox).ItemIndex > -1 then...
    end;
    2:
    begin
      //Aktionen die bei der ersten Combobox ausgeführt werden sollen
    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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Fr 03.02.06 10:57 
ausblenden 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?

ausblenden 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  
      //Aktionen die bei der ersten Combobox ausgeführt werden sollen z.b.  
      if (Sender as TComboBox).ItemIndex > -1 then...  
    end;  
    2:  
    begin  
      //Aktionen die bei der ersten Combobox ausgeführt werden sollen  
    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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Fr 03.02.06 13:50 
Genau, laut deinen Vorgaben würde ich das so anfangen:

ausblenden 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//Checkbox a     
    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

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: Sa 04.02.06 12:35 
hmmm okay ... ein paar kleine fragen habe ich noch bevor ich mich da an die arbeit mache.

ausblenden 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

ausblenden Delphi-Quelltext
1:
if (Sender AS Checkbox).Disabled then					


funktionieren sofern man das ereignis haben will wenn die deaktiviert ist, richtig?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Sa 04.02.06 13:23 
Geht auch etwas kürzer ohne if:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: 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.

ausblenden 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//Checkbox a       
    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.

ausblenden Delphi-Quelltext
1:
Case Sender.Tag of					


da fängt er schon an zu nögeln.

dann wieder bei dem

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mi 08.02.06 11:15 
Hallo,
user profile iconToastbrotbaby hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
Case Sender.Tag of					

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.
ausblenden 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:
ausblenden Delphi-Quelltext
1:
Case (Sender as TCheckbox).Tag of					

user profile iconToastbrotbaby hat folgendes geschrieben:
dann wieder bei dem
ausblenden Delphi-Quelltext
1:
(Sender as TCheckbox).enabled;					
da wird er nicht meckern, vermut das in Deinem Code den Du ausführst, das steht:
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Mi 08.02.06 11:47 
Verdammt es war mittags :oops: sry
Toastbrotbaby Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: 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*

ausblenden 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?

ausblenden Delphi-Quelltext
1:
procedure AllComboboxClick(Sender:TObject);					


das muss dann also eigentlich so aussehen?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98



BeitragVerfasst: 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

ausblenden 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

ausblenden Delphi-Quelltext
1:
2:
case n of 
1,2: Checkbox3.Visible := true;


schreiben oder????


Gruss
Toast
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: 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