Avatar billede okula Nybegynder
22. januar 2011 - 12:47 Der er 9 kommentarer og
1 løsning

simpel Dec > Hex > Bin converter

Hejsa.
Jeg er i gang med at lave et lille konverterings program i delphi7 som han omregne fra Decimal >< Hex >< Binær.

jeg har da også fundet funktionerne til at omregne, men da jeg er lidt ny i det, har jeg ikke helt styr på det der at kalde en Function og Result, bruge det i min Procedure og så få resultatet af dette vist.

jeg har functionerne :
----------hex til decimal----------------------------------------
function HexToInt(HexNum: string): LongInt;
begin
  Result:=StrToInt('$' + HexNum) ;
end;
-----------decimal til binær-------------------------------------
function IntToBin ( value: LongInt; digits: integer ): string;
begin
    result := StringOfChar ( '0', digits ) ;
    while value > 0 do begin
      if ( value and 1 ) = 1 then
        result [ digits ] := '1';
      dec ( digits ) ;
      value := value shr 1;
    end;
end;
------------binær til decimal------------------------------------
function BinToInt(Value: String): LongInt;
var i: Integer;
begin
  Result:=0;
//remove leading zeroes
  while Copy(Value,1,1)='0' do
  Value:=Copy(Value,2,Length(Value)-1) ;
//do the conversion
  for i:=Length(Value) downto 1 do
  if Copy(Value,i,1)='1' then
    Result:=Result+(1 shl (Length(Value)-i)) ;
end;
---------------------------------------------

og indput er fra "Edit1.text" onchange
til output (resultatet) i "Edit2.text"
Dec til Hex var nem nok med den implanterede IntToHex, men sidder godt og grundigt fast nu, og har kikket overalt men kan ikke rigtig finde nogle brugbare eksempler/forklaringer.

-Christian
Avatar billede 2Mida Praktikant
22. januar 2011 - 13:34 #1
Jeg kan ikke lige afkode hvad du spørger om, men er det forskellen mellem procedure/function?

procedure er en subroutine der ikke returnerer en værdi, men det gør en function i result:

function Test : boolean;
begin
  Result := true;
end;

eller

function Test : boolean;
begin
  Test := true;
end;


Er det visningen: Edit2.Text skal have en string-variable, så du skal konverterer dine LongInt til en streng inden du sætter den ind

Edit2.Text := String(HexToBin('1234'));

OBS Jeg har ikke gennemset din functioner om de virker korrekt!

Denne side er en god starter:
http://www.delphibasics.co.uk/index.html

..Ole
Avatar billede okula Nybegynder
22. januar 2011 - 14:55 #2
jeg er nået så langt som at kun mangle Decimal > Binær

funktionen skulle være: (er fundet på
http://delphi.about.com/od/mathematics/a/baseconvert.htm
---------
function IntToBin ( value: LongInt; digits: integer ): string;
begin
    result := StringOfChar ( '0', digits ) ;
    while value > 0 do begin
      if ( value and 1 ) = 1 then
        result [ digits ] := '1';
      dec ( digits ) ;
      value := value shr 1;
    end;
end;
---------
jeg mangler bare hvordan jeg bruger fuktionen
jeg har min input edit = dec_edit.text
og output edit = bin_edit_text

begin
bin_edit.text:=string(inttobin(dec_edit.text));
end;

men så får jeg incompatible types integer and tcaption
min hjerne er helt smeltet lige nu af at lede og tænke over det her :) det er sikkert meget simpelt.
hvor og hvordan konventerer jeg den longint til en streng ?
Avatar billede okula Nybegynder
22. januar 2011 - 15:05 #3
skal vel lige siges at jeg er nybegynder endnu :)
Avatar billede 2Mida Praktikant
22. januar 2011 - 15:13 #4
IntToBin returnerer en streng

Bin_Edit.Text := IntToBin(Dec_Edit.Text);

Det er i HexToInt og BinToInt du skal konverterer - de returnerer begge en LongInt
Avatar billede arne_v Ekspert
22. januar 2011 - 15:13 #5
Til inspiration:

const
  DIGITS = '0123456789ABCDEF';

Function FromStr(s : string; radix : integer) : integer;

var
  res, i : integer;
begin
  res := 0;
  for i := 1 to length(s) do begin
    res := res * radix + (Pos(s[i], DIGITS) - 1);
  end;
  FromStr := res;
end;

Function FromBinStr(s : string) : integer;

begin
  FromBinStr := FromStr(s, 2);
end;

Function FromOctStr(s : string) : integer;

begin
  FromOctStr := FromStr(s, 8);
end;

Function FromDecStr(s : string) : integer;

begin
  FromDecStr := FromStr(s, 10);
end;

Function FromHexStr(s : string) : integer;

begin
  FromHexStr := FromStr(s, 16);
end;

function ToStr(v : integer; radix : integer) : string;

var
  tmp : integer;
  res : string;

begin
  res := '';
  tmp := v;
  while tmp > 0 do begin
    res := DIGITS[tmp mod radix + 1] + res;
    tmp := tmp div radix;
  end;
  ToStr := res;
end;

Function ToBinStr(v : integer) : string;

begin
  ToBinStr := ToStr(v, 2);
end;

Function ToOctStr(v : integer) : string;

begin
  ToOctStr := ToStr(v, 8);
end;

Function ToDecStr(v : integer) : string;

begin
  ToDecStr := ToStr(v, 10);
end;

Function ToHexStr(v : integer) : string;

begin
  ToHexStr := ToStr(v, 16);
end;
Avatar billede okula Nybegynder
22. januar 2011 - 17:12 #6
Arne_v : tak for inspiration, men det er lige teknisk nok for mig endnu desværre, men det skal nok komme :) jeg forstår dele af det men hele sammenhængen.. nej :(

2Mida : det giver lidt mere mening, men "IntToBin returnerer en streng" er det ikke også det jeg skal bruge i en edit.text capion ?

tror jeg skal holde en lille pause :)
Avatar billede arne_v Ekspert
22. januar 2011 - 17:18 #7
Tricket er at det er en generel metode.

Du kan også bruge den til 7 tals systemet og 13 tals systemet.
Avatar billede 2Mida Praktikant
22. januar 2011 - 18:18 #8
okula: Arne er god - du kan med fordel kopierer hans kode til senere brug.

Du skal ikke sætte resultatet i Edit's caption men i text propertyen

Eller brug en Memo komponent...

Memo1.Lines.Add(IntToBin(Dec_Edit.Text));

så du kan afprøve flere input i samme session

Check ham her for videoer
http://www.codegearguru.com/

..Ole
Avatar billede okula Nybegynder
13. februar 2011 - 14:45 #9
Arne

Jeg har terpet din ligning :)
og nu virker den jo logisk nok, og jeg har fået det til at virke

Skriv svar
Avatar billede arne_v Ekspert
13. februar 2011 - 16:23 #10
ok
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