Avatar billede monie Nybegynder
27. juni 2004 - 08:48 Der er 21 kommentarer og
1 løsning

Konventer Binær til Decimal

Jeg forsøger at lave et lille program der skal konverter Decimal til Binær og omvent.
Konventeringen Decimal til Binær virker fint.
Men konventeringen Binær til Decimal virker ikke.

Får fejlmeddelsen:
[Error] Unit1.pas(92): Incompatible types: 'String' and 'Integer'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

Hvad går der galt?
Hvordan skal det skrives?

Mine Delphi 6 koder:

function TForm1.IntToBin(Value : Integer): String;
var
  i: Integer;
  activ : boolean;
begin
    activ := false;
  for i:= 31 downto 0 do
    if Value and (1 shl i) = 0 then
    begin
      if activ then
          Result := Result + '0';
    end
    else
    begin
        Result := Result + '1';
        activ := true;
    end;
end;

function TForm1.BinToInt(Value: String): LongInt;
var
  i,Size: Integer;
begin
  Result:=0;
  Size:=Length(Value);
  for i:= 1 to size do
    if Value[i] = '1' then
      Result := result + round(power(2,size - i));
end;


procedure TForm1.LMDButton1Click(Sender: TObject);
Var
    DecToBin:Integer;
begin
DecToBin:=StrToInt(LMDEdit1.Text);
LMDMemo1.Text:=(IntToBin(DecToBin));
end;

procedure TForm1.LMDButton2Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
LMDEdit1.Clear;
LMDMemo1.Clear;
end;

procedure TForm1.LMDButton3Click(Sender: TObject);
Var
    BinToDec:Integer;
begin
BinToDec:=StrToInt(LMDEdit1.Text);
LMDMemo1.Text:=(BinToInt(BinToDec));
end;

end.

Mvh
MJ
Avatar billede arne_v Ekspert
27. juni 2004 - 09:41 #1
Prøv og erstat

LMDMemo1.Text:=(BinToInt(BinToDec));

med

LMDMemo1.Text:=IntToStr((BinToInt(BinToDec)));
Avatar billede erikjacobsen Ekspert
27. juni 2004 - 09:45 #2
procedure TForm1.LMDButton3Click(Sender: TObject);
begin
  LMDMemo1.Text:=IntToStr(BinToInt(LMDEdit1.Text));
end;
Avatar billede monie Nybegynder
27. juni 2004 - 11:42 #3
Hej Arne og erikjacobsen
Det virkede bare. tak!

Håber jeg lige må stille jer et spørgsmål mere!
Hvis der ikke indskrives noget i LMDEdit1 så får jeg fejmeddelsen:
www.sunwind.dk/error.jpg
Hvordan laves det så, så der poper en meddelse op med bemærkning om, at indskrive et
tal inde beregningen. Og brugeren får en chanse merer for at indskrive og kun et tal.

Hvordan skrives dette i programmet?

Mvh
Monie Jacobsen
Avatar billede arne_v Ekspert
27. juni 2004 - 11:51 #4
if LMDEdit1.Text <> '' then
  (* konverter *)
else
  (* giv ham en fejl lige i sylten *)
Avatar billede arne_v Ekspert
27. juni 2004 - 11:51 #5
Og et svar
Avatar billede monie Nybegynder
27. juni 2004 - 11:56 #6
I har svaret begge, så jeg skal lige havde et svar fra erikjacobsen så deler
jeg point mellem jer.
Og mange tak for hjælpen.
Mvh
MJ
Avatar billede arne_v Ekspert
27. juni 2004 - 12:17 #7
Du gav altså alle point til mig.

Erik du fløjter lige hvis du vil have halvdelen.
Avatar billede monie Nybegynder
27. juni 2004 - 12:21 #8
Han skulle gerne havde nogen. Erik send lige et svar.
Avatar billede arne_v Ekspert
27. juni 2004 - 12:34 #9
Iøvrigt er der her en alternativ måde:

function IntToBin(Value : Integer): String;

var
  tmp : Integer;
  digits : array [0..1] of char;

begin
  tmp := value;
  digits[0] := '0';
  digits[1] := '1';
  Result := '';
  while tmp > 0 do begin
    Result := digits[tmp and 1] + Result;
    tmp := tmp shr 1;
  end;
end;

function BinToInt(Value: String): LongInt;

var
  i, Size: Integer;

begin
  Result := 0;
  Size := Length(Value);
  for i := 1 to size do begin
    Result := Result shl 1;
    if Value[i] = '1' then begin
      Result := result + 1;
    end;
  end;
end;
Avatar billede monie Nybegynder
27. juni 2004 - 12:40 #10
Hej arne

Tak for dit alternativ Function'er
Men få følgende fejlmeddelse:

[Hint] Unit1.pas(97): Value assigned to 'BinToDec' never used
[Error] Unit1.pas(27): Unsatisfied forward or external declaration: 'TForm1.IntToBin'
[Error] Unit1.pas(28): Unsatisfied forward or external declaration: 'TForm1.BinToInt'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
Avatar billede monie Nybegynder
27. juni 2004 - 12:55 #11
procedure TForm1.LMDButton3Click(Sender: TObject);
Var
    BinToDec:Integer;
begin
BinToDec:=StrToInt(LMDEdit1.Text);
Try
If LMDEdit1.Text <> '' then
LMDMemo1.Text:=IntToStr(BinToInt(LMDEdit1.Text))
Except
On Exception DO MessageDlg('Skriv tal fra 0-255', mtInformation,[mbOk], 0)
ELSE End;

end;

Kan ikke få ovensående til at virke?
Mvh
MJ
Avatar billede arne_v Ekspert
27. juni 2004 - 13:02 #12
re 12:40:42>

Jeg tror at du mangler at sætte TForm1. foran funktionerne.
Avatar billede arne_v Ekspert
27. juni 2004 - 13:04 #13
re 12:55:04>

Skal det ikke bare være:

procedure TForm1.LMDButton3Click(Sender: TObject);

Var
    BinToDec:Integer;

begin
  If LMDEdit1.Text <> '' then
    LMDMemo1.Text:=IntToStr(BinToInt(LMDEdit1.Text))
  ELSE
    MessageDlg('Skriv tal fra 0-255', mtInformation,[mbOk], 0)
end;
Avatar billede monie Nybegynder
27. juni 2004 - 13:11 #14
Jo..
Det virker også arne, har lige fået begge metoder til at kører.

Mange tak for din hjælp!
Mvh
MJ
Avatar billede erikjacobsen Ekspert
27. juni 2004 - 13:28 #15
Jeg samler slet ikke på point, så "fordelingen" er fin nok for mig.
Avatar billede monie Nybegynder
27. juni 2004 - 14:47 #16
Hej arne
Har rette BinToDec efter din henvisning.

Men nedstående vil ikke funger.
Kan du se hvad der skal ændres?

procedure TForm1.LMDButton1Click(Sender: TObject);
Var
    DecToBin:Integer;
begin
If LMDEdit1.Text <> '' then
LMDMemo1.Text:=IntToStr(IntToBin(LMDEdit1.Text)))
ELSE
    MessageDlg('Skriv tal fra 0-255', mtInformation,[mbOk], 0)
end;

Mvh
MJ
Avatar billede arne_v Ekspert
27. juni 2004 - 15:14 #17
Hvad fejl får du ?
Avatar billede monie Nybegynder
27. juni 2004 - 15:21 #18
Denne fejlmeddelse:

[Error] Unit1.pas(81): Incompatible types: 'Integer' and 'String'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
Avatar billede monie Nybegynder
27. juni 2004 - 15:23 #19
Men denne her virker.
Jeg vil blot lærer af dette her!

procedure TForm1.LMDButton1Click(Sender: TObject);
Var
    DecToBin:Integer;
begin
Try
DecToBin:=StrToInt(LMDEdit1.Text);
LMDMemo1.Text:=(IntToBin(DecToBin));
Except
On Exception DO MessageDlg('Skriv tal fra 0-255', mtInformation,[mbOk], 0)
ELSE End;
end;
Avatar billede arne_v Ekspert
27. juni 2004 - 15:30 #20
Prøv:

procedure TForm1.LMDButton1Click(Sender: TObject);

Var
    DecToBin:Integer;

begin
  If LMDEdit1.Text <> '' then
    LMDMemo1.Text:=IntToBin(StrToInt(LMDEdit1.Text))
  ELSE
    MessageDlg('Skriv tal fra 0-255', mtInformation,[mbOk], 0)
end;
Avatar billede erikjacobsen Ekspert
27. juni 2004 - 15:30 #21
IntToBin returnere en streng, så der skal ikke laves yderligere for at bruge den som streng ;)
Avatar billede monie Nybegynder
27. juni 2004 - 15:42 #22
Hej arne
Tak det virker meget fint nu.
Jeg kan fortælle dig, jeg har prøvet med mange forskellige løsninger.
Men jeg er ikke fortrolig med: StrToInt og IntToStr m.v.

Men rigtigt mange tak for din hjælp!

Det kan oplyses at det lille konvertering program, skal jeg brug når der arbejdes
med pic16f84 og pic16f872. Et lille hurtigt hjølpe værktøj.

Med venlig hilsen
Monie Jacobsen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester