AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Zahleneingabe über mehrere Labels

Zahleneingabe über mehrere Labels

Ein Thema von Asura · begonnen am 22. Dez 2017 · letzter Beitrag vom 3. Jan 2018
Antwort Antwort
Seite 1 von 2  1 2   
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#1

Zahleneingabe über mehrere Labels

  Alt 22. Dez 2017, 15:14
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!

Geändert von Asura (22. Dez 2017 um 15:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#2

AW: Zahleneingabe über mehrere Labels

  Alt 22. Dez 2017, 16:06
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Dez 2017 um 16:09 Uhr)
  Mit Zitat antworten Zitat
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#3

AW: Zahleneingabe über mehrere Labels

  Alt 22. Dez 2017, 19:57
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.017 Beiträge
 
Delphi 12 Athens
 
#4

AW: Zahleneingabe über mehrere Labels

  Alt 23. Dez 2017, 00:33
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
Deposit := Deposit + ',' wrd sonst in einem nicht-deutschen Windows wunderschöne Probleme bereiten.


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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Dez 2017 um 00:39 Uhr)
  Mit Zitat antworten Zitat
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#5

AW: Zahleneingabe über mehrere Labels

  Alt 27. Dez 2017, 13:09
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!
Angehängte Dateien
Dateityp: zip PAS + DFM.zip (3,3 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Zahleneingabe über mehrere Labels

  Alt 28. Dez 2017, 12:54
Hallo,
wo genau kommst du nicht weiter?
Heiko
  Mit Zitat antworten Zitat
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#7

AW: Zahleneingabe über mehrere Labels

  Alt 28. Dez 2017, 16:11
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;
  Mit Zitat antworten Zitat
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#8

AW: Zahleneingabe über mehrere Labels

  Alt 30. Dez 2017, 22:22
Keiner der vllt. den Fehler sieht?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.275 Beiträge
 
Delphi 12 Athens
 
#9

AW: Zahleneingabe über mehrere Labels

  Alt 31. Dez 2017, 06:32
Moin...
Versuche mal was Anderes.
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.

PS: FindComponent, auch wenn es legitim ist, sieht für mich immer als Workaround aus.
  Mit Zitat antworten Zitat
Asura

Registriert seit: 10. Jun 2013
87 Beiträge
 
#10

AW: Zahleneingabe über mehrere Labels

  Alt 31. Dez 2017, 18:33
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 (Sender as TSpeedbutton).Tag ans Ende des Arrays setzt?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:26 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