AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Probleme mit Umrechnung und korrekter Ausgabe
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme mit Umrechnung und korrekter Ausgabe

Ein Thema von SoD · begonnen am 21. Dez 2008 · letzter Beitrag vom 23. Dez 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von SoD
SoD

Registriert seit: 9. Dez 2008
Ort: Oberasbach
33 Beiträge
 
Delphi 2007 Professional
 
#1

Probleme mit Umrechnung und korrekter Ausgabe

  Alt 21. Dez 2008, 11:50
Mahlzeit liebe DPler,

ich arbeite derzeit an einem "kleinen" textbasierten RPG, bei dem ich einen Assistenten zur Charakter-Erstellung machen möchte. Dabei stoße ich jetzt auf ein unerwartet großes Problem: Es will mir nicht gelingen die 4 verschiedenen Währungseinheiten gemäß dem mir vorliegenden Regelwerk zu implementieren. Falls es

Folgende Einheiten gibt es (wer Das Schwarze Auge kennt erzähl ich hier wenig neues ):

Kreuzer (kleinste)
Heller (klein)
Silber (Einheit vor der ausgegangen wird)
Dukaten (größte)

Das Problem an der ganzen Sache: Ich krieg es ums Verrecken nicht hin, dass mir diese vier Einheiten in vier verschiedenen Edits korrekt angezeigt werden, wenn man ab jeweils 10 in die nächste Einheit überwechselt. Das sieht dann nämlich so aus, als hätte man 2 EUR und 161 Cent und man meint, sich was für 3 EUR nicht leisten zu können.

Mir sind die Ideen ausgegangen, wie ich das richtig coden muss.

Delphi-Quellcode:
procedure TFrame2CharCreate.GetCountMoney(Sender: TObject);

var
  iSilber: Integer;

begin
  // Zufallsgenerator init
  Randomize;

  // Vermögen auswürfteln
  repeat
    iSilber := Random(6)
  until iSilber > 0; // Nullwert verhindern

  iSilber := (iSilber + 6) * 10; // = Gewürfeltes Silber
  EditSilber.Text := IntToStr(iSilber);

  // Währungs-Einheiten umrechnen
  if iSilber > 10 then
  begin
    {???}
  end;
end;
Hat hier jemand ne Idee, wie man das lösen könnte?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Probleme mit Umrechnung und korrekter Ausgabe

  Alt 21. Dez 2008, 12:10
Schau dir mal DIV und MOD an
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Probleme mit Umrechnung und korrekter Ausgabe

  Alt 21. Dez 2008, 12:21
Zitat:
Delphi-Quellcode:
repeat
    iSilber := Random(6)
  until iSilber > 0; // Nullwert verhindern


Mach das lieber so:iSilber := Random(6) + 1; , dann brauchst Du keine Schleife.

Ansonsten würde ich mir einen Record für die Währungen definieren sowie 2 Umrechnungsfunktionen, ausgehend von der kleinsten Währung. Das könnte dann so aussehen:
Delphi-Quellcode:
(* Im Normalfall genügt es, diese Typdefinition direkt unter "implementation" zu schreiben.
  Es handelt sich hierbei um eine Struktur mit 4 Feldern für die jeweilige Währung.
   Angesprochen werden können diese Felder über die Punkt-Notation (s.u.) *)

type
  TMoneyRec = record
    iKreuzer,
    iHeller,
    iSilber,
    iDukaten: Cardinal;
  end;

//Rechnet die angegebenen Kreuzer in Währungen um und gibt das Ergebnis als Record zurück
function KreuzerToMoneyRec(cKreuzer: Cardinal): TMoneyRec;
begin
  //Beispiel: 1234 wurden übergeben

  Result.iKreuzer := cKreuzer mod 10; // = 4 Kreuzer (Rest bei Teilung durch 10)

  //jetzt wird erst durch 10 geteilt (= 123)
  //und davon wieder der Rest bei erneuter Teilung durch 10 ermittelt (= 3 Heller)
  Result.iHeller := cKreuzer div 10 mod 10;

  //nun analog das Gleiche, allerdings wird jetzt durch 100 geteilt
  Result.iSilber := cKreuzer div 100 mod 10;

  //zum Schluss brauchen wir keinen Rest mehr, das Ergebnis der Division ergibt die Dukaten
  Result.iDukaten := cKreuzer div 1000;
end;

