AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mehreren RadioGroups eine Anweisung zuweisen

Ein Thema von moperswings · begonnen am 7. Feb 2007 · letzter Beitrag vom 9. Feb 2007
Antwort Antwort
moperswings

Registriert seit: 27. Mai 2004
Ort: Bad Sooden-Allendorf
240 Beiträge
 
Delphi 6 Professional
 
#1

Mehreren RadioGroups eine Anweisung zuweisen

  Alt 7. Feb 2007, 15:06
Hallo,

ich habe in einem TabSheet mehrere Radiogroups mit z.B. je 3 Items die angeklickt werden müssen, zum einem brauche ich das Ergebnis und Exceptions möchte ich vermeiden, wenn ich den Kram speichere. Deshalb ist der Button, mit dem ich weiter zu meinem nächsten Tabsheet klicke auf unsichtbar eingestellt bis alles angeklickt ist! Mein Code:
Delphi-Quellcode:
procedure Radiogroup1
begin
   case Radiogroup1.itemindex of
      0: begin button1.visible := true; end;
      1: begin button1.visible := true; end;
      2: begin button1.visible := true; end;
    end;
end;

nächste Radiogroup ...
Da ich aber viele Radiogroups habe, ist mir das zu umständlich und zu viel unübersichtlicher Code!
Gibt´s eine Möglichkeit, die Radiogroups innerhalb eines TabSheets zusammen zu fassen oder muss jede Komponete für sich behandelt werden?

Hoffe, Ihr könnt mir helfen
moperswings
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Mehreren RadioGroups eine Anweisung zuweisen

  Alt 7. Feb 2007, 15:28
Benutze schleifen, dass macht den Code schon mal kürzer.

Gruß oki
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#3

Re: Mehreren RadioGroups eine Anweisung zuweisen

  Alt 7. Feb 2007, 15:36
Ich bin mir nicht sicher, ob ich Dich richtig verstehe. Eine Möglichkeit wäre, einen einheitlichen EventHandler für alle RadioGroups einer TabPage festzulegen:
Delphi-Quellcode:
procedure TabPage1_RadioGroupsClick(Sender: TObject)
begin
  button1.visible := (RadioGroup1.ItemIndex >= 0)
                 and (RadioGroup2.ItemIndex >= 0)
                 and (RadioGroup3.ItemIndex >= 0);
end;
Das kann noch erweitert werden mit einer Regelung für das ganze PageControl:
Delphi-Quellcode:
procedure PageControl_RadioGroupsClick(Sender: TObject)
var ActualPage: TTabSheet;
    i0: int;
    Result: bool;
    btnWeiter: TButton;
begin
  ActualPage := (Sender as TPageControl).ActivePage;
  Result := false;
  btnWeiter := nil;
  // alle Controls der aktiven Seite durchgehen
  for i0 := 0 to ActualPage.Controls.Count - 1
  do begin
    // wenn es sich um eine RadioGroup handelt, dann ItemIndex prüfen
    if ActualPage.Controls[i0] is TRadioGroup
    then Result := Result and ((ActivePage.Controls[i0] as TRadioGroup).ItemIndex >= 0)
    else begin
      if ActualPage.Controls[i0] is TButton
      then begin
        if (ActualPage.Controls[i0] as TButton).Caption = 'Weiter'
        then btnWeiter := ActualPage.Controls[i0] as TButton;
      end;
    end;
  end;
  // Ergebnis zuordnen
  btnWeiter.visible := Result;
end;
Wenn die Maßnahmen nicht klar sind, bitte in der Hilfe nachschlagen; danach kann ich es noch erläutern.

Viel Erfolg! Jürgen

/Edit: Das zweite Verfahren habe ich mit der Prüfung des Buttons noch verbessert. Siehe die Erläuterungen in #5.

PS. Ohne Gewähr - siehe meine Signatur.
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
moperswings

Registriert seit: 27. Mai 2004
Ort: Bad Sooden-Allendorf
240 Beiträge
 
Delphi 6 Professional
 
#4

Re: Mehreren RadioGroups eine Anweisung zuweisen

  Alt 7. Feb 2007, 16:29
Hallo Jürgen,

der erste Vorschlag hat den Nachteil, dass der Button angezeigt wird, nachdem ein Wert gleich in der ersten RadioGroup angeklickt wurde.

Beim Zweiten gibt es zu viele Fehlermeldungen, mit denen ich im Moment nichts anfangen kann.
Ich muss mal sehen, ob ich aus Deinen Vorschlägen was zusammenbauen kann.

Danke für die Ideen und Grüsse, moperswings
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#5

Re: Mehreren RadioGroups eine Anweisung zuweisen

  Alt 7. Feb 2007, 17:46
Zitat von moperswings:
der erste Vorschlag hat den Nachteil, dass der Button angezeigt wird, nachdem ein Wert gleich in der ersten RadioGroup angeklickt wurde.
Das kann so nicht stimmen (vorausgesetzt, alle RadioGroups werden mit ItemIndex -1 initialisiert). Mein Code sagt: Der Button wird sichtbar, wenn in der ersten RadioGroup UND in der zweiten UND in der dritten (für Dich: UND in jeder weiteren) ein Element ausgewählt wurde.

Zitat von moperswings:
Beim Zweiten gibt es zu viele Fehlermeldungen, mit denen ich im Moment nichts anfangen kann.
Ich muss mal sehen, ob ich aus Deinen Vorschlägen was zusammenbauen kann.
Deshalb sagte ich ja: Untersuche die verwendeten Methoden mit der OH. Jürgen

/Edit: Beim zweiten Weg hatte ich vor allem eine Klammer vergessen. Erläuterungen zu diesem Verfahren:
  • Gesucht wird als Result der Status aller RadioGroups.
  • Sender ist immer eine RadioGroup, kein TabSheet.
  • Gesucht wird das aktuelle TabSheet. Ich muss also das übergeordnete Control benutzen.
  • Alle Controls dieses TabSheets werden geprüft.
  • Wenn es sich um eine RadioGroup handelt, wird dessen Status dem Gesamtergebnis hinzugefügt.
  • Wenn es sich um einen Button handelt und dieser die gewünschte Beschriftung enthält, ist es der, der abschließend freigegeben wird.
  • Nach Abschluss der Prüfungen kann das Ergebnis für den Button genutzt werden.
Ich habe das Verfahren in #3 korrigiert und die Registrierung des Buttons eingebaut.

Zusatzbemerkung 1: Diese Prozedur wurde jetzt so umfangreich, dass sie besser in eine eigene Prozedur ausgelagert werden sollte. Dann kann sie auch einfacher von verschiedenen TabSheets aus aufgerufen werden.

Zusatzbemerkung 2: In solchen Fällen gefällt mir Button.Enabled besser als Button.Visible, weil der Anwender dann direkt sieht, dass sich noch etwas ändern kann.

Viel Erfolg! Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
moperswings

Registriert seit: 27. Mai 2004
Ort: Bad Sooden-Allendorf
240 Beiträge
 
Delphi 6 Professional
 
#6

Re: Mehreren RadioGroups eine Anweisung zuweisen

  Alt 8. Feb 2007, 09:52
Hallo,

hast Du den Code von dem ersten Teil ausprobiert?
Bei mir wird der Button nicht angezeigt!!
Am Button habe ich nur visible auf false gesetzt, in den RadioGroups stehen nur die Items drin.
Müssen irgendwelche Ereignisse eingestellt werden?
Könnte ich irgendetwas ganz triviales falsch gemacht oder eingestellt haben?
Liegts an den Delphi-Versionen?
Ich seh´s nicht!

Edit/
Danke für die Tipps für den zweiten Teil.
Den muss ich jetzt aber nochmal durcharbeiten!

Vielen Dank und Grüsse, moperswings
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#7

Re: Mehreren RadioGroups eine Anweisung zuweisen

  Alt 8. Feb 2007, 10:03
Zitat von moperswings:
hast Du den Code von dem ersten Teil ausprobiert?
Bei mir wird der Button nicht angezeigt!!
Am Button habe ich nur visible auf false gesetzt, in den RadioGroups stehen nur die Items drin.
Müssen irgendwelche Ereignisse eingestellt werden?
Könnte ich irgendetwas ganz triviales falsch gemacht oder eingestellt haben?
Meine Lösungen sind gedacht als Ereignis OnClick einheitlich für alle RadioGroups: beim ersten Vorschlag nur innerhalb eines TabSheets, beim zweiten Vorschlag für das gesamte TabControl.

Nein, ich habe nichts ausprobiert - siehe Signatur. Mein erster Vorschlag kann nicht falsch sein; allenfalls fallen mir Tippfehler bei der Übernahme des Codes ein, und es müssen alle RadioGroups aufgeführt werden. Aber Voraussetzung ist natürlich (Zusammenfassung früherer Hinweise):
  • ItemIndex = -1 als einheitliche Vorgabe
  • durch einen Click wird daraus automatisch >= 0
  • Jede RadioGroup erhält die betreffende Prozedur als Ereignisbehandlung für OnClick - ganz wichtig.
Gruß Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
moperswings

Registriert seit: 27. Mai 2004
Ort: Bad Sooden-Allendorf
240 Beiträge
 
Delphi 6 Professional
 
#8

Re: Mehreren RadioGroups eine Anweisung zuweisen

  Alt 8. Feb 2007, 10:28
Ich hab´s!

1. Ich habe nicht alle RadioGroups mit einbezogen!
2. Ich habe nicht die Ereignisse gesetzt!
3. Ich konnte auch gar keine Ereignisse setzen, weil ich mir während des Ausprobierens meine Methoden gelöscht habe!
Musste also kurz alles neu machen und dann hat´s geklappt!

Deinen zweiten Vorschlag muss ich nochmal durcharbeiten, vor allem, weil es mich interessiert, wie man Aufgaben besser zusammen fassen kann.

Vielen Vielen Dank für Deine Hilfe und Deine Mühen!

moperswings
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#9

Re: Mehreren RadioGroups eine Anweisung zuweisen

  Alt 9. Feb 2007, 14:24
Hallo,

Zitat von moperswings:
...
weil es mich interessiert, wie man Aufgaben besser zusammen fassen kann
...
Eine ähnliche Variante, etwas kürzer:
Die Tag-Eigenschaft der Tabsheets wurde im OI auf die Anzahl der RadioGroups gesetzt. MyRadioGroupClick ist allen RadioGroups auf den betreffenden Tabsheets zugewiesen. Solange Tabsheet.Tag noch > 0 ist wird runtergezählt, ist 0 erreicht wird der Button aktiviert.
Delphi-Quellcode:
procedure TForm1.MyRadioGroupClick(Sender: TObject);
var z : Integer;
begin
  with TRadioGroup(Sender) do
    if Tag = 0 then//damit nicht doppelt gezählt wird
      begin
      Tag := 1;
      with Parent do //= TabSheetX oder PanelX oder Form ...
        if Tag > 0 then //ab hier TabSheetX.Tag
          begin
          Tag := Tag-1;
          if Tag = 0 then
            for z := 0 to ControlCount - 1 do
              if Controls[z] is TButton then
                if (TButton(Controls[z]).Caption = '&Weiter') or
                   (TButton(Controls[z]).Caption = '&Fertigstellen') then
                  TButton(Controls[z]).Enabled:= True;
          end;
      end;
end;
Durch die Benutzung der Tag-Eigenschaften, muss man nicht mehr bei jedem RadioGroupClick alle Controls durchlaufen.


Den Code kann man noch weiter verbessern, indem man den Kern-Code auslagert(wie schon von Jürgen Thomas erwähnt) und auch andere Controls in eine Überprüfung mit einschließt.
Im Beispiel wird sichergestellt das CheckListBoxen mindestens ein Item gecheckt haben, bevor der Button aktiviert wird.

Delphi-Quellcode:
//Parent.Tag = Anzahl Radiogoups und ChecklistBoxen
procedure TForm1.CheckActivate(aWinControl: TWinControl;blOptionOk: Boolean);
var z : Integer;
begin
  with aWinControl do //aWinControl = TabSheetX oder PanelX oder Form ...
    begin
    if blOptionOk then
      Tag := Tag-1
      else
        Tag := Tag+1;
    if (Tag = 0) or (not blOptionOk) then
      for z := 0 to ControlCount - 1 do
        if Controls[z] is TButton then
          if (TButton(Controls[z]).Caption = '&Weiter') or
             (TButton(Controls[z]).Caption = '&Fertigstellen') then
            TButton(Controls[z]).Enabled:= Tag = 0;
    end;
end;

procedure TForm1.MyRadioGroupClick(Sender: TObject);
var z : Integer;
begin
  with TRadioGroup(Sender) do
    if Tag = 0 then//damit nicht doppelt gezählt wird
      begin
      Tag := 1;
      CheckActivate(Parent,True);//TRadioGroup(Sender).Parent
      end;
end;

procedure TForm1.MyCheckListBoxClickCheck(Sender: TObject);
var bl : Boolean;
begin
  with TCheckListBox(Sender) do
    if Checked[ItemIndex] then
      begin
      Tag := Tag + 1;
      if Tag = 1 then//mindestens ein Item gechecked
        CheckActivate(Parent,True);//TCheckListBox(Sender).Parent
      end
      else
        begin
        Tag := Tag - 1;
        if Tag = 0 then
          CheckActivate(Parent,False);
        end;
end;

Wen man dann noch sicherstellt das der Button in Controls[x] den Index 0 hat,
dann kann man auch auf die Schleife zur Suche des Buttons verzichten.
Dann noch ein Hilfs-Array und einige Operationen mit Boolean, dann sieht das Ergebnis so aus:
Delphi-Quellcode:
const blArr : Array [Boolean] of ShortInt = (1,-1);
//...
//Parent.Tag = Anzahl Radiogoups und ChecklistBoxen
procedure CheckActivate(aWinControl: TWinControl;blOptionOk: Boolean);
begin
  with aWinControl do //= TabSheetX oder PanelX oder Form ...
    begin
    Tag := Tag + blArr[blOptionOk];// +1 oder -1
    if (Tag = 0) or (not blOptionOk) then
      TButton(Controls[0]).Enabled := Tag = 0;
    end;
end;

procedure TForm1.MyRadioGroupClick(Sender: TObject);
begin
  with TRadioGroup(Sender) do
    if Tag = 0 then//damit nicht doppelt gezählt wird
      begin
      Tag := 1;
      CheckActivate(Parent,True);//TRadioGroup(Sender).Parent
      end;
end;

procedure TForm1.MyCheckListBoxClickCheck(Sender: TObject);
begin
  with TCheckListBox(Sender) do
    begin
    Tag := Tag + blArr[not Checked[ItemIndex]];//+1 oder -1
    if Tag <= 1 then//bei 1 oder 0 reagieren
      CheckActivate(Parent,Tag = 1);
     end;
end;
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:53 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