![]() |
Zahleneingabe über mehrere Labels
Guten Tag,
ich bin gerade dabei eine Zahleneingabe zu erstellen. Das Formular wird über ein Tablet genutzt, weshalb ich auf ein NumPad in Form von Speedbutton zurückgegriffen habe. Daraufhin steht darüber in einer festen Form 6 Labels, wofür 5 für eine Zahl bestimmt ist: 0 0 0 . 0 0. Von Links beginnend: lb_depo5 bis lb_depo1. Der Punkt ist hiervon nicht betroffen. Man soll nun über die Eingabe den Effekt haben, dass von Rechts die Zahlen nacheinander eingefügt werden. Beispiel: Ich klicke auf dem Numpad 1, dann erscheint bei lb_depo1 die Nummer 1. Nach dem Klicken auf 2. Rutscht die 1 auf lb_depo2 und die eingegebene 2 auf Position lb_depo1. Leider funktioniert das nicht so wirklich, ab der dritten Eingabe funktioniert dieses System nicht mehr.
Delphi-Quellcode:
Weswegen ich mal davon ausgehe, dass bei dem Zweiten If der Fehler liegt.
// Zahleneingabe // { TODO : Zahleneingabe: }
procedure TF_Admin2_2.sb_Click(Sender: TObject); begin if J = 1 then begin TLabel(Self.FindComponent('lb_depo' + IntToStr(J))).Caption := (Sender as TSpeedButton).Caption ; J := J+1; end else if (J <= 5) and (J > 1) then begin TLabel(Self.FindComponent('lb_depo' + IntToStr(J))).Caption := TLabel(Self.FindComponent('lb_depo' + IntToStr(J-1))).Caption ; TLabel(Self.FindComponent('lb_depo' + IntToStr(J-1))).Caption := (Sender as TSpeedButton).Caption ; J := J+1 end else if J > 5 then begin btn_delete.Click; J := 1; end; // Kontoguthaben - Einzahlung lb_Acc_m_Depo.Caption := FloattoStrF(CheckAccountAmount(F_Users.UserID) - GetDeposit, ffCurrency, 15,2); end; Ich würde mich freuen, wenn sich da jemand diesem kleinem logischen Problem annehmen könnte und bin für andere Vorschläge für eine eventuell bessere Umsetzung auch offen! |
AW: Zahleneingabe über mehrere Labels
Ich würde dir eher empfehlen, dass du dir zwei Hilfsfunktionen baust.
> GetEditValue und SetEditValue , welche den Wert (Float) auslesen oder in die Edits schreiben. Damit kannst du dann nachfolgend problemlos jegliche Art von Auslesen/Setzen/Manipulieren/Rechnen umsetzen. Und du brauchst nicht überall "umständlich" (fehleranfällig) die Editinhalte umherschupsen.
Delphi-Quellcode:
Noch ein Property für die Getter/Setten und der Code wird noch schöner.
SetEditValue(GetEditValue * 10 + Button.Tag); // die Zahlentasten
SetEditValue(GetEditValue / 10); // und die Löschtaste SetEditValue(0); // die Cleartaste
Delphi-Quellcode:
EditValue := EditValue * 10 + Button.Tag; // die Zahlentasten
EditValue := EditValue / 10; // die Löschtaste EditValue := 0; // und die Cleartaste |
AW: Zahleneingabe über mehrere Labels
Wie müsste da nun die Set-Funktion aussehen?
Ich habe mich mal bis jetzt so daran versucht:
Delphi-Quellcode:
function SetDeposit(Depo: String);
begin // end; function GetDeposit: Real; var I : Integer; Deposit : String; begin for I := 5 downto 1 do begin if I = 2 then Deposit := Deposit + ','; Deposit := Deposit + TLabel(F_admin2_2.FindComponent('lb_depo' + IntToStr(I))).Caption; end; result := StrtoFloat(Deposit); end; // Zahleneingabe { TODO : Zahleneingabe: } procedure TF_Admin2_2.sb_Click(Sender: TObject); begin SetDeposit(GetDeposit * 10 + (Sender as TSpeedbutton).Tag); // die Zahlentasten // Kontoguthaben - Einzahlung lb_Acc_m_Depo.Caption := FloattoStrF(CheckAccountAmount(F_Users.UserID) - GetDeposit, ffCurrency, 15,2); end; |
AW: Zahleneingabe über mehrere Labels
Entweder mit FloatToStrF oder Format in einen String, entsprechend den Labels, und dann die Chars den Captions zuweisen
oder Mathematisch.
Delphi-Quellcode:
function SetDeposit(Depo: Real);
DepoInt := Round(Depo * 100); // oder Trunc for I := 5 downto 1 do begin TLabel(F_admin2_2.FindComponent('lb_depo' + IntToStr(I))).Caption := DepoInt mod 10; DepoInt := DepoInt div 10; end; DepoStr := Format('...', [Depo]); for I := 5 downto 1 do TLabel(F_admin2_2.FindComponent('lb_depo' + IntToStr(I))).Caption := DepoStr[I + IfThen(I > 3, 1, 0)]; PS: ![]()
Delphi-Quellcode:
wrd sonst in einem nicht-deutschen Windows wunderschöne Probleme bereiten. :zwinker:
Deposit := Deposit + ','
Also entweder bei der Ein-/Ausgabe den "richtgen" ![]() oder bei der Umwandlung der Funktion (als letzten Parameter) den gewünschten DecimalSeparator mitteilen. |
AW: Zahleneingabe über mehrere Labels
Liste der Anhänge anzeigen (Anzahl: 1)
Puh also ich komm da einfach nicht weiter, das will so gar nicht funktionieren.
Ich stelle mal die Form und die Unit hier zur Verfügung, eventuell findet hier jemand den Fehler und kann mir mal sagen, wie das nun endlich funktioniert: Bezüglich DecimalSeperator: Das Programm wird nur auf einem Windows benutzt von dem ich weiß, dass es deutsch ist, aber Dankeschön für den Hinweis! |
AW: Zahleneingabe über mehrere Labels
Hallo,
wo genau kommst du nicht weiter? |
AW: Zahleneingabe über mehrere Labels
Das Problem ist, dass ich einfach nicht raus bekomme wie ich nun GetDeposit und SetDeposit ansprechen soll, damit dieser gewünschte Effekt eintritt, dass die Zahlen von rechts nach links eingefügt werden:
Delphi-Quellcode:
procedure SetDeposit(Depo: Real);
var I, DepoInt : Integer; begin DepoInt := Round(Depo * 100); for I := 5 downto 1 do begin TLabel(F_admin2_2.FindComponent('lb_depo' + IntToStr(I))).Caption := InttoStr(DepoInt mod 10); DepoInt := DepoInt div 10; end; end; function GetDeposit: Real; var I : Integer; Deposit : String; begin for I := 5 downto 1 do begin if I = 2 then Deposit := Deposit + ','; Deposit := Deposit + TLabel(F_admin2_2.FindComponent('lb_depo' + IntToStr(I))).Caption; end; result := StrtoFloat(Deposit); end;
Delphi-Quellcode:
procedure TF_Admin2_2.sb_Click(Sender: TObject);
begin SetDeposit(GetDeposit * 10 + (Sender as TSpeedbutton).Tag); end; |
AW: Zahleneingabe über mehrere Labels
Keiner der vllt. den Fehler sieht?
|
AW: Zahleneingabe über mehrere Labels
Moin...:P
Versuche mal was Anderes. :zwinker: ![]() Mit dieser Funktion zerlegst du den Zahlenwert in einzelne Digits. Die kannst du dann aus dem Array direkt den Labels zuweisen. :thumb: PS: FindComponent, auch wenn es legitim ist, sieht für mich immer als Workaround aus. :? |
AW: Zahleneingabe über mehrere Labels
Delphi-Quellcode:
Function NumberToDigits(aNumber: Cardinal): TByteDynArray;
Var n: Integer; Begin n := 0; SetLength(Result, 10); Repeat Result[n] := aNumber mod 10; aNumber := aNumber div 10; Inc(n); Until aNumber = 0; SetLength(Result, n); End;
Delphi-Quellcode:
function GetDeposit: Cardinal;
var I : Integer; Deposit : String; begin for I := 5 downto 1 do begin Deposit := Deposit + TLabel(F_admin2_2.FindComponent('lb_depo' + IntToStr(I))).Caption; end; result := StrtoInt(Deposit); end;
Delphi-Quellcode:
Wie könnte ich dort denn nun noch einpflanzen, dass er den Wert
var Numbers: TByteDynArray;
I: Integer; begin Numbers := NumbertoDigits(GetDeposit); for I := 1 to 5 do TLabel(F_admin2_2.FindComponent('lb_depo' + IntToStr(I))).Caption := Numbers[I-1].ToString;
Delphi-Quellcode:
ans Ende des Arrays setzt?
(Sender as TSpeedbutton).Tag
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 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