Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Zahleneingabe über mehrere Labels (https://www.delphipraxis.net/194695-zahleneingabe-ueber-mehrere-labels.html)

Asura 22. Dez 2017 14:14

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:
// 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;
Weswegen ich mal davon ausgehe, dass bei dem Zweiten If der Fehler liegt.

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!

himitsu 22. Dez 2017 15:06

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:
SetEditValue(GetEditValue * 10 + Button.Tag); // die Zahlentasten
SetEditValue(GetEditValue / 10); // und die Löschtaste
SetEditValue(0); // die Cleartaste
Noch ein Property für die Getter/Setten und der Code wird noch schöner.

Delphi-Quellcode:
EditValue := EditValue * 10 + Button.Tag; // die Zahlentasten
EditValue := EditValue / 10; // die Löschtaste
EditValue := 0; // und die Cleartaste

Asura 22. Dez 2017 18:57

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;

himitsu 22. Dez 2017 23:33

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-Referenz durchsuchenFormatSettings
Delphi-Quellcode:
Deposit := Deposit + ','
wrd sonst in einem nicht-deutschen Windows wunderschöne Probleme bereiten. :zwinker:


Also entweder bei der Ein-/Ausgabe den "richtgen" Delphi-Referenz durchsuchenDecimalSeparator verwenden
oder bei der Umwandlung der Funktion (als letzten Parameter) den gewünschten DecimalSeparator mitteilen.

Asura 27. Dez 2017 12:09

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!

hoika 28. Dez 2017 11:54

AW: Zahleneingabe über mehrere Labels
 
Hallo,
wo genau kommst du nicht weiter?

Asura 28. Dez 2017 15:11

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;

Asura 30. Dez 2017 21:22

AW: Zahleneingabe über mehrere Labels
 
Keiner der vllt. den Fehler sieht?

haentschman 31. Dez 2017 05:32

AW: Zahleneingabe über mehrere Labels
 
Moin...:P
Versuche mal was Anderes. :zwinker:
http://www.delphipraxis.net/133112-z...ertierung.html
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. :?

Asura 31. Dez 2017 17:33

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:
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;
Wie könnte ich dort denn nun noch einpflanzen, dass er den Wert
Delphi-Quellcode:
(Sender as TSpeedbutton).Tag
ans Ende des Arrays setzt?


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