Autor Beitrag
Stread
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mi 18.02.09 17:56 
Wie kann ich es machen dass von 12 RadioButtons die ich auf ein Panel gesetzt habe 5 Stück anwählbar sind?
Parent? Neues Panel?
Im Moment ist nur 1 gleichzeitig anwählbar?
Danke für die Hilfe.


Zuletzt bearbeitet von Stread am Mi 18.02.09 19:52, insgesamt 1-mal bearbeitet
Dunkel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 682

Mac OS X Snow Leopard
Xcode 3.1
BeitragVerfasst: Mi 18.02.09 18:09 
Nimm Checkboxes! Ist eh Windows-konformer, der User ist nicht ganz so verwirrt als wenn er aufeinmal mehrere RadioButtons anwählen kann.

_________________
Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Mi 18.02.09 18:09 
Hallo,

wenn du alle möglichen Kombinationen zulasssen möchtest (also 5 aus 12) muss ich dich eldier enttäuschen: dafür sind Radioboxen nicht gemacht. Radioboxen sollen dem USer suggestieren, dass er nur eine Sache auswählen kann und nicht mehrere. Für letzteres sind Checkboxen da, die du auch auf eine bestimmte Anzahl beschränken kannst (zähler im Hintergrund und bei Überschreitung aktion ablehnen). Wenn du nicht alle Möglichkeiten zulassen möchtest, könntest du über Panels dafür sorgen, dass das ganze auch geht - allerdings vermute ich mal, dass du nicht letzteres meinst.
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mi 18.02.09 18:14 
Also ich glaube mehrere RadioButtons sind nicht möglich, das ist ja auch der Sinn.^^

Würde dann wie Dunkel schon sagte CheckBoxes nehmen.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mi 18.02.09 18:17 
Ich habe auch zuerst an Checkboxen gedacht aber bei diesen ist das Problem dass ich alle 12 auswählen kann. Ich will aber nur irgenwelche 5 auswählen. Wie gehts das?
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mi 18.02.09 18:20 
Meinst du etwa, die sollen alle ausgewählt werden, wenn eine Bedingung eintritt?

ausblenden Delphi-Quelltext
1:
CheckBox1.Checked := true;					

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mi 18.02.09 18:38 
Nein, ich will dass die Checkboxen z.B 1-12 heißen. Muss muss nun 5 (egal welche) von diesen Checkboxe anklicken damit es weiter geht. Erst wenn man 5 Checkboxen markiert hat geht es weiter.
Aber man darf auch nicht mehr anklicken können. Also man darf am ende nicht 7 markierte Checkboxen haben.
Im moment ist das Problem dass ich entweder nur eine Checkbox oder gleich alle 12 anklicken kann.
Ich möchte soetwas in der Art wie wenn 5 Checkboxen ausgewählt sind dass dann alle anderen nicht mehr anwählbar sind. Wenn man den Haken von einer bereits angewählten Checkbox wieder entfernt soll man wieder eine neue auswählen können.
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mi 18.02.09 18:42 
Wie wäre es denn mit If-Abfragen? :wink:

Und um zu verhindern eine 6 anzuwählen, einfach die nicht ausgewählten bei Visible auf False stellen.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Heiko
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3169
Erhaltene Danke: 11



BeitragVerfasst: Mi 18.02.09 18:46 
Bitte nicht Visible, sondern enable. Komponenten einfach ausblenden ist unschön ;).
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mi 18.02.09 18:47 
Ja stimmt, haste recht. Meinte ich doch auch. :roll:

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mi 18.02.09 19:51 
Aber wird der Code damit nicht unnötig groß? Ich müsste ja mit der if Abfrage klären ob Checkbox1 und Checkbox2 ...Checkbox12 markiert sind dann muss ich schauen dass nur 5 markiert sind (Wie gehts das am besten ohne dass ich alle Möglichen Kombinationen nenne?)
Wenn ich nun viel mehr Checkboxen hätte, wie soll das denn dann gehen?
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.02.09 20:06 
Wieso merkst Du Dir nicht einfach in einer privaten Form-Property, wieviele Checkboxen gerade Checked sind? Und Du kannst Dir einen globalen Handler für alle Checkboxen schreiben, der diese Property entsprechend setzt.
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mi 18.02.09 20:10 
Entschuldige aber das kapiere ich gerade nicht. Wie soll man so einen Handler machen? Bin noch Anfänger :oops:
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.02.09 20:21 
ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    ...
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    //Anzahl der aktuell angehakten Checkboxen
    FCheckCount: Cardinal;
    //Eventhandler für das OnClick aller Checkboxen
    procedure SetChecksEnabled(Sender: TObject);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i: Integer;
begin
  //zur Laufzeit Handler zuweisen
  for i := 0 to ControlCount-1 do
    if Controls[i] is TCheckbox then
      TCheckBox(Controls[i]).OnClick := SetChecksEnabled;
end;

procedure TForm1.SetChecksEnabled(Sender: TObject);
var i: Integer;
begin  
  if (Sender as TCheckBox).Checked then
    //Checkbox (Sender) angehakt
    begin
      //Zähler hochzählen 
      Inc(FCheckcount);
      //wenn mehr als 4
      if FCheckCount > 4 then
        //alle nicht angehakten deaktivieren
        for i := 0 to ControlCount-1 do
          if Controls[i] is TCheckbox then
            TCheckBox(Controls[i]).Enabled := TCheckBox(Controls[i]).Checked;
    end
  else
    //Checkbox (Sender) nicht angehakt
    begin
      //Zähler runterzählen
      Dec(FCheckcount);
      //diese Abfrage ist eigentlich unnötig, trotzdem mal dringelassen
      //wenn Zähler < 5
      if FCheckCount < 5 then
        //alle Checkboxen aktivieren
        for i := 0 to ControlCount-1 do
          if Controls[i] is TCheckbox then
            TCheckBox(Controls[i]).Enabled := True;
    end;
end;

end.


Wobei der Ausdruck Property hier falsch gewählt war, bei FCheckCount handelt es sich vielmehr um ein privates Feld ;)
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mi 18.02.09 20:52 
Danke. Allerdings habe ich noch ein paar Fragen wenn es recht ist.

Das ControlCount-1 in Zeile 35 und Controls in Zeile 36, dass wirkt sich auf alle Checkboxen aus wegen TCheckbox?
Wie kann das sein: if Controls[i] is TCheckbox then ? Wie ist Controls[i]=TCheckbox? Ist das immer so?
Bei Zeile 53 Ist TCheckbox(Controls[i]) Das sind alle möglichen Checkboxen?
Bei Zeile 44 wird gesagt dass der Sender nicht z.B. OnClick ist sonder die Checkbox?
Das Inc in Zeile 47 ist das gleiche wie wenn ich in einer Repeat Schleife immer x:=x+1; machen würde?


Sorry für das viele Gefrage.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 18.02.09 21:08 
Zu ControlCount und Controls ein Zitat aus der Hilfe zu Delphi 7:
Zitat:
Die Eigenschaft ControlCount gibt die Anzahl der untergeordneten Steuerelemente zurück.

Delphi-Syntax:

ausblenden Delphi-Quelltext
1:
property ControlCount: Integer;					


C++ Syntax:

__property int ControlCount = {read=GetControlCount, nodefault};

Beschreibung

Lesen Sie ControlCount, wenn nacheinander auf alle untergeordneten Steuerelemente dieses Steuerelements zugegriffen werden soll. Die untergeordneten Steuerelemente dieses Steuerelements sind im Eigenschaftsarray Controls aufgelistet.


ausblenden Delphi-Quelltext
1:
if Controls[i] is TCheckbox					

Hier frage ich ab, ob das aktuelle Control eine TCheckbox ist (könnte ja auch z.B. ein Button sein). Wenn dem so ist, weise ich dem Control (also der Checkbox) mit
ausblenden Delphi-Quelltext
1:
TCheckbox(Controls[i]).OnClick := SetChecksEnabled;					

den Eventhandler SetChecksEnabled zu. Das hat zur Folge, dass alle Checkboxen aus dem Controls-Array beim Klicken die Methode SetChecksEnabled ausführen. In dieser wiederum muss ich dann wissen, welches Control denn nun der Auslöser war, daher mache ich mit Sender as TCheckbox einen sog. Softcast. Und statt
ausblenden Delphi-Quelltext
1:
Inc(FCheckCount);					

hätte ich auch
ausblenden Delphi-Quelltext
1:
FCheckCount := FCheckCount + 1;					

schreiben können. Für Dec gilt das Gleiche andersherum.
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Mi 18.02.09 21:19 
Danke. Ich werde damit noch ein wenig rumspielen um es besser zu verstehen. Wenn ich noch Fragen habe melde ich mich wieder.
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Do 19.02.09 10:21 
Noch eine Frage dazu:
Wie kann ich einfach feststellen welche Checkbox ausgewählt wurde? Ich möchte die 5 Zahlen die mit der Checkbox ausgewählt wurden gerne einzeln mit anderen Zahlen vergleichen. Muss ich 12 mal überprüfen ob die Checkbox markiert ist? Dann weiße ich ihr einen Wert zu. z.B. Bei Checkbox3 x3:=3 und bei Checkbox11 x11:=11 ? Ich will ja die Zahlen einzeln haben. Wie finde ich dann raus welche 5 x'e größer 0 sind und welche Zahl sie haben?
Wahrschenlich geht es eh ganz anderst :lol:
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 19.02.09 10:32 
Du könntest die Tag-Eigenschaft der Checkboxen benutzen. Wenn du dort die entsprechenden Zahlen 1..12 einträgst, dann kannst du via (Sender as TCheckBox).Tag die Nummer der gerade geklickten CheckBox abfragen. Wenn du dann später diese Informationen brauchst, dann kannst du diese einfach in ein array[1..12] of Boolean eintragen. Dieses Array kannst du unter private in der Formulardeklaraton deklarieren.
Stread Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 188

Win 7
Delphi XE
BeitragVerfasst: Do 19.02.09 11:04 
Muss ich das jetzt 12 mal so eintragen?
ausblenden Delphi-Quelltext
1:
2:
3:
procedure TForm12.Button1Click(Sender: TObject);
if (Sender as TCheckbox).Tag=7 then
Zahl[7]=7


Wie bekomme ich denn nun die einzelnen Zahlen um sie mit anderen zu vergleichen?
Sorry aber ich kapiere das gerade nicht so wie du das meinst. Ein bisschen Quelltext würde ich sehr begrüßen wenn du nicht allzusehr beschäftigt bist. :oops: