Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme beim zuweisen von StringList zu RadioButton (https://www.delphipraxis.net/63167-probleme-beim-zuweisen-von-stringlist-zu-radiobutton.html)

allshoot 14. Feb 2006 20:02


Probleme beim zuweisen von StringList zu RadioButton
 
Hi Leute. :-)
Bin absoluter Anfänger in Sachen Programmierung und lerne es jetzt in meiner Ausbildung.
Ich habe da 'ne ganze Menge Frage, aber hier erstmal die erste:

Ich habe in einem Formular ein Array[0..4] of TRadioButton

Nun möchte ich einem Radiobutton einen string aus einer Stringlist zuweisen.
Ich habe folgendes (nur eins von vielen) probiert:

RbAntw[4].caption := (FragenList.Strings[6]);

Wenn ich das Programm starte, dann gibt es erstmal keine Fehlermeldung, jedoch wenn das Programm an genau diese Stelle kommt, gibt er einen Laufzeitfehler aus.

Wie kann ich es anstellen, dass ich den Text an einer bestimmten Stelle in den RadioButton laden kann?

Vielen Dank im Voraus
allshoot

malo 14. Feb 2006 20:06

Re: Anfänger sucht....
 
Herzlich Willkommen in der Delphi-PRAXiS! :party: :firejump:
hast du eigentlich Instanzen der TRadioButtons erzeugt? Also ein
Delphi-Quellcode:
RbAntw[4] := TRadioButton.Create(Form1);
?

edit: :oops:

Die Muhkuh 14. Feb 2006 20:07

Re: Anfänger sucht....
 
Zitat:

Zitat von malo
hast du eigentlich Instanzen der TRadioButtons erzeugt? Also ein
Delphi-Quellcode:
RbAntw[4].Create(Form1);
?

*autsch* ;-)

Delphi-Quellcode:
RbAntw[4] := TRadioButton.Create(Form1);

malo 14. Feb 2006 20:10

Re: Anfänger sucht....
 
Zitat:

Zitat von Spider
*autsch* ;-)

:oops: Immer diese Flüchtigkeitsfehler :duck:
Ist jedenfalls korrigiert ;)

Alexander Roth 14. Feb 2006 20:10

Re: Anfänger sucht....
 
Was für einen Fehler gibt er denn aus?

allshoot 14. Feb 2006 20:12

Re: Anfänger sucht....
 
Hi, thx fürs antworten.
Ja habe ich, die RadioButtons werden auch, nachdem ich bei ihnen ein Caption von Hand zugewiesen habe, im Formular angezeigt, ich kann sie anwählen, wenn checked = true ist auch den Inhalt abspeichern.
Geht alles, aber das zuweisen eines Strings aus einer StringList geht einfach nicht!?

allshoot

leddl 14. Feb 2006 20:12

Re: Anfänger sucht....
 
Zitat:

Zitat von allshoot
RbAntw[4].caption := (FragenList.Strings[6]);

Wenn ich das Programm starte, dann gibt es erstmal keine Fehlermeldung, jedoch wenn das Programm an genau diese Stelle kommt, gibt er einen Laufzeitfehler aus.

Zum ersten: Editiere deinen Post und gib dabei dem Thread einen aussagekräftigen Titel.
Zum zweiten: Herzlich willkommen in der DP! :dp:
Zum dritten (und damit mehr in Richtung Problemlösung :mrgreen:):
Es wäre eventuell hilfreich, wenn du die Fehlermeldung mal postest. Hast du die Radiobuttons auch erstellt (wie bereits von malo und spider vermutet)? Beinhaltet die StringList überhaupt genug Werte? Der Index 6 zeigt ja auf das 7 Element der Stringlist (0-basiert), kann es vielleicht sein, daß du nur 6 Items drin hast?

//Edit: Ok, das mit dem Erstellen hat sich ja erledigt, aber was mir gerade auffällt: Probier es mal mit
Delphi-Quellcode:
RbAntw[4].caption := (FragenList.Items[6]);

Hador 14. Feb 2006 20:19

Re: Anfänger sucht....
 
Noch eine mögliche Fehlerquelle:

Ich nehme mal an, dass FragenList eine ListBox o.ä. ist.
Kann es sein, dass du dort auf den sechsten eintrag zugreifen willst?
Denn dann müsstest du Fragen.Items[5] nehmen, da das erste Item den Index 0 hat.

