Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Umgang mit RadioGroup (https://www.delphipraxis.net/91903-umgang-mit-radiogroup.html)

MarquiseDeSade 11. Mai 2007 16:28


Umgang mit RadioGroup
 
Hallo liebe Delphianer :-D

Finde das Forum hier klasse und habe auch schon diverse Themen durchsucht, aber leider keinen ähnlichen Fall entdecken könne. Ich bin seit ca. 1 Woche Delphi-Infiziert und benutze Zuhause Delphi 8, habe also nur Kenntnisse in TPW aber bin absoluter Anfänger in Delphi :wink:

Zu meinem Problem:

Ich möchte eine beliebige Zahlenfolge in einer Listbox ausgeben, wobei der User in der RadioGroup anklicken kann, wieviel Zahlen ausgegeben werden sollen. Ich könnte dieses mit meinem Wissen nur so realisieren:

Begin

case radioGroup2.itemindex of
0:Begin
fibo[1]:=StrToInt(edit1.text);
fibo[2]:=StrToInt(edit2.text);
for i:=3 to 5 do
Begin
fibo[i]:=fibo[i-1]+fibo[i-2];
end;
for i:=1 to 5 do
Begin
listbox1.Items.Add(IntToStr(fibo[i]));
end;

end;{of Begin 0}

Nur finde ich das sehr umständlich. Ich würde gern sowas basteln wie:

for i:=1 to Auswahl do
listbox1.Items.Add(IntToStr(fibo[i]));

Wie funktioniert das in Delphi, dass ich der Variable Auswahl mit den entsprechenden Wert der in der Listbox angeklickt wird,übergebe?

Gruß Tobias

shmia 11. Mai 2007 17:31

Re: Umgang mit RadioGroup
 
Ein RadioGroupBox ist ungeeignet, um eine Stückzahl vorzugeben.
Es wird zu viel Platz benötigt und erlaubt keine eigenen Eingaben.

Es gibt 2 sinnvolle Alternativen:
a.) TComboBox, der Items mit den voreingestellten Werten gefüllt ist. Trotzdem kann der Benutzer eigene Werte eingeben:
Delphi-Quellcode:
   auswahl := StrToInt(ComboBoxAnzahl.Text);
b.) TSpinEdit (auf Palettenseite "Beispiele")
Delphi-Quellcode:
auswahl := Round(SpinEditAnzahl.Value);

marabu 11. Mai 2007 17:40

Re: Umgang mit RadioGroup
 
Herzlich willkommen in der Delphi-PRAXiS, Tobias.

Das mit der angemessenen Auswahl der Controls für deine Benutzeroberfläche, das wird bestimmt noch. Ansonsten musst du einfach erkennen, dass durch die rekursive Definition der Fibonacci-Zahlen viel zu viele Berechnungen stattfinden, wenn du jede Zahl einzeln berechnest und dann in die ListBox einträgst. Hier hast du etwas zum Studieren:

Delphi-Quellcode:
function Fibonacci(i: cardinal; s: TStrings): cardinal;
begin
  if i = 0 then Result := 0
  else if i = 1 then Result := 1
  else Result := Fibonacci(i - 1, s) + Fibonacci(i - 2, s);
  if i >= s.Count then
      s.Add(IntToStr(Result));
end;

procedure TDemoForm.RadioGroupClick(Sender: TObject);
var
  s: TStrings;
begin
  s := ListBox.Items; // short name intro
  s.BeginUpdate;
  s.Clear; // nachgebessert ...
  with Sender as TRadioGroup do
    case ItemIndex of
      0: Fibonacci(0, s);
      1: Fibonacci(5, s);
      2: Fibonacci(10, s);
      3: Fibonacci(20, s);
    end;
  s.EndUpdate;
end;
Freundliche Grüße vom marabu

MarquiseDeSade 11. Mai 2007 18:02

Re: Umgang mit RadioGroup
 
Zitat:

Zitat von shmia
Ein RadioGroupBox ist ungeeignet, um eine Stückzahl vorzugeben.
Es wird zu viel Platz benötigt und erlaubt keine eigenen Eingaben.

Es gibt 2 sinnvolle Alternativen:
a.) TComboBox, der Items mit den voreingestellten Werten gefüllt ist. Trotzdem kann der Benutzer eigene Werte eingeben:
Delphi-Quellcode:
   auswahl := StrToInt(ComboBoxAnzahl.Text);
b.) TSpinEdit (auf Palettenseite "Beispiele")
Delphi-Quellcode:
auswahl := Round(SpinEditAnzahl.Value);

Ich habe das so im Programm verbaut:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var fibo:array[1..50] of longint;
    auswahl:integer;
    i:integer;

Begin
  auswahl:=StrToInt(ComboBox1.Text);
  ListBox1.Items.Clear;
    fibo[1]:=StrToInt(edit1.text);
    fibo[2]:=StrToInt(edit2.text);
      for i:=3 to 50 do
        Begin
          fibo[i]:=fibo[i-1]+fibo[i-2];
        end;
          for i:=1 to auswahl do
            Begin
            listbox1.Items.Add(IntToStr(fibo[i]));
            end;


