Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TRadioButton zur Laufzeit ändern (https://www.delphipraxis.net/138838-tradiobutton-zur-laufzeit-aendern.html)

Schwedenbitter 18. Aug 2009 12:47


TRadioButton zur Laufzeit ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe schon die Forensuche und das Internet bemüht. Fündig geworden bin ich aber nicht; jedenfalls haben die Tipps bei mir nicht geholfen.
Ich habe in meinem Programm 4 RadioButtons in einem Setup-Formular (Aufruf über ShowModal). Separiert sind die mittels zweier unsichtbarer TPanels. Dort sollen natürlich die bestehenden Werte vor dem Aufruf eingetragen und die geänderten Ausgelesen werden. Aber egal was ich mache, es klappt einfach nicht. Ich möchte auch nicht extra wegen der Radiobuttons eine RadioGroup anlegen müssen. Das würde bei dem schlanken Aussehen auch sehr unschön rüberkommen.
Ich habe mal den Quellcode angefügt.

Gruß und Dank für Hinweise, Alex

angos 18. Aug 2009 13:29

Re: TRadioButton zur Laufzeit ändern
 
Zitat:

[..]Ich habe in meinem Programm 4 RadioButtons in einem Setup-Formular (Aufruf über ShowModal). Separiert sind die mittels zweier unsichtbarer TPanels. Dort sollen natürlich die bestehenden Werte vor dem Aufruf eingetragen und die geänderten Ausgelesen werden. Aber egal was ich mache, es klappt einfach nicht[..]

Hi,


ich weis leider absolut nicht was du meinst. Was genau möchtest du erreichen und wie versuchst du das? Das geht aus deinem Text leider nicht hervor

Gruß
Ansgar

Schwedenbitter 18. Aug 2009 14:19

Re: TRadioButton zur Laufzeit ändern
 
Zitat:

Zitat von angos
Hi,
ich weis leider absolut nicht was du meinst. Was genau möchtest du erreichen und wie versuchst du das? Das geht aus deinem Text leider nicht hervor

Hallo Ansgar,

ich Habe ein Hauptformular, das u.a. einem SpeedButton1 "Setup" enhält. Dann habe ich ein weiteres Formular mit den TRadioButtons. Wenn ich nun auf Setup klicke, dann sollen die TRadioButtons auf dem Setup-Formular bestückt werden. Es soll das Fenster geöffnet werden und nach dem Schließen die (geänderten) Einstellungen übernommen.

So sieht der Code dazu aus:
Delphi-Quellcode:
Procedure TForm1.SpeedButton4Click(Sender: TObject);
Begin
   Setup.LabeledEdit1.Text:=  Verzeichnis;
   Setup.RadioButton1.Checked:=Exact;
   Setup.RadioButton3.Checked:=LongPlay;

   Setup.ShowModal;

   If Setup.Tag=1 Then
   Begin
      If Setup.LabeledEdit1.Text<>'' Then
         Verzeichnis:=Setup.LabeledEdit1.Text;
      Exact:=  Setup.RadioButton1.Checked;
      LongPlay:=Setup.RadioButton3.Checked;
   End;
End;
Das mit dem Bestücken des LabeledEdit klappt. Nur werden meine Zuweisungen an die RadioButtons völlig ignoriert.

Warum? Und wie bekomme ich das hin?

Ich hoffe, dass ich meine Fragestellung jetzt verständlicher gemacht habe.

Gruß, Alex

Lannes 18. Aug 2009 22:51

Re: TRadioButton zur Laufzeit ändern
 
Hallo,

ich vermute das bei der Anzeige des Formulars der Focus automatisch(ein Element bekommt immer den Focus) auf einen RadioButton gesetzt wird. Bekommt ein RadioButton den Focus wird die Eigenschaft Checked automatisch auf True gesetzt.

Teste mal folgendes:
Delphi-Quellcode:
Setup.LabeledEdit1.Text:=  Verzeichnis;
Setup.LabeledEdit1.SetFocus; //<----- !
Setup.RadioButton1.Checked:=Exact;
Setup.RadioButton3.Checked:=LongPlay;

Schwedenbitter 19. Aug 2009 02:16

Re: TRadioButton zur Laufzeit ändern
 
Zitat:

Zitat von Lannes
Hallo,

ich vermute das bei der Anzeige des Formulars der Focus automatisch(ein Element bekommt immer den Focus) auf einen RadioButton gesetzt wird. Bekommt ein RadioButton den Focus wird die Eigenschaft Checked automatisch auf True gesetzt.

Teste mal folgendes:
Delphi-Quellcode:
Setup.LabeledEdit1.Text:=  Verzeichnis;
Setup.LabeledEdit1.SetFocus; //<----- !
Setup.RadioButton1.Checked:=Exact;
Setup.RadioButton3.Checked:=LongPlay;

Hallo,

der Focus war ganz normal beim ersten Element: In meinem Fall LabeledEdit1. Das SetFocus bringt übrigens eine Exception, da das Fenster nicht angezeigt ist. Die Idee ist gut, klappt aber somit nicht.

Ich habe jetzt eine unschöne Lösung gefunden. Ich habe festgestellt, dass sich die TRadioButtons im geöffneten Fenster sehr wohl bearbeiten lassen. Ich habe daher mein Setup-Formular um entsprechende Eigenschaften erweitert. Vor dem Aufruf weise ich denen Werte zu.
Bei OnShow werden die Werte dann übernommen und den TRadioButtons zugewiesen. Bei Close muss ich diesen Weg dann wieder umgekehrt gehen. Nach der Rückgabe des Focus ans Hauptformular lese ich dann die Werte wieder aus. Nicht schön, sehr umständlich aber es funktioniert.

Falls jemand eine elegantere Methode kennt: Bitte hier posten. Ich lerne gern dazu.

Gruß, Alex

sx2008 19. Aug 2009 03:57

Re: TRadioButton zur Laufzeit ändern
 
Du machst da seltsame Sachen:
Delphi-Quellcode:
Setup.ShowModal;
If Setup.Tag=1 Then
begin
   ...
Das geht auch viel schöner:
Delphi-Quellcode:
if Setup.ShowModal = mrOK then // Benutzer hat auf OK-Button geklickt
begin
   ...

Zoot 19. Aug 2009 08:46

Re: TRadioButton zur Laufzeit ändern
 
Du setzt beim Schließen deines Unterformulars alle Variablen zurück.
Dann brauchst du dich nicht wundern, wenn sie danach sich immer gleich verhalten.
Deine "FormClose"-Routine ist sowieso überflüssig.

stahli 19. Aug 2009 10:25

Re: TRadioButton zur Laufzeit ändern
 
Ich hatte das Problem hier auch schon einmal angesprochen.

Die Komponente erzteugt einen "Click" wenn sie gezeichnet wird und den Fokus hat. Beim Schließen des Formulars sollte man also den Fokus auf eine andere Komponente setzen damit das Problem beim nächsten Öffnen nicht wieder auftritt. Ist aus meiner Sicht schlampig programmiert...

Stahli

Schwedenbitter 19. Aug 2009 18:36

Re: TRadioButton zur Laufzeit ändern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wie ich schon geschrieben hatte, habe ich das Problem zwischenzeitlich gelöst. Den Tip mit der Verwendung der Tag(s) hatte ich irgendwo mal gelesen. Die Verwendung von ModalResult ist wohl "sauberer" und wurde daher von mir sofort dankbar umgesetzt.

Mein Programm ist (fast) fertig. Ich habe nur ein Problem, dessen Lösung ich nicht finden kann. Ich zeige ein paar Sachen über wechselnde Labels an.
Ab der zweiten Seite gibt es aber immer Probleme, die ich mir nicht erklären kann. Wenn ich auf Seite zwei die Labels mit "[000/00:00:00]" verlasse, werden die zu "0%". Auf der Dritten Seite wird dann die 4. Spalte mit "(0)" zu "0%".
Wenn ich den Aufruf von .. in Procedure TForm1.AllMouseLeave(Sender: TObject); auskommentiere, sehe ich zwar die Werte nicht mehr, aber ich habe auch nicht diese komischen Probleme. In der Procedure TForm1.Prozent(Maximum: Int64); schreibe ich aber weder in die TLabels der 3. noch der 4. Spalte etwas rein. :gruebel:

Ich bin so kurz davor und bekomme es nicht gebacken! :wall:

stahli 19. Aug 2009 18:43

Re: TRadioButton zur Laufzeit ändern
 
"0%" stammt bestimmt nicht von Delphi...
Sicher übergibst Du irgendwie die falschen Labels an Deine Funktion.
Schreib doch mal eine zusätzliche Angabe (die Zeit oder den Labelnamen) mit in deiner Prozent-Funktion in die Labels.
Dann kommst Du dem Fehler sicher auf die Schliche...

NickelM 20. Aug 2009 03:54

Re: TRadioButton zur Laufzeit ändern
 
Hmmmm...nun ja ich hab grad mal geknobbelt

Stimmt nicht mehr:
Das Lustige ist bei mir funkts nur bei der 2 Seite nicht da wird aus der Zeit dummerweise 0%
Wenn ich in MouseLeave die Prozent Procedure auskomentiere gehts...
Aber dummerweise steht ja nichts in der Prozent Procedure ja nichts mit Zeit ändern...
Wenn ich aber in Prozent Procedure als Test Zeit auf deinen "Reset" Wert setez gehts auch wieder....
Sehr merkwürdig
Das komsiche ist ich hab keine Ahnung warum :gruebel: :gruebel: :gruebel: :gruebel: :gruebel:


Funkten tuts auch wenn du MouseMove bei jeder Komponente machst...wenn dan aber auf den Captionbereich des Fensters gehts gehts wieder net mehr.... :gruebel: :gruebel:

Also ich bin echt überfordert :roll: :roll:

Vll. konnte ich dir auch ein bischen helfen wo der Fehler liegt...


Tut mir leid echt wollte helfen bin es mehre mal durchgegangen, eigentlich darf er das garnet ändern :wall: :wall:

EDIT:
Ich hab dein Fehler gefunden :mrgreen: :mrgreen:
Delphi-Quellcode:
Procedure TForm1.Prozent(Maximum: Int64);
Var
   I,J         : Integer;
Begin
   If (Maximum=0) Or (Threads>0) Then Exit;
   For I:=00 To 07 Do
   Begin
      If Benutzer.Count>(Anzeige + I) Then
      Begin
         J:=100 * Laenge[Anzeige + I] Div Maximum;
         If J>999 Then
            Prozente[I].Caption:='>999%' // du hattest hier Anzeige + 1 so und dein Array von Labels ändert sich doch net xD bei +10 hattest du 11 das konnte er net finden und hatt anscheinend das label von der Zeit genohmen
         Else
            Prozente[I].Caption:=FormatFloat('0,',J)+'%'; //hier genauso
      End;
   End;
End;
Ich hoffe es war diese Fehler..

Mir ist noch aufgefallen, dass du keine 10 Labels mit der Größe deines Fenster zur Zeit hinbekommst..zumindest bei meiner Auflösung..Bei mir waren es nur 8, das heist du musst deine Berechnungen einwenig anpassen xD


Viel Spass beim weiter machen

Gruß NickelM

Schwedenbitter 20. Aug 2009 11:06

Re: TRadioButton zur Laufzeit ändern
 
Zitat:

Zitat von NickelM
Delphi-Quellcode:
Procedure TForm1.Prozent(Maximum: Int64);
Var
   I,J         : Integer;
Begin
   If (Maximum=0) Or (Threads>0) Then Exit;
   For I:=00 To 07 Do
   Begin
      If Benutzer.Count>(Anzeige + I) Then
      Begin
         J:=100 * Laenge[Anzeige + I] Div Maximum;
         If J>999 Then
            Prozente[I].Caption:='>999%' // du hattest hier Anzeige + 1 so und dein Array von Labels ändert sich doch net xD bei +10 hattest du 11 das konnte er net finden und hatt anscheinend das label von der Zeit genohmen
         Else
            Prozente[I].Caption:=FormatFloat('0,',J)+'%'; //hier genauso
      End;
   End;
End;

Genau das war es, DANKE! :cheers:
Ehrlich gesagt hätte ich aber erwartet, dass spätestens der Compiler eine Bereichsüberschreitung meldet. Ist ja immerhin kein offenes Array. Mir ist klar, dass man nicht mit der Methode trial and error programmieren sollte. Aber (1) irren ist menschlich, (2) schreibe ich meistens nachts und (3) wäre es mir bei einer Fehlermeldung eher aufgefallen.

Könntest Di mir bitte wegen der Anzahl der Labels bei Deiner Auflösung mal einen Screenshot per PM zuschicken. Das Programm ist eigentlich nur für mein Büro gedacht. Hier sind wir 6 Leute. Theoretisch komme ich nicht auf die 2., 3. etc. Seite. Ich finde es nur gemein, dass Olympus ein teures Diktiersystem verkauft und die Software keine statistischen Auswertungen möglich macht. Also mache ich es selber. Evtl. packe ich es aber auf meine Homepage für andere "Olympus-Geschädigte". Falls ich das kann, würde ich es dann anpassen.

Gruß und nochmals Danke auch für's Testen, Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz