bool-Array

HarryXVI

Erfahrenes Mitglied
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:
Zahlen: array[1..3] of longbool;
Das ist die Deklaration des Arrays

Code:
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?
 
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:
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.
 
Wie muss ich denn "Name" deklarieren? Habs mal mit string probiert, aber dann gibt er mir die fehlermeldung: ' "ist kein gütiger Integerwert.'
 
Zuletzt bearbeitet:
Code:
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?
 
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.
 
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.
 
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:
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..
 
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.
 
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:
// 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.
 

Neue Beiträge

Zurück