PDA

Ver la Versión Completa : Histograma!


Coltlac
22-11-2012, 01:11:24
Buenas tardes, soy nuevo en el foro, y tambien soy nuevo en delphi
tengo un problema, tengo que hacer un programa que abra y lea un archivo de texto y posteriormente con esa informacion debe crear un histograma de barras con la frecuencia con la cual aparecen las letras en el archivo, y lo hice pero el histograma no muestra la informacion correcta de la letras, les anexo mi codigo, espero me puedan ayudar, gracias


procedure TForm2.Button1Click(Sender: TObject);
var
i,divs,longX,longY : Integer;
nextX,nextY : Integer;
alto,largo : Integer;
Color : TColor;
nx,ny : Integer;
begin
divs:=0;
alto:=Image1.Height;
largo:=0;
nx:=760;
ny:=Image1.Height;
{
if Limpiar then begin
nx:=760;
for i := 0 to cant do begin
Canvas.TextOut(nx,ny,'');
nx:=nx-longX;
end;
Limpiar:=False;
end;

for i := 0 to Length(Letras) do begin
case Letras[i] of
'z': inc(Minusculas[0]);
'y': inc(Minusculas[1]);
'x': inc(Minusculas[2]);
'w': inc(Minusculas[3]);
'v': inc(Minusculas[4]);
'u': inc(Minusculas[5]);
't': inc(Minusculas[6]);
's': inc(Minusculas[7]);
'r': inc(Minusculas[8]);
'q': inc(Minusculas[9]);
'p': inc(Minusculas[10]);
'o': inc(Minusculas[11]);
'ñ': inc(Minusculas[12]);
'n': inc(Minusculas[13]);
'm': inc(Minusculas[14]);
'l': inc(Minusculas[15]);
'k': inc(Minusculas[16]);
'j': inc(Minusculas[17]);
'i': inc(Minusculas[18]);
'h': inc(Minusculas[19]);
'g': inc(Minusculas[20]);
'f': inc(Minusculas[21]);
'e': inc(Minusculas[22]);
'd': inc(Minusculas[23]);
'c': inc(Minusculas[24]);
'b': inc(Minusculas[25]);
'a': inc(Minusculas[26]);
'Z': inc(Mayusculas[0]);
'Y': inc(Mayusculas[1]);
'X': inc(Mayusculas[2]);
'W': inc(Mayusculas[3]);
'V': inc(Mayusculas[4]);
'U': inc(Mayusculas[5]);
'T': inc(Mayusculas[6]);
'S': inc(Mayusculas[7]);
'R': inc(Mayusculas[8]);
'Q': inc(Mayusculas[9]);
'P': inc(Mayusculas[10]);
'O': inc(Mayusculas[11]);
'Ñ': inc(Mayusculas[12]);
'N': inc(Mayusculas[13]);
'M': inc(Mayusculas[14]);
'L': inc(Mayusculas[15]);
'K': inc(Mayusculas[16]);
'J': inc(Mayusculas[17]);
'I': inc(Mayusculas[18]);
'H': inc(Mayusculas[19]);
'G': inc(Mayusculas[20]);
'F': inc(Mayusculas[21]);
'E': inc(Mayusculas[22]);
'D': inc(Mayusculas[23]);
'C': inc(Mayusculas[24]);
'B': inc(Mayusculas[25]);
'A': inc(Mayusculas[26]);
end; //end case
end; //end for
for i := 0 to 26 do begin
Total[i]:=Mayusculas[i]+Minusculas[i];
if Total[i]<>0 then
inc(divs);
end;
longX:=round(Image1.Width/divs);
for i := 0 to 26 do begin
if Total[i]<>0 then begin
nextX:=longX+largo;
nextY:=Total[i]*5;
Color:=RGB(Random(255),Random(255),Random(255));
Image1.Canvas.Brush.Color:=Color;
Image1.Canvas.Rectangle(largo,Image1.Height,nextX,nextY);
Font.Color:=clBlack;
Brush.Style:=bsClear;
Font.Size:=8;
Canvas.TextOut(nx,ny,Let[i]);
nx:=nx-longX;
largo:=nextX;
alto:=nextY;
inc(cant);
end;
end;
Limpiar:=True;
end; //end evento

procedure TForm2.FormCreate(Sender: TObject);
begin
Memo1.Text:='';
Image1.Canvas.Pen.Color:=Clblack;
Image1.Canvas.Brush.Color:=ClWhite;
Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height);
end;

end.

Faust
22-11-2012, 02:10:14
Hola... bienvenido, veo que es tu primera vez en el club, te recomiendo leer la guía de estilo y utilizar las etiquetas debidas para mostrar el código, ojalá algún moderador nos haga favor de ponerlas... deja ver que puedo hacer por ti...

Lo copié y lo pegué, pero me hace falta más info para poder ayudarte como las variables que en tu código no están declaradas... ¿qué versión de delphi usas? Si tu versión tiene en la paleta de componentes TeeChart Std puedes usar el TChart para crear la gráfica.

Saludos

ecfisa
22-11-2012, 05:57:22
Hola Coltlac, bienvenido a Club Delphi.

Como ya te comentó el amigo Faust, las etiquetas le dan mas legibilidad al código y de ese modo, vas a obtener mas respuestas (ya las agregué en tu mensaje).

Te pongo una imágen que explica el uso:

http://img403.imageshack.us/img403/3461/75416396.jpg


Saludos. :)

nlsgarcia
24-11-2012, 22:13:58
Coltlac,


tengo que hacer un programa que abra y lea un archivo de texto y posteriormente con esa informacion debe crear un histograma de barras con la frecuencia con la cual aparecen las letras en el archivo


Revisa este código:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, TeeProcs, TeEngine, Chart, Series, TypInfo;

type
TForm1 = class(TForm)
Chart1: TChart;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
Series1: TBarSeries;
BitBtn3: TBitBtn;
ComboBox1: TComboBox;
BitBtn4: TBitBtn;
BitBtn5: TBitBtn;
CheckBox1: TCheckBox;
Label1: TLabel;
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure BitBtn5Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TNameSeries = (Bar,HorizBar,Line,Area,Point,Pie);

const
LMin : String = 'abcdefghijklmnñopqrstuvwxyz';
LMay : String = 'ABCDEFGHIJKLMNÑOPQRSTUVWXYZ';

var
Form1: TForm1;
F : TStringList;
CountLMin : Array[1..27] of Integer;
CountLMay : Array[1..27] of Integer;
FileProcess : Boolean;

implementation

{$R *.dfm}

// Reset de Gráfico
procedure Reset;
begin
FileProcess := False;
FillChar(CountLMin,SizeOf(CountLMin),0);
FillChar(CountLMay,SizeOf(CountLMin),0);
with form1 do
begin
Series1.Clear;
ComboBox1.Text := ComboBox1.Items.Strings[0];
end;
end;

// Procesa Archivo TXT (Instancia, Lee y Sumariza por Letras el Archivo de Texto Seleccionado)
Procedure ReadTextFile(FileName : String);
var
i,j : Integer;
P : Integer;
C : String;
begin
FileProcess := False;
Reset;
F := TStringList.Create;
try
F.LoadFromFile(FileName);
except
MessageDlg('Error de I/O', mtinformation, [mbok], 0);
F.Free;
Exit;
end;
for i := 0 to F.Count-1 do
begin
for j := 1 to Length(F.Strings[i]) do
begin
C := Copy(F.Strings[i],j,1);
P := Pos(C,LMin);
if (P > 0) then
Inc(CountLMin[P]);
P := Pos(C,LMay);
if (P > 0) then
Inc(CountLMay[P]);
end;
end ;
FileProcess := True;
F.Free;
end;

// Selección de Archivo a Graficar
procedure TForm1.BitBtn2Click(Sender: TObject);
var
openDialog : TOpenDialog;
begin