allshoot 14. Feb 2006 20:21

Re: Anfänger sucht....
 
Hallo,
FragenList ist eine StringList, in die ca 140 Items reingeladen wurden, das müsste eigentlich reichen.
Als Fehlermeldung gibt er folgendes aus:
Exception der Klasse EAccessViolation
Zugriffverletzung bei Adresse 004584D9 in Modul 'FuGerBed.exe' Lesen von Adresse 00000000'. Prozess wurde angehalten....

Hoffed dass das reiecht?

THX
allshoot

Khabarakh 14. Feb 2006 20:26

Re: Anfänger sucht....
 
Zeig bitte mal die Codezeilen, in denen du den Arrayinhalt zuweist. Ich verwette meine 2 Cent, die ich gerade auf dem Boden gefunden habe, darauf, dass dort der Fehler liegt.

allshoot 14. Feb 2006 20:37

Re: Anfänger sucht....
 
Ich schätze mal, dass du das hier sehen willst?!:
Delphi-Quellcode:
     
      RbAntw[0].caption := 'A';                    // --------------------
      RbAntw[1].caption := 'B';                    //
      RbAntw[2].caption := 'C';                    // Belegen der Antwortbuttons mit Text!!
      RbAntw[3].caption := 'D';                    //
      RbAntw[4].caption := (Fragenlist.strings[6]); //----------------------
Das zuweisen direkt mit einem String geht, jedoch das mit der Stringlist nicht?????
allshoot

ken_jones 14. Feb 2006 20:48

Re: Anfänger sucht....
 
Die Fragenlist hast du ebenfalls erzeugt?

Alexander Roth 14. Feb 2006 20:51

Re: Anfänger sucht....
 
Also:
- du initialisierst jeden TRadiobutton
- du initialisierst die Stringlist


wie schreibst du denn in die Stringlist? (vielleicht ist es ja das, unwahrscheinlich)

allshoot 14. Feb 2006 20:54

Re: Anfänger sucht....
 
Jap, sie wird geladen und ich kann sie so
Delphi-Quellcode:
    Fragenlist := TStringList.Create;
    Fragenlist.LoadFromFile('Fragen.txt');
    Fragenlist.SaveToFile('Fragen2.txt');
auch wieder abspeichern, ist dann eine genau Kopie davon.

Die Textdatei besteht dann aus einzelnen unterschielich langen Zeilen mit CR und LF.

allshoot

leddl 14. Feb 2006 20:54

Re: Anfänger sucht....
 
Ich möchte gerade noch einmal darauf hinweisen:
Zitat:

Zitat von leddl
Zum ersten: Editiere deinen Post und gib dabei dem Thread einen aussagekräftigen Titel.


allshoot 14. Feb 2006 20:56

Re: Anfänger sucht....
 
Editieren? Habe den Code doch als Code gekennzeichnet, noch mehr??
allshoot

Khabarakh 14. Feb 2006 21:00

Re: Anfänger sucht....
 
Zitat:

Zitat von allshoot
Ich schätze mal, dass du das hier sehen willst?!:

Ich habe die Zeilen gemeint, in denen du die Radiobuttons zuweist (RbAntwort[0] := ...), aber du kannst ja sonst auf sie zugreifen, daran sollte es doch nicht liegen. Versuchsweise kannst du auch mal die Bereichsprüfung anschalten.

leddl 14. Feb 2006 21:01

Re: Anfänger sucht....
 
Zitat:

Zitat von allshoot
Editieren? Habe den Code doch als Code gekennzeichnet, noch mehr??
allshoot

Es geht nicht um irgendwelchen Code (obwohl du den in deinem ersten Post natürlich auch noch in Delphi-Tags packen könntest :stupid:), sondern um den Titel dieses Threads. "Anfänger sucht..." ist nicht besonders aussagekräftig, aber genau das ist hier für einen Threadtitel Pflicht. ;) Also mach das doch bitte einfach. Wie Chäffe sagen würde: "Es wäre zuckersüß von dir, wenn du jetzt noch den Titel anpassen könntest" :mrgreen:

ken_jones 14. Feb 2006 21:02

Re: Anfänger sucht....
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Fragenlist : TStringlist;
  RbAntw    : Array[0..4] of TRadioButton;
  ii        : Integer;
begin
  For ii := Low(RbAntw) to High(RbAntw) do
    RbAntw[ii] := TRadioButton.Create(Form1);
  Fragenlist := TStringList.Create;
  Fragenlist.LoadFromFile('C:\Fragen.txt');
  Fragenlist.SaveToFile('C:\Fragen2.txt');
  try
    RbAntw[0].Caption := 'A';
    RbAntw[1].Caption := 'B';
    RbAntw[2].Caption := 'C';
    RbAntw[3].Caption := 'D';
    RbAntw[4].Caption := Fragenlist.Strings[6];
  finally
    Fragenlist.Free;
    For ii := Low(RbAntw) to High(RbAntw) do
      (RbAntw[ii] as TRadioButton).Free;
  end;
end;
Funktioniert einwandfrei...

allshoot 14. Feb 2006 21:11

Re: Probleme beim zuweisen von StringList zu RadioButton
 
Danke ken_jones,
aber nimmt er nicht an, kommt die selbe Fehlermeldung, wenn ich meinen Quellcode so anpasse.
Ist wohl etwas viel Text hier, aber ich poste mal das kompl. Ding:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    LbText: TLabel;
    Ikreuz: TImage;
    BtWeiter: TButton;
    LbName: TLabel;
    LbDstGrd: TLabel;
    LbEinheit: TLabel;
    LbTE: TLabel;
    EdName: TEdit;
    EdDstGrd: TEdit;
    EdEinheit: TEdit;
    EdTE: TEdit;
    LbPK: TLabel;
    EdPK: TEdit;
    procedure BtWeiterClick(Sender: TObject);
    procedure BtSchliessenClick(Sender: TObject);
    procedure Lb_change (name : TLabel; Beschriftung : string; l, t, w, h :integer);
   {procedure n_RB_create (Anzahl, L, T, Abstand, W, H : integer);}
    procedure AntwSpeichern;
    procedure FragenLaden;

  private


  public
    Zaehler:integer;
    FragenList : tStringlist;

  end;


var
  Form1: TForm1;
  RbAntw: array[0..4] of TRadioButton; // AntwortButtons erstellen
  Druckform : String;    // Abgelegte Prüfung speichern
  Pruefung : TStringList; // Zum abspeichern der eingegeben Daten


implementation


uses UFuGerBed2;

{$R *.DFM}


{---------------------------Laden des Fragekatalogs----------------------------}
procedure TForm1.Fragenladen;
  begin
    Fragenlist := TStringList.Create;
    Fragenlist.LoadFromFile('Fragen.txt');
    Fragenlist.SaveToFile('Fragen2.txt');

  end;


{---------------------------Abfragen der Radio-Buttons-------------------------}
procedure TForm1.AntwSpeichern;
var
  i : integer;
  begin
    Pruefung.Add(LbText.Caption);
    for i := 0 to 4 do
      begin
        If RbAntw[i].Checked then
          begin
            Pruefung.Add(RbAntw[i].caption);
            Pruefung.Add(' ');
            Pruefung.SaveToFile(Druckform);
          end;
      end;
  end;



{{---------------------------Erstellen von n RadioButtons----------------------
procedure TForm1.n_RB_create (Anzahl, L, T, Abstand, W, H : integer);
var
  NewButton : TRadioButton;
  i : integer;
begin
  For i:=0 to ((Anzahl)-1) do
    begin
      NewButton := TRadioButton.create(Form1);
      With NewButton Do
        begin
          Parent := Form1;
          Left := (L);
          Top := (T + (i * Abstand));
          Width := (W);
          Height := (H);
          Name := 'RbAntw' + inttostr(i+1);
          Caption := 'Antwort' + inttostr(i+1);
          visible := true;
        end;
    end;
end; }

{---------------------------Ändern eines beliebigen Labels---------------------}
procedure TForm1.Lb_change (name : TLabel; Beschriftung : string; l, t, w, h :integer);
  begin
    with name do
    begin
     left := (l);
     top := (t);
     width := (w);
     height := (h);
     caption := Beschriftung;
    end;
  end;

{---------------------------Schließen-Knopf------------------------------------}
procedure TForm1.BtSchliessenClick(Sender: TObject);
  begin
    AntwSpeichern;
    pruefung.Free;
    close;
  end;
{---------------------------Weiter-Knopf---------------------------------------}
procedure TForm1.BtWeiterClick(Sender: TObject);
var
  i : integer; // Zählvariable für die Schleifen

  begin

    if zaehler = 2 then
    begin
      AntwSpeichern;
      Lb_change(LbText, 'Frage 1.274: An welchem Schalter mache ich die Annanas?', 56, 48, 761, 137);
      RbAntw[0].caption := 'A'; // --------------------
      RbAntw[1].caption := 'B'; //
      RbAntw[2].caption := 'C'; // Belegen der Antwortbuttons mit Text!!
      RbAntw[3].caption := 'D'; //
      RbAntw[4].caption := 'E'; //----------------------
      Form2.visible := true;
      BtWeiter.Caption := 'Schließen'; //Text auf dem "Weiter"-Button ändern
      BtWeiter.OnClick := BtSchliessenClick; //Hier festlegen des neuen Handelns
    end;                                    // beim klicken auf den Button



    if zaehler=1 then   // Eingabeseite Name
    begin
      Druckform := ((EdName.Text) + '.txt');//Legt Namen der Datei fest
      Pruefung := TStringlist.Create;      // Erstellen eine TStringList
      try
        pruefung.Add(LbName.Caption + '      ' + EdName.Text);   //----------------
        pruefung.Add(LbDstGrd.caption + '    ' + EdDstGrd.Text); //
        pruefung.add(LbPK.caption + '        ' + EdPK.Text);     //
        pruefung.Add(LbEinheit.caption + '   ' + EdEinheit.Text); // Abspeichern der Inhalte
        pruefung.Add(LbTE.caption + EdTE.Text);                   // der Inhalte der Edit-Fenster
        pruefung.Add(' ');                                        //
        pruefung.Add(' ');                                        //
        pruefung.Add(' ');                                        //
        pruefung.SaveToFile(Druckform);                           //----------------
      finally
        {pruefung.Free;         // Löschen der TStringList}
      end;
      Lb_change(LbText, 'Frage', 56, 48, 761, 137); // Ändern eines beliebigen Labels
      LbText.Font.Style := [];
      LbName.free;                     //-------------------------
      EdName.free;                     //
      LbDstGrd.free;                   //
      EdDstGrd.free;                   //
      LbPK.free;                       //
      EdPK.Free;                       //Löschen der Eingabe-Felder
      LbEinheit.free;                  //
      EdEinheit.free;                  //
      LBTE.free;                       //
      EdTE.free;                       //-------------------------
      {----------Erstellen der Antwortbuttons----------}
      for i := 0 to 4 do
        begin
          RbAntw[i] := TRadioButton.create(Form1); //Erstellen des jeweiligen Buttons in Array[i]
          with RbAntw[i] do
            begin
              parent := Form1;      // Besitzer festlegen
              Left := 112;          // |
              Top := 220+ (i * 70); // |Größe und Position
              Width := 601;         // |festlegen!
              Height := 41;         // |
              Caption := 'Antw' + inttostr(i+1); // Angezeigter Text zu dem Button festlegen!
            end;
        end;

      inc(zaehler);
    end;



    if zaehler=0 then    //Startseite
    begin
      Lb_change(LbText, 'Bitte geben sie hier die geforderten Daten ein:', 172, 96, 513, 27); // Ändern eines beliebigen Labels
      LbText.Font.Style := [fsunderline]; // Text des Labels wird unterstrichen!!
      Ikreuz.free;                       // Bild mit dem Kreuz löschen
      LbName.Visible := true;        //----------------------------------------
      EdName.Visible := true;        //
      LbDstGrd.Visible := true;      //
      EdDstGrd.Visible := true;      //
      LbPK.visible := true;          // Labels + Edits der
      EdPK.Visible := true;          // Namensabfrage
      LbEinheit.Visible := true;     // sichtbar machen
      EdEinheit.Visible := true;     //
      LBTE.Visible := true;          //
      EdTE.Visible := true;          //----------------------------------------
      inc(zaehler);
    end;

  end;

end.
Vielleicht (oder bestimmt) erkennt einer den Bug.

THX

allshoot

ken_jones 14. Feb 2006 21:42

Re: Probleme beim zuweisen von StringList zu RadioButton
 
So wie ich aus den vorherigen Fragen schliesse wolltst du den folgenden Code aus dem aktuellen Source,
von:

Delphi-Quellcode:
if zaehler = 2 then
    begin
      AntwSpeichern;
      Lb_change(LbText, 'Frage 1.274: An welchem Schalter mache ich die Annanas?', 56, 48, 761, 137);
      RbAntw[0].caption := 'A'; // -------------------- 
      RbAntw[1].caption := 'B'; // 
      RbAntw[2].caption := 'C'; // Belegen der Antwortbuttons mit Text!! 
      RbAntw[3].caption := 'D'; // 
      RbAntw[4].caption := 'E'; //---------------------- 
//      Form2.visible := true;
      BtWeiter.Caption := 'Schließen'; //Text auf dem "Weiter"-Button ändern
      BtWeiter.OnClick := BtSchliessenClick; //Hier festlegen des neuen Handelns
    end;
auf

Delphi-Quellcode:
if zaehler = 2 then
    begin
      AntwSpeichern;
      Lb_change(LbText, 'Frage 1.274: An welchem Schalter mache ich die Annanas?', 56, 48, 761, 137);
      RbAntw[0].caption := 'A'; // -------------------- 
      RbAntw[1].caption := 'B'; // 
      RbAntw[2].caption := 'C'; // Belegen der Antwortbuttons mit Text!! 
      RbAntw[3].caption := 'D'; // 
      RbAntw[4].caption := Fragenlist.Strings[6]; //---------------------- 
//      Form2.visible := true;
      BtWeiter.Caption := 'Schließen'; //Text auf dem "Weiter"-Button ändern
      BtWeiter.OnClick := BtSchliessenClick; //Hier festlegen des neuen Handelns
    end;
ändern. Dann hats aber geknallt.
Wenn das so ist, dann liegts daran, dass vor dem Zuweisen die Stringlist hat eben doch nicht erstellt ist, denn dazu fehlt dann der Prozeduraufruf Fragenladen. Folgendes müsste dann also gehen:


Delphi-Quellcode:
    if zaehler = 2 then
    begin
      AntwSpeichern;
      FragenLaden;
      Lb_change(LbText, 'Frage 1.274: An welchem Schalter mache ich die Annanas?', 56, 48, 761, 137);
      RbAntw[0].caption := 'A'; // --------------------
      RbAntw[1].caption := 'B'; //
      RbAntw[2].caption := 'C'; // Belegen der Antwortbuttons mit Text!!
      RbAntw[3].caption := 'D'; //
      RbAntw[4].caption := FragenList.Strings[6] ; //----------------------
//      Form2.visible := true;
      BtWeiter.Caption := 'Schließen'; //Text auf dem "Weiter"-Button ändern
      BtWeiter.OnClick := BtSchliessenClick; //Hier festlegen des neuen Handelns
    end;

allshoot 14. Feb 2006 21:49

Re: Probleme beim zuweisen von StringList zu RadioButton
 
THX ken_jones,
so hat es gefunzt. :hello:
Ich hatte die Prozedur FragenLaden im Hauptprogramm aufgerufen, direkt nach Application.Run .
Die SL wurde geladen und auch wieder gespeichert, aber wieso war sie beim zuweisen zum RadioButton nicht verfügbar?

allshoot

ken_jones 14. Feb 2006 21:54

Re: Probleme beim zuweisen von StringList zu RadioButton
 
Nach Application.Run ?

Application.Run startet deine App (klingt logisch) und erst nach dem beenden der App gehts dort weiter. D.h. du hast die Stringlist beim beenden des Programmes erstellt, und zur Laufzeit war sie nicht vorhanden.

Wenn du sowas vor dem App Start machen willst, muss das VOR das Application.Run, oder auch in die Initialize Sektion.

Greets!

allshoot 14. Feb 2006 21:59

Re: Probleme beim zuweisen von StringList zu RadioButton
 
Ok,
habe es kapiert!
Danke an alle, die hier mitgeholfen haben!
Bis zum nächsten Beitrag!

allshoot


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:40 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