Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Dualumrechnung macht Probleme


That Guy - Di 02.11.04 17:48
Titel: Dualumrechnung macht Probleme
Hallo,
wiedereinmal überfordert mich Delphi bzw. mein Lehrer... :(
daher bitte ich wiedereinmal um eure hilfe ^^" .

In dem Programm wird eine Zahl1 und eine Zahl2 eingegeben, diese werden dann in Dualzahlen umgerechnet. Die beiden DUalzahlen werden dann addiert und das DUal ergebnis muss zurück in eine Dezimalzahl gerechnet werden.
Ihr denkt jetzt sicher warum nicht einfach alles dezimal und dann in DUal, ganz einfach weil mein lehrer das so will -_-"
naja aufjedenfall muss das so funzen (und lasst mich nicht lügen am besten bis donnerstag, spätestens aber nächste woche dienstag ^^")

naja ich hab noch eine schematische darstellung gemacht damit ihr euch das besser vorstellen könnt ^^

user defined image

wer will kann sich das ganze (unit, formblatt etc.) auch runterladen hier [http://home.arcor.de/go-tenks/Dual2.rar]

der Quellcode ist sicherlich komplett falsch aber naja ^^


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    MDezi1: TMemo;
    MDezi2: TMemo;
    MDeziErgebnis: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    MDual1: TMemo;
    MDual2: TMemo;
    MDualErgebnis: TMemo;
    Label4: TLabel;
    BtRech: TButton;
    BtClear: TButton;
    Label5: TLabel;
    Label6: TLabel;
    procedure BtClearClick(Sender: TObject);
    procedure BtRechClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var Form1:= TForm1;

implementation

{$R *.DFM}

procedure TForm1.BtClearClick(Sender: TObject);
begin
 MDezi1.lines[0] :='';
 MDezi2.lines[0] :='';
 MDeziErgebnis.lines[0] :='';
 MDual1.lines[0] :='';
 MDual2.Lines[0] :='';
 MDualErgebnis.lines[0] :='';
end;

procedure TForm1.BtRechClick(Sender: TObject);
var Dualtext : String;
var Zeichen : String;
    Dezimal : Integer;

begin
 dezimal := 0;
 dualtext := MDezi1.lines[0];
 Repeat
  Zeichen := Copy (Dualtext,1,1);
  Delete (Dualtext,1,1);
  Dezimal := Dezimal * 2+ StrToInt(Zeichen);
 Until Dualtext = ' ';
  MDeziErgebnis.Text :=  IntToStr(Dezimal);
end;

procedure;
Var MDezi1, MDezi2, MDeziErgebnis, ubertrag : Integer;
    Dualtext : String;;

begin
 Dezi1 := StrToInt(MDezi1.text);
 dezimalzahl(Dezi1,Dualtext);
 Mdual1.Text:=Dualtext;
 Mdezi2:=StrToInt(Mdezi2.Text);
 Mdual2.Text:=Dualtext;
 addiere (Mdual1.Text,Mdual2.Text,Dualtext);
 Mdual3.Text:=Dualtext;
 DualinDezimal(Dualtext);
end;
end.


zu meiner verteidigung hab ich noch zu sagen, dass das nich mein programm ist da meins nicht gespeichert war als der rechner in der schule abgeschmiert ist und dass hier von meinem nachbarn ist der nochweniger plan davon hat als ich ... aufjedenfall wäre eure hilfe für mich wiedereinmal sehr wertvoll :)


st-matze - Di 02.11.04 18:01

Hier mal nen kleiner anfang

integer in dualzahl umwandlung


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function inttobit(IN_dec:integer):string;
begin
  Result:='';
  while IN_Dec > 0 do
  begin
    case (IN_dec mod 2of
    0:Result:='0'+Result;
    1:Result:='1'+Result;
    end;
    IN_dec:=Round((IN_dec - (IN_dec mod 2))/2);
  end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  try
    Edit3.Text:=inttobit(strtoint(Edit1.Text));
  except
    Edit3.Text:='';
  end;
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
  try
    Edit4Text:=inttobit(strtoint(Edit2.text));
  except
    Edit4Text:='';
  end;
end;

end.


und nimm doch lieber edit als memo is einfacher

muss jetzt leider wech
vielleicht später mehr


That Guy - Di 02.11.04 18:10

mein lehrer will das wir memo felder benutzen frag nich warum ... ^^

schopnmal danke für deine mühe, wäre es zu viel verlangt das ganze in etwa so zu schreiben wie ich das oben begonnen hab ? dann ist das ganze für mich als voll depp in sachen delphi einfacher um zu kopieren ^^ oder zieht euch doch das komplette ding und bearbeitet es da ^^, aber trotzdem schonmal danke^^


tommie-lie - Di 02.11.04 18:18

Findest du es nicht ein wenig dreist, darum zu betteln, daß andere deine Hausaufgaben für dich erledigen?


That Guy - Di 02.11.04 18:25

nö,
zum einen sind es keine hausaufgaben und zum anderen lasse ich mir lieber von leuten zeigen wie es richtig geht anstatt in der schule ne 5 oder gar 6 dafür zu kassieren, es ist ja nicht so dass ich es nicht selber versuche, wie mein sehr stümperhafter anfang ja beweist, jedoch habe ich mehr davon wenn ich ein funktionsfähiges programm habe und daran dann sehen kann wie es geht, anstatt ein programm das ich selber gemacht habe was nur falsch oder gar nicht geht :D


st-matze - Mi 03.11.04 10:48

So hier hast du drei funktionen die dir weiter helfen sollten



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
//Addition zweier binärer Zahlen im String format

function addbin(IN_bin1, IN_bin2:string):string;
var bitsum, bitov: char;
    val1, val2, sum:string;
    i: integer;
begin
  val1:='';
  val2:='';
//eingabewerte werden umgedreht aus '1011' wird '1101'
  for i:=Length(IN_bin1) downto 1 do val1:=val1+IN_bin1[i];
  for i:=Length(IN_bin2) downto 1 do val2:=val2+IN_bin2[i];
//die restlichen stellen des kleineren wertes werden mit '0' aufgefüllt
  if Length(IN_bin1) < Length(IN_bin2) then 
    for i:=Length(IN_bin1)+1 to Length(IN_bin2) do val1:=val1+'0'
  else
    for i:=Length(IN_bin2)+1 to Length(IN_bin1) do val2:=val2+'0';
  sum:='';
  bitov:='0';
//"bit" weisen berechnen im Dualsystem
  for i:=1 to Length(val1) do
  begin
    bitsum := chr(((ord(bitov)-Ord('0'))+(Ord(val1[i])-Ord('0')) + (Ord(val2[i])-Ord('0'))) mod 2 + Ord('0'));
    bitov  := chr(((ord(bitov)-Ord('0'))+(Ord(val1[i])-Ord('0')) + (Ord(val2[i])-Ord('0'))) div 2 + Ord('0'));
    sum := sum + bitsum;
  end;
  if bitov = '1' then sum:=sum + bitov;
  Result:='';
//umkehren des Ergebnisses
  for i:=Length(sum) downto 1 do Result:=Result + sum[i];
end;

//Umwandlung Dezimal zu Binär

function dec2bin(IN_dec:integer):string;
begin
  if IN_dec = 0 then
    Result:='0'
  else
  begin
    Result:='';
    while IN_Dec > 0 do
    begin
      case (IN_dec mod 2of
      0:Result:='0'+Result;
      1:Result:='1'+Result;
      end;
      IN_dec:=Round((IN_dec - (IN_dec mod 2))/2);
    end;
  end;
end;

//Umwandlung Binär zu Dezimal

function bin2dec(IN_bin:string):integer;
var i,mul:integer;
begin
  Result:=0;
  i:=Length(IN_bin);
  mul:=1;
  while i > 0 do
  begin
    if IsDelimiter('1',IN_bin,i) then 
      Result:= Result + mul;
    Dec(i);
    mul:=mul*2;
  end;
end;


Für dein Memo solltest du

Memo.Clear; anstatt Memo.Lines[0]:='' verwenden

und

Memo.Text enthält alle Linien auf einmal, falls auch mal mehr als nur eine Zeile drin steht.

verwendung der Funktionen is irgendwie so:

Memobin.text := dec2bin(Memodec.text);
Memobinsum.text := addbin(memobin1.text,memobin2.text);
memodecsum.text := inttostr(bin2dec(Memobinsum.text));

bitte beachte, dass hier noch keine fehlerhaften eingaben abgefangen werden.

Deinen Lehrer kannst ja mal fragen, was der quatsch mit dem Memo überhaupt soll. Edit ist hier meiner meinung nach besser angebracht


That Guy - Do 04.11.04 21:48

vielen dank ^^

ich werd mich dann mals ans umschreiben machen ^^, so wie es da steht nimmt mir mein lehrer das auf keinen fall ab *g*

aber vielen dank schonmal, was würd ich nur ohne euch machen ^^


AXMD - Do 04.11.04 21:56

That Guy hat folgendes geschrieben:
was würd ich nur ohne euch machen ^^


Das selbe, was du jetzt auch machst: Code umschreiben :twisted:

AXMD


That Guy - Fr 05.11.04 17:56

ohne euch hätt ich aber die basis nich ;)