openDialog := TOpenDialog.Create(self);
openDialog.InitialDir := GetCurrentDir;
openDialog.Options := [ofFileMustExist];
openDialog.Filter := 'Archivo de Texto a Graficar|*.txt';
openDialog.FilterIndex := 1;

if openDialog.Execute then
ReadTextFile(openDialog.FileName)
else
MessageDlg('No Se Proceso Ningún Archivo de Texto',mtinformation,[mbok],0);

openDialog.Free;

end;

// Histograma de Letras Minúsculas
procedure TForm1.BitBtn1Click(Sender: TObject);
var
C : String;
i : Integer;
begin

if not FileProcess then
begin
MessageDlg('Seleccione un Archivo de Texto',mtinformation,[mbok],0);
Exit;
end;

with Series1 do
begin
Clear;
for i := 1 to High(CountLMin) do
begin
C := Copy(LMin,i,1);
Add(CountLMin[i], C, clBlue);
end
end;
end;

// Histograma de Letras Mayúsculas
procedure TForm1.BitBtn3Click(Sender: TObject);
var
C : String;
i : Integer;
begin

if not FileProcess then
begin
MessageDlg('Seleccione un Archivo de Texto',mtinformation,[mbok],0);
Exit;
end;

with Series1 do
begin
Clear;
for i := 1 to High(CountLMay) do
begin
C := Copy(LMay,i,1);
Add(CountLMay[i], C, clRed);
end
end;
end;

// Histograma de Letras Mayúsculas y Minúsculas
procedure TForm1.BitBtn4Click(Sender: TObject);
var
C : String;
i : Integer;
begin

if not FileProcess then
begin
MessageDlg('Seleccione un Archivo de Texto',mtinformation,[mbok],0);
Exit;
end;

with Series1 do
begin
Clear;
for i := 1 to High(CountLMay) do
begin
C := Copy(LMay,i,1);
Add(CountLMay[i]+CountLMin[i], C, clGreen);
end
end;
end;

// Carga el ComboBox con los tipos de Gráficos
procedure TForm1.FormCreate(Sender: TObject);
var
NameSeries : String;
CountSeries : TNameSeries;
begin
for CountSeries := Low(TNameSeries) to High(TNameSeries) do
begin
NameSeries := GetEnumName(TypeInfo(TNameSeries),Integer(CountSeries));
ComboBox1.Items.Add(NameSeries);
end;
ComboBox1.Text := ComboBox1.Items.Strings[0];
CheckBox1.State := cbChecked;
end;

// Cambia el tipo de Gráfico
procedure TForm1.ComboBox1Change(Sender: TObject);
var
NameSeries : TNameSeries;
begin

NameSeries := TNameSeries(GetEnumValue(TypeInfo(TNameSeries),ComboBox1.Text));

Case NameSeries of
Bar : ChangeSeriesType(TChartSeries(Series1),TBarSeries);
HorizBar : ChangeSeriesType(TChartSeries(Series1),THorizBarSeries);
Line : ChangeSeriesType(TChartSeries(Series1),TLineSeries);
Area : ChangeSeriesType(TChartSeries(Series1),TAreaSeries);
Point : ChangeSeriesType(TChartSeries(Series1),TPointSeries);
Pie : ChangeSeriesType(TChartSeries(Series1),TPieSeries);
end;

end;

// Reset Gráfico
procedure TForm1.BitBtn5Click(Sender: TObject);
begin
Reset;
end;

// Cambia el Modo Gráfico 2D <-> 3D
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
Chart1.View3D:=CheckBox1.Checked;
end;

end.

El código anterior hace un Histograma de las Letras contenidas en un archivo de texto con algunas opciones gráficas adicionales por medio del Componente TeeChart.

La aplicación esta en el link: http://terawiki.clubdelphi.com/Delphi/Ejemplos/?download=Histograma+con+TeeChart.rar

Espero sea útil :)

Nelson.