Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Histograma! (https://www.clubdelphi.com/foros/showthread.php?t=81526)

Coltlac 22-11-2012 01:11:24

Histograma!
 
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

Código Delphi [-]
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:




Saludos. :)

nlsgarcia 24-11-2012 22:13:58

Coltlac,

Cita:

Empezado por Coltlac (Mensaje 450126)
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:
Código Delphi [-]
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/Delph...n+TeeChart.rar

Espero sea útil :)

Nelson.


La franja horaria es GMT +2. Ahora son las 10:04:08.

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