end;
Nun erscheint die Fehlermeldung:is not a valid integer value. Man kann in der Combobox 5 Zahlen auswählen. Übernimmt dann die Variable auswahl den Wert der als Zahl ausgewählt wurde?

Apollonius 11. Mai 2007 19:29

Re: Umgang mit RadioGroup
 
Probiers mal mit Combobox1.items[combobox1.itemindex] statt Combobox1.text.
Hoffe geholfen zu haben
Apollonius

SirTwist 12. Mai 2007 12:10

Re: Umgang mit RadioGroup
 
Ein paar Tipps zu den vorherigen Lösungen:

Werte aus Textfeldern sollten nicht mit StrToInt umgewandelt werden. Besser ist
Delphi-Quellcode:
auswahl := StrToIntDef(ComboBox1.Text,auswahl); ComboBox1.Text := IntToStr(auswahl);
Beim normalen StrToInt() wird eine Exception ausgelöst, wenn der eingegebene Text nicht in eine Zahl umgewandlet werden kann. Die obige Zeile versucht, den Text in eine Zahl umzuwandeln. Wenn das nicht geht, wird der Vorgabewert übernommen, den man als zweiten Parameter angibt. Also hier: wenn eine Zahl eingegeben wurde, übernimm diese, ansonsten wird wieder der alte Wert genommen.

Danach wird das Textfeld nochmal neu gesetzt.

Wer es richtig schön machen möchte inkl. Fehlermeldung für den Anwender, sollte sich TryStrToInt() angucken:
Delphi-Quellcode:
if not TryStrToInt(ComboBox1.Text, auswahl) then begin
  MessageDlg('Würden Sie bitte freundlicherweise nur Zahlen eingeben, sonst komme ich durcheinander.'+#10#10+
             'Danke!', mtError, [mbOk], 0);
  exit;
end;
Auf Items[] sollte nicht ohne Prüfung zugegriffen werden, weil es auch dann wieder zu einer Exception kommen kann:

Delphi-Quellcode:
if (ComboBox1.ItemIndex >= 0) then str := Combobox1.items[combobox1.itemindex];
Das bringt hier aber eigentlich nichts, da die Items auch wieder Strings sind, die mit StrToIntDef umgewandelt werden müssen.

MarquiseDeSade 12. Mai 2007 12:26

Re: Umgang mit RadioGroup
 
Hallo :-D

Hab gleich mal folgendes übernommen...
Delphi-Quellcode:
auswahl := StrToIntDef(ComboBox1.Text,auswahl); ComboBox1.Text := IntToStr(auswahl);
Nun passiert folgendes:

Es taucht nun keine Fehlermeldung mehr. In der Listbox werden keine Zahlen ausgegebn und in der ComboBox springt der ausgewählte Wert (z.b.5) auf Null.

:?:

Apollonius 12. Mai 2007 12:29

Re: Umgang mit RadioGroup
 
Das hieße aber logischerweise, dass '5' keine Zahl ist. Hast du irgendwelche Leerzeichen oder sonstige andere Zeichen drin?

MarquiseDeSade 12. Mai 2007 12:42

Re: Umgang mit RadioGroup
 
Liste der Anhänge anzeigen (Anzahl: 3)
Also, hier im Anhang sind nochmal die Schritte von 1 -3:

Bild 1:

Ich wähle die Anzahl der Ausgabe aus.

Bild 2:

Zu sehen ist dort, die zwei Zahlen die als Startwerte der Folge benutzt werden sollen und die unter Bild 1 vorgenommene Auswahl.

Bild 3:

Die Auswahl von Bild 1 springt auf Null und die Textbox bleibt leer. :?:

Delphi-Quellcode:
unit FibuU;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Borland.Vcl.StdCtrls, Borland.Vcl.ExtCtrls,
  System.ComponentModel;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    ListBox1: TListBox;
    Label3: TLabel;
    Button2: TButton;
    Button3: TButton;
    ComboBox1: TComboBox;
    Label4: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.nfm}


procedure TForm1.Button1Click(Sender: TObject);
var fibo:array[1..50] of longint;
    auswahl:integer;
    i:integer;
Begin
auswahl := StrToIntDef(ComboBox1.Text,auswahl);
ComboBox1.Text := IntToStr(auswahl);
  ListBox1.Items.Clear;
    fibo[1]:=StrToInt(edit1.text);
    fibo[2]:=StrToInt(edit2.text);
      for i:=3 to 50 do
        Begin
          fibo[i]:=fibo[i-1]+fibo[i-2];
        end;
          for i:=1 to auswahl do
            Begin
            listbox1.Items.Add(IntToStr(fibo[i]));
            end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  ListBox1.Items.Clear;
end;


end.

DGL-luke 12. Mai 2007 12:47

Re: Umgang mit RadioGroup
 
ja, kannst du, sobald du eines hochgeladen hast hast du unten ein neues feld zum hochladen. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 Uhr.
Seite 1 von 2  1 2      

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