Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Coloboración Paypal con ClubDelphi

 
 
Herramientas Buscar en Tema Desplegado
  #6  
Antiguo 11-09-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Nicolas.

Hoy andaba con nostalgia de épocas de estudiante...

Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit: TEdit;
    RGroupBases: TRadioGroup;
    procedure RGroupBasesClick(Sender: TObject);
    procedure EditKeyPress(Sender: TObject; var Key: Char);
    procedure FormShow(Sender: TObject);
  private
    FBasePrevia: Integer;
    procedure DivisionReiterada(var Numero:string; Base:integer);
    procedure SumaPonderada(var Numero:string; Base:integer);
  public
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}

uses Math;

procedure TForm1.FormShow(Sender: TObject);
begin
  // Cargar Items + Valor de las bases
  with RGroupBases do
  begin
    Items.AddObject('Binario', TObject(2));
    Items.AddObject('Octal', TObject(8));
    Items.AddObject('Decimal', TObject(10));
    Items.AddObject('Hexadecimal', TObject(16));
  end;
  FBasePrevia:= 2;           // Binario
  RGroupBases.ItemIndex:= 0; // Primer Item
  // Previamente quitar evento RadioGroup.OnClick del Object Inspector
  RGroupBases.OnClick:= RGroupBasesClick;
end;

{ Funcion que pasa de base N a decimal }
function BaseNToDec(Numero : string; Base : byte): Integer;
const
  BHex = '0123456789ABCDEF';
var
  i : Byte;
begin
  Result:=0;
  for i:=1 to length(Numero) do
    Result:= Result * Base + Pos(Upcase(Numero[i]), BHex) - 1;
end;

{ Suma ponderada }
procedure TForm1.SumaPonderada (var Numero:string; Base:integer);
var
  i:integer;
  m:Extended;
begin
  m:=0;
  for i:= 1 to Length(Numero) do
  begin
    case Numero[i] Of
      'A': m:= m + 10 * Power(FBasePrevia, Length(Numero) - i);
      'B': m:= m + 11 * Power(FBasePrevia, Length(Numero) - i);
      'C': m:= m + 12 * Power(FBasePrevia, Length(Numero) - i);
      'D': m:= m + 13 * Power(FBasePrevia, Length(Numero) - i);
      'E': m:= m + 14 * Power(FBasePrevia, Length(Numero) - i);
      'F': m:= m + 15 * Power(FBasePrevia, Length(Numero) - i);
      else
       m:= m + StrToInt(Numero[i]) * Power(FBasePrevia, Length(Numero) - i);
    end;
  end;
  Numero:= FloatToStr(m);
end;

{ División reiterada }
procedure TForm1.DivisionReiterada(var Numero:string; Base:integer);
var
  num: integer;
  d:integer;
begin
  // Calcular en base a la base previa al click
  num:= BaseNToDec(Numero, FBasePrevia);  // Pasar a base 10
  Numero:=  '';
  while (num > 0) do
  begin
    d:= num mod Base;
    num:= num div Base;
    case d of
      10: Numero:= 'A' + Numero;
      11: Numero:= 'B' + Numero;
      12: Numero:= 'C' + Numero;
      13: Numero:= 'D' + Numero;
      14: Numero:= 'E' + Numero;
      15: Numero:= Numero + 'F';
      else
        Numero:= IntToStr(d) + Numero;
    end;
  end;
  Numero:= Numero;
end;

procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
begin
  Key:= UpCase(Key);         // A mayúsculas
  case RGroupBases.ItemIndex Of
    0: If not (Key in ['1','0', #8]) then key:= #0;
    1: If not (Key in ['0'..'7', #8]) then key:= #0;
    2: If not (Key in ['0'..'9', #8]) then key:= #0;
    3: If not (Key in ['0'..'9', 'A'..'F', #8]) then key:= #0;
  end;
end;

{ RadioGroup OnClick }
procedure TForm1.RGroupBasesClick(Sender: TObject);
var
  Valor: string;
begin
  Valor:= Edit.Text;
  Edit.SetFocus;
  if RGroupBases.ItemIndex <> 2 then   // Binario, Octal, Hexadecimal
  begin
    case RGroupBases.ItemIndex of
       0: DivisionReiterada(Valor,2);
       1: DivisionReiterada(Valor,8);
       2: DivisionReiterada(Valor,10);
       3: DivisionReiterada(Valor,16)
    end;
  end
  else                                 // Decimal
  begin
    case RGroupBases.ItemIndex of
      0: SumaPonderada(Valor,2);
      1: SumaPonderada(Valor,8);
      2: SumaPonderada(Valor,10);
      3: SumaPonderada(Valor,16);
    end;
  end;
  // Actualizar valor de la base
  FBasePrevia:= Integer(RGroupBases.Items.Objects[RGroupBases.ItemIndex]);
  Edit.Text:= Valor;
end;

end.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 11-09-2011 a las 15:14:22. Razón: Agregar comentario
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Conversion de VB a Delphi jjmcira Varios 8 06-04-2011 14:51:23
Numeración de Factura zeta2 Varios 3 11-02-2010 20:21:56
Conversión de caracteres delphi 7 y 2009 ander Varios 0 03-12-2009 15:37:12
Conversion a delphi 6 mapc Varios 2 01-09-2006 14:27:56
Conversión de linea en Vbasic a Delphi torito Varios 4 09-06-2005 19:38:00


La franja horaria es GMT +2. Ahora son las 08:26:47.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi