tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
1026
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    HarryXVI HarryXVI ist offline Mitglied Gold
    Registriert seit
    Apr 2008
    Beiträge
    108
    Möchte einen Taschenrechner programmieren, wobei man durch einen Button (BtMenge) und durch ein Editfeld (EdMenge) neue Zahlenfelder dazu nehmen kann.
    Es soll so aussehen, dass, wenn vorher zwei Editfelder für zwei Zahlen zu sehen waren, man durch die eingetippte Zahl in EditMenge bestimmen kann, wieviele Zahlen/Editfelder dazu kommen sollen. Ich habe versucht, dies mit einem bool-Array zu kreieren.

    Code :
    1
    
    Zahlen: array[1..3] of longbool;
    Das ist die Deklaration des Arrays

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    procedure TTaschenrechner.BtMengeClick(Sender: TObject);
    var i: Integer;
    begin
    Zahlen[1]:=EdZahl3.Visible;
    Zahlen[2]:=EdZahl4.Visible;
    Zahlen[3]:=EdZahl5.Visible;
    Menge := StrToInt(EdMenge.Text);
    for i:= 1 to Menge do Zahlen[Menge] := true;
    end;

    Dann habe ich die Eigenschaft "Visible", die bei denjenigen Editfeldern auf "false" steht (sind ja am Anfang unsichtbar), den einzelnen Array-Einheiten zugewiesen.
    Die for-Schleife soll von 1 bis zur angegebenen Menge zählen und jedes Mal ein entsprechendes Editfeld sichtbar machen (auf "true" setzen).
    Leider klappt das auf diese Weise nicht. Was sollte ich ändern?
     

  2. #2
    vop vop ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Beiträge
    676
    Problem ist, dass du zwar die Werte aus den Editkomponenten in ein Array kopiert hast, die Werte in diesem Array auch ändern kannst, das aber keine Auswirkungen auf die Editfelder hat.

    Um die Editfelder in der Schleife anzusprechen, empfiehlt es sich etwa so:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var
       Comp : TComponent;  // Verweis auf Komponente
       Edit : TEdit;               // Verweis auf das gesuchte EditFeld
    begin
     .....
      for i:=1 to Menge do begin
         Name := 'EdZahl' + IntToStr(i);  // Name<-EdZahl1 
         Comp := TComponent(FindComponent(Name)); // Finde die Komponente 
         Edit := Comp as TEdit; // Verweise Edit auf diese Komponente
         Edit.visible := Zahlen[i];  // Setze Visible dieser Komponente auf den gespeichert Wert


    Das ganze ist eher Kladde, hilft dir aber vielleicht weiter.
     

  3. #3
    HarryXVI HarryXVI ist offline Mitglied Gold
    Registriert seit
    Apr 2008
    Beiträge
    108
    Wie muss ich denn "Name" deklarieren? Habs mal mit string probiert, aber dann gibt er mir die fehlermeldung: ' "ist kein gütiger Integerwert.'
    Geändert von HarryXVI (09.09.08 um 16:21 Uhr) Grund: weiteres Problem
     

  4. #4
    vop vop ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Beiträge
    676
    Name : string ist korrekt.

    In welcher Zeile bekommst Du denn den Integer-Fehler?
     

  5. #5
    HarryXVI HarryXVI ist offline Mitglied Gold
    Registriert seit
    Apr 2008
    Beiträge
    108
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    procedure TTaschenrechner.BtMengeClick(Sender: TObject);
    var i: Integer;
        Name: string;
    begin
    Zahlen[1]:=EdZahl3.Visible;
    Zahlen[2]:=EdZahl4.Visible;
    Zahlen[3]:=EdZahl5.Visible;
    Menge := StrToInt(EdMenge.Text);
    for i:= 1 to Menge do begin
      Name := 'EdZahl' + IntToStr(i);  // Name<-EdZahl1
      Comp := TComponent(FindComponent(Name)); // Finde die Komponente
      EdMenge := Comp as TEdit; // Verweise Edit auf diese Komponente
      EdMenge.Visible := Zahlen[i];  // Setze Visible dieser Komponente auf den gespeichert Wert
    end;
    end;

    Wenn ich jetzt ins Editfeld "2" eingebe, verschwinden die beiden bereits sichtbaren Felder.
    Wenn ich dann eine weitere Zahl eingebe kommt: " ist kein gültiger Integerwert.
    Was ist da los?
     

  6. #6
    vop vop ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Beiträge
    676
    Ich glaube, ich habe noch nicht so recht verstanden, was du eigentlich genau vorhast.
    1. Gehe ich recht in der Annahme, dass es eine vorher festgelegte Zahl von Eingabefeldern gibt (bei dir sind es drei EdZahl3, EdZahl4, EdZahl5)
    oder möchtest Du dynamisch welche erzeugen?
    2. Was genau soll passieren, wenn du BtnMenge drückst?
    Sollen neue Editfelder entstehen oder nur welche sichtbar gemacht werden?
    3. Warum heißen deine EditFelder EdZahl3, EdZahl4, EdZahl5?
    Was ist mit EdZahl1 und EdZahl2?
    4. Wie groß darf die Zahl Menge werden?
    Kann man hier 99 eingeben? Oder gar noch mehr?
    5. Was passiert, wenn Menge leer ist (=> führt beim StrToInt zu einem "kein Integer" -Fehler)
    Erkläre bitte etwas mehr.
     

  7. #7
    HarryXVI HarryXVI ist offline Mitglied Gold
    Registriert seit
    Apr 2008
    Beiträge
    108
    Es gibt insgesamt 5 feste Editfelder, von denen 2 (EdZahl1, EdZahl2) zu Beginn sichtbar sind. Wenn ich nun BtMenge drücke, soll die Zahl, die ich in EdMenge eingetippt habe, Integer werden und in einer Schleife sollen nacheinander genau so viele Editfelder sichtbar wie ich eingetippt habe (Bsp: Ich tippe 2 ein, dann erscheinen EdZahl3 und EdZahl4). Die Zahl "Menge" darf nicht größer als 3 sein, da es nur 3 weitere Editfelder gibt. Eine try...except-Anweisung sollte den Fall, dass Menge leer ist, abfangen und mit ShowMessage eine Fehlermeldung ausgeben.

    Ich hoffe, du kannst damit was anfangen.
     

  8. #8
    vop vop ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Beiträge
    676
    Ok, ein Problem mit der von mir vorgeschlagenen Lösung ist, dass du Editfelder EdZahl1 und EdZahl2 bereits sichtbar sind, du also die EditFelder EdZahl3 bis ggf. EdZahl 5 ansprechen möchtest. Du mußt die Schleife daher etwas modifizieren.
    Code :
    1
    2
    3
    4
    5
    6
    
    for i:= 3 to Menge+2 do begin
      Name := 'EdZahl' + IntToStr(i);  // Name<-EdZahl1
      Comp := TComponent(FindComponent(Name)); // Finde die Komponente
      EdMenge := Comp as TEdit; // Verweise Edit auf diese Komponente
      EdMenge.Visible := Zahlen[i];  // Setze Visible dieser Komponente auf den gespeichert Wert
    end;
    Das sollte dich schon mal weiter bringen..
     

  9. #9
    HarryXVI HarryXVI ist offline Mitglied Gold
    Registriert seit
    Apr 2008
    Beiträge
    108
    habe es jetzt so übernommen, wie du mir vorgeschlagen hast, aber ich komme nicht weiter. Wenn ich in EdMenge 1 eintippe, müsste EdZahl3 sichtbar werden, aber es geschieht nichts. Wenn ich 2 oder 3 eintippe, wird EdZahl4 sichtbar und die Formular-Caption ändert sich in "EdZahl4" bzw. "EdZahl5".
    Obendrein kann ich nur einmal eine Zahl eingeben, beim nächsten Versuch gibt er Integer-Fehler aus.

    Was muss ich noch ergänzen? Sorry, aber ich krieg in dein Codestück keinen Verstand rein.
     

  10. #10
    vop vop ist offline Mitglied Platin
    Registriert seit
    Mar 2004
    Beiträge
    676
    Dein Problem steckt vermutlich in dem verwendeten Bool-Array, welches mit der von mir vorgegebenen Schleife gar nicht aktualisiert wurde (mein Fehler).
    Eigentlich benötigst du das Array gar nicht.
    Wenn Du die EditFelder wie in meiner Schleife erklärt ansprichst, dann kannst du deren Visible-Wert direkt setzen / lesen.
    Vermutlich funtkioniert folgendede Code-segment
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    // Ersteinmal die Felder EdZahl3 bis EdZahl5 ausschalten
    for i:= 3 to 5 do begin
      Name := 'EdZahl' + IntToStr(i);
      Comp := TComponent(FindComponent(Name)); 
      EdMenge := Comp as TEdit;
      EdMenge.Visible := false; // false => ausschalten
    end;
    // dann die gewünschten wieder einschalten
    for i:= 3 to Menge+2 do begin
      Name := 'EdZahl' + IntToStr(i);  
      Comp := TComponent(FindComponent(Name)); 
      EdMenge := Comp as TEdit; 
      EdMenge.Visible := true;  // true => einschalten
    end;

    Beachte EdMenge ist jeweils das gewünschte Editfeld, welches über die Zahl i angesprochen wird.


    Versuche einmal, den Code zu verstehen, dann gelingt es dir bestimmt auch, wenn bei mir noch Mißverständnisse vorhanden sein sollten.
     

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 08.12.06, 11:34
  2. BOOL versus bool
    Von langer1801 im Forum VisualStudio & MFC
    Antworten: 2
    Letzter Beitrag: 11.10.05, 07:23
  3. Probleme mit bool...
    Von flashbrain im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 06.07.05, 10:16
  4. better bool?
    Von BenoX im Forum Cinema 4D
    Antworten: 6
    Letzter Beitrag: 19.02.05, 10:18
  5. Bool-Array lesen Problem
    Von NewPenKid im Forum .NET Archiv
    Antworten: 3
    Letzter Beitrag: 24.11.04, 09:02