//Rechnet den übergebenen Record wieder in Kreuzer zurück
//Rechenweg umgekehrt zu oben
function MoneyRecToKreuzer(aRec: TMoneyRec): Cardinal;
begin
  Result := aRec.iKreuzer +
            aRec.iHeller * 10 +
            aRec.iSilber * 100 +
            aRec.iDukaten * 1000;
end;
P.S.: Willkommen in der DP
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von SoD
SoD

Registriert seit: 9. Dez 2008
Ort: Oberasbach
33 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Probleme mit Umrechnung und korrekter Ausgabe

  Alt 21. Dez 2008, 14:40
@mkinzler: div und mod kenn ich schon, aber man kennt das ja, "gewusst wie"

@DeddyH: Danke für den Tipp, ohne Schleife kommt mir das gleich sicherer vor, ich werd's ausprobieren, nur wo muss das type anfangen? Die Syntax-Überprüfung verwirrt mich etwas Hab vorher noch nie eigene Typen gecoded und mit Records auch noch nicht recht viel gemacht (= gar nichts ).

Und damit ich noch was von lerne eine Bitte: Könnte man den Code vielleicht dokumentieren? Wäre super
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Probleme mit Umrechnung und korrekter Ausgabe

  Alt 21. Dez 2008, 14:55
Dein Wunsch war mir Befehl
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Probleme mit Umrechnung und korrekter Ausgabe

  Alt 21. Dez 2008, 15:35
Zitat von DeddyH:
Ansonsten würde ich mir einen Record für die Währungen definieren sowie 2 Umrechnungsfunktionen, ausgehend von der kleinsten Währung. Das könnte dann so aussehen:
Dann kann man adas ganze auch gleich sauber in eine Klasse packen. Dui hast die daten und dazugehörig die Methoden, um sie zu manipulieren. Das schreit förmlich nach einer Klasse.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Probleme mit Umrechnung und korrekter Ausgabe

  Alt 21. Dez 2008, 15:37
Eine Klasse musst Du aber instanziieren (es sei denn, man definiert die Umrechnungen als Klassenmethoden) und später wieder freigeben. Ich wollte den TE nicht noch mehr verwirren .
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Probleme mit Umrechnung und korrekter Ausgabe

  Alt 21. Dez 2008, 16:27
Ab Delphi 2006 ist das ein Fall für einen 'advanced record' mit Methoden.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von SoD
SoD

Registriert seit: 9. Dez 2008
Ort: Oberasbach
33 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Probleme mit Umrechnung und korrekter Ausgabe

  Alt 21. Dez 2008, 16:55
Zitat von DeddyH:
Eine Klasse musst Du aber instanziieren (es sei denn, man definiert die Umrechnungen als Klassenmethoden) und später wieder freigeben. Ich wollte den TE nicht noch mehr verwirren .
Gut, dass du's nicht getan hast, das wär nämlich sonst passiert

Die Tipps und Erklärungen sind zwar gut, aber ich sollte wohl noch dazu sagen, dass ich noch ein bisschen "an der Hand geführt" werden muss, da ich noch über kein allzu umfassendes Programmierwissen in Delphi verfüge; steh erst am Anfang meiner Ausbildung

Ich hänge mal einen Screenshot des Frames an, in dem die Werte ausgewürfelt werden sollen.

Kurze Erklärung:

Per "Würfeln!" soll der Würfel ins Rollen gebracht und mit erneutem Klick angehalten werden. Nun ist ein Wert erwürfelt und ein erneuter Klick wiederholt die ganze Show im jeweils nächsten Feld. Die Timer Komponente soll dabei die Geschwindigkeit der vorbeirauschenden Zahlen im Edit bestimmen, wobei dieser schnell eingestellt ist, sodass es sich mehr oder weniger schwierig gestaltet einen gewünschten hohen Wert ganz "zufällig" zu bekommen. Erst wenn alle Felder ausgefüllt sind, soll der Weiter-Button Active := true sein, damit man alle Schritte erst ausführen muss.

Die Unit bis jetzt:

Delphi-Quellcode:
unit FrameCharCreate2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, StdCtrls, Mask, DBCtrls, ExtCtrls, jpeg;

type
  TFrame2CharCreate = class(TFrame)
    GroupBoxCharProperties: TGroupBox;
    LabelMU: TLabel;
    LabelKL: TLabel;
    LabelCH: TLabel;
    LabelGE: TLabel;
    LabelKK: TLabel;
    ButtonRandomize: TButton;
    ButtonCharCreateFrame2Next: TButton;
    ButtonCharCreateFrame2Back: TButton;
    LabelHeader: TLabel;
    LabelDescription: TLabel;
    Timer1: TTimer;
    ImageCharCreate: TImage;
    EditMU: TEdit;
    EditKL: TEdit;
    EditCH: TEdit;
    EditGE: TEdit;
    EditKK: TEdit;
    GroupBoxMoney: TGroupBox;
    LabelDukaten: TLabel;
    LabelSilbertaler: TLabel;
    LabelHeller: TLabel;
    LabelKreuzer: TLabel;
    ButtonMoneyRandomize: TButton;
    EditSilber: TEdit;
    EditKreuzer: TEdit;
    EditHeller: TEdit;
    EditDukaten: TEdit;
    Timer2: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure ButtonRandomizeClick(Sender: TObject);
    procedure ButtonMoneyRandomizeClick(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure GetCount (Sender: TObject);
    procedure GetCountMoney (Sender: TObject);
  public
    { Public-Deklarationen }
    var editCount: Byte;
    var editCountMoney: Byte;
  end;

implementation

{$R *.dfm}

procedure TFrame2CharCreate.ButtonMoneyRandomizeClick(Sender: TObject);
begin
  if EditKreuzer.Text = 'then
  begin
    editCountMoney := 0;
  end;

  if ButtonMoneyRandomize.Tag = 0 then
  begin
    ButtonMoneyRandomize.Tag := 1;
    Timer2.Enabled := True;
  end
  else
  begin
    if ButtonMoneyRandomize.Tag = 1 then
    begin
      ButtonMoneyRandomize.Tag := 0;
      Timer2.Enabled := False;
      Inc(editCountMoney);
    end;
  end;

  if (editCountMoney = 1) and (ButtonMoneyRandomize.Tag = 0) then
  begin
    ButtonMoneyRandomize.Enabled := False;
  end;
end;

procedure TFrame2CharCreate.ButtonRandomizeClick(Sender: TObject);
begin
  if EditMU.Text = 'then
  begin
    editCount := 0;
  end;

  if ButtonRandomize.Tag = 0 then
  begin
    ButtonRandomize.Tag := 1;
    Timer1.Enabled := True;
  end
  else
  begin
    if ButtonRandomize.Tag = 1 then
    begin
      ButtonRandomize.Tag := 0;
      Timer1.Enabled := False;
      Inc(editCount);
    end;
  end;

  if (editCount = 5) and (ButtonRandomize.Tag = 0) then
  begin
    ButtonRandomize.Enabled := False;
  end;
end;

procedure TFrame2CharCreate.GetCount(Sender: TObject);

var
  i: Integer;

begin
  // Zufallsgenerator init
  Randomize;

  // Zufälligen Wert ermitteln
    i := Random(6) + 1;

  i := i+7;

  if editCount = 0 then
  begin
    EditMU.Text := IntToStr(i);
  end
  else
  begin
    if editCount = 1 then

    begin
      EditKL.Text := IntToStr(i);
    end
    else
    begin
      if editCount = 2 then
      begin
        EditCH.Text := IntToStr(i);
      end
      else
      begin
        if editCount = 3 then
        begin
          EditGE.Text := IntToStr(i);
        end
        else
        begin
          if editCount = 4 then
          begin
            EditKK.Text := IntToStr(i);
          end;
        end;
      end;
    end;
  end;
end;

procedure TFrame2CharCreate.GetCountMoney(Sender: TObject);

var
  iSilber: Integer;

begin
  // Zufallsgenerator init
  Randomize;

  // Vermögen auswürfteln
  iSilber := Random(6) + 1;

  iSilber := (iSilber + 6) * 10;
  EditSilber.Text := IntToStr(iSilber);

  // Währungs-Einheiten umrechnen
  if iSilber > 10 then
  begin
    EditDukaten.Text := IntToStr(iSilber - 10);
  end;
end;

procedure TFrame2CharCreate.Timer1Timer(Sender: TObject);
begin
  GetCount(Sender);
end;

procedure TFrame2CharCreate.Timer2Timer(Sender: TObject);
begin
  GetCountMoney(Sender);
end;

end.
Miniaturansicht angehängter Grafiken
framecharcreate2_116.png  
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Probleme mit Umrechnung und korrekter Ausgabe

  Alt 21. Dez 2008, 17:03
Da sind ein bisschen viele Randomize-Aufrufe drin (einmalig z.B. im OnCreate genügt). Außerdem lassen sich die vielen Ifs meist durch case-Abfragen ersetzen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:51 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