Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   error violation addres 004bb40, read addres FFFFFFE (https://www.clubdelphi.com/foros/showthread.php?t=73396)

chelo_lpa 18-04-2011 15:09:10

error violation addres 004bb40, read addres FFFFFFE
 
tengo que en un programa hacer lo siguiente.
Desarrollar un analizador de textos que dado un texto permita obtener información referida a las palabras, caracteres y números que contiene.
Se utilizará la interfaz de la Figura 5 formada por un MainMenu, un ToolBar y un Memo.
El menú se detalla en la Figura 6. El texto a analizar puede ingresarse directamente en el Memo desde teclado o cargarse desde un archivo existente a través de la opción „Archivo\Abrir’ del menú principal.
La opción „Archivo\Guardar como…’ permite ingresar un nombre de archivo para guardar el texto del Memo. Si se selecciona „Archivo\Guardar’ se salvará con el último nombre de archivo ingresado; si no existe ninguno deberá realizar las mismas acciones que
Seminario de Lenguajes – Opción Delphi – Curso 2011
4
‘Archivo\Guardar como …’. Los botones del ToolBar que aparecen debajo del menú comparten los eventos con las opciones correspondientes.
El análisis a realizar corresponde a la opción ‘Estadística’ del menú principal cuyo detalle se observa en la figura 7.
Figura 5
Figura 6
Figura 7
Algunos detalles a tener en cuenta:
- Las imágenes que aparecen en el menú y en los botones están caragdas en un componente TImageList.
- Sobre el Memo, a la derecha, aparece el último nombre de archivo ingresado. Este nombre será el que se utilice para guardar si se selecciona ‘Archivo\Guardar’.
- Las opciones para guardar el texto permanecen deshabilitadas mientras el Memo esté vacío.
- Se asume que los números enteros no utilizan signos de puntuación (ej: coma o punto para separar los miles).

Mi codigo esta dividido en 3 forms,
Código Delphi [-]
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ImgList, StdCtrls, ToolWin, ComCtrls, ExtDlgs;

type
  TCuatro = class(TForm)
    MainMenu1: TMainMenu;
    Archivo1: TMenuItem;
    Abrir1: TMenuItem;
    Guardar1: TMenuItem;
    Guardarcomo1: TMenuItem;
    N1: TMenuItem;
    Salir1: TMenuItem;
    Estadisticas1: TMenuItem;
    LetrasNmeros1: TMenuItem;
    Palabras1: TMenuItem;
    ToolBar1: TToolBar;
    Button1: TButton;
    Button2: TButton;
    ImageList1: TImageList;
    Memo: TMemo;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure LetrasNmeros1Click(Sender: TObject);
    procedure Palabras1Click(Sender: TObject);
    procedure MemoChange(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Cuatro: TCuatro;

implementation

uses Unit4, Unit3;
{$R *.dfm}

procedure TCuatro.Button1Click(Sender: TObject);
{ Proceso Abrir }
begin
  if (OpenDialog1.Execute) then
  begin
    Guardar1.Enabled := true;
    Memo.lines.loadfromfile(OpenDialog1.filename);
  end;
end;

procedure TCuatro.Button2Click(Sender: TObject);
{ Proceso Guardar }
begin
  if (SaveDialog1.Execute) then
  begin
    Memo.lines.savetofile(SaveDialog1.filename);
  end;
end;

procedure TCuatro.LetrasNmeros1Click(Sender: TObject);
{ envia a procesar al "form3" }
begin
  form3.ShowModal;
end;

procedure TCuatro.Palabras1Click(Sender: TObject);
{ envia a procesar al "form4 }
begin
  Form4.ShowModal;
end;

procedure TCuatro.MemoChange(Sender: TObject);
{ habilita o desabilita los botones segun sea necesario }
begin
  Button2.Enabled := false;
  Guardar1.Enabled := false;
  Guardarcomo1.Enabled := false;
  if Memo.lines.Count <> 0 then
  begin
    Button2.Enabled := true;
    Guardar1.Enabled := true;
    Guardarcomo1.Enabled := true;
  end;
end;
end.

unit Unit3;

interface

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

type
  TForm3 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Cletras: TLabel;
    CDLetras: TLabel;
    CVocales: TLabel;
    CConsonantes: TLabel;
    Centeros: TLabel;
    CFlotantes: TLabel;
    procedure FormActivate3(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  setnum = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
  voc = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'U', 'á', 'é', 'í', 'ó', 'ú',
    'Á', 'É', 'Í', 'Ó', 'Ú'];
  cons = ['b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'ñ', 'p', 'q',
    'r', 's', 't', 'v', 'w', 'x', 'y', 'z', 'B', 'C', 'D', 'F', 'G', 'H', 'J',
    'K', 'L', 'M', 'N', 'Ñ', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'X'];
var
  Form3: TForm3;

implementation

procedure TForm3.FormActivate3(Sender: TObject);
var
  letras: set of char;
  num, mem: string;
  cletdist, ccons, cvoc, cent, clet, cflot, i, a, b: integer;
  ok1, ok2: boolean;
begin
  letras := voc + cons;
  cletdist := 0;
  ccons := 0;
  cvoc := 0;
  cent := 0;
  clet := 0;
  cflot := 0;
  i := 0;
  { Inicializo Las variables }
  CDLetras.caption := inttostr(cletdist);
  CConsonantes.caption := inttostr(ccons);
  CVocales.caption := inttostr(cvoc);
  Centeros.caption := inttostr(cent);
  Cletras.caption := inttostr(clet);
  CFlotantes.caption := inttostr(cflot);
  mem := cuatro.memo.lines.text;
  { en el caso de que el usuario no haya escrito nada, pongo todos los resultados
    en cero, ya que no hubo cambios en las variables }
  while (length(mem) >= i) do
  begin
    if (mem[i] in voc) then
      cvoc := cvoc + 1
    else if (mem[i] in cons) then
      ccons := ccons + 1;
    clet := clet + 1;
    if (mem[i] in letras) then
    begin
      {letras := letras -  mem[i] ;} { COMO SE HACEEEE!!!! se le saca la letra leida al set
        LA IDEA ES, AL CONJUNTO QUE TENGO BORRARLE UN DATO }
      cletdist := cletdist + 1
    end;
    i := i + 1;
  end;
  i := 0;
  { primer recorrido, solo cuenta letras distinguiendo vocales de consonantes }
  while (length(mem) >= i) do
  begin
    a := 0;
    while (length(mem) >= i) and (mem[i] <> ' ') do
    begin
      if (mem[i] in setnum) or (mem[i] = ',') then
      begin
        num[a] := mem[i];
        a := a + 1;
      end;
      i := i + 1;
    end;
    b := 0;
    ok1:=false; ok2:=false;
    while (length(num) <= a) do
    begin
      if (num[b] in setnum) then
      begin
        ok1 := true;
        b := b + 1
      end
      else if (num[b] = ',') then
      begin
        b := b + 1;
        if (num[b] in setnum) and (b <= length(num)) then
          ok2 := true;
      end;
    end;
    if (ok1) and (ok2) then
      cflot := cflot + 1
    else if (ok1) then
      cent := cent + 1;
    i := i + 1;
  end;
  { segundo recorrido, se encarga de los numeros flotantes y enteros }
  CDLetras.caption := inttostr(cletdist);
  CConsonantes.caption := inttostr(ccons);
  CVocales.caption := inttostr(cvoc);
  Centeros.caption := inttostr(cent);
  Cletras.caption := inttostr(clet);
  CFlotantes.caption := inttostr(cflot);
  { imprimo Resultados }
end;
{$R *.dfm}

end.



unit Unit4;

interface

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

type
  TForm4 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Cpalablras: TLabel;
    Cdistpalabras: TLabel;
    Pmaslarga: TLabel;
    Cantmaslarga: TLabel;
    procedure FormActivate4(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  setnum = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
  voc = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'U', 'á', 'é', 'í', 'ó', 'ú',
    'Á', 'É', 'Í', 'Ó', 'Ú'];
  cons = ['b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'ñ', 'p', 'q',
    'r', 's', 't', 'v', 'w', 'x', 'y', 'z', 'B', 'C', 'D', 'F', 'G', 'H', 'J',
    'K', 'L', 'M', 'N', 'Ñ', 'P', 'Q', 'R', 'S', 'T', 'V', 'W', 'X', 'Y', 'X'];
var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.FormActivate4(Sender: TObject);
const
  finvector=99999;
type
  arreglo = array [1 ..finvector] of string;
var
  ok:boolean;
  vector:arreglo;
  comp,mem, max:string;
  i, dl,n, cp, cmpal:integer;
begin
  for i := 1 to finvector do
   vector[i]:='';
  {VACIO EL VECTOR}
  dl:=0;
  max:='';
  cp:=0;
  i:=0;
  mem:=cuatro.memo.lines.text;
  while(length(mem)<=i)do
   begin
    comp:='';
    ok:=(length(mem)<=i)and(mem[i]<>' ')and(mem[i]<>',')and(mem[i]<>'.')and
                                                         not(mem[i] in cons);
    while(ok)do
     begin
       if(mem[i] in voc)or (mem[i] in cons)then
        begin
         comp:=comp+mem[i];
        end;
       i:=i+1;
      end;
    ok:=(length(mem)<=i)and(mem[i]<>' ')and(mem[i]<>',')and(mem[i]<>'.')and
                                                         not(mem[i] in cons);
    while not(ok)do
     i:=i+1;
    ok:=true;
    n:=0;
    while(nand(ok)do
     begin
       n:=n+1;
       if(vector[n]='')then   {si el vector esta vacio, añado la nueva palabra}
        begin
         ok:=false;
         vector[n]:=comp;
         dl:=dl+1;
        end
       else                   {si no, sumo +1 a cp(cantidad de palabras)}
        begin
          if(vector[n]<>comp)then
            cp:=cp+1;
        end;
     end;
    if(length(comp)>length(max))then
     begin
       max:=comp;
       cmpal:=1;
     end
    else
     if(length(comp)=length(max))and(comp=max)then
      cmpal:=cmpal+1;
   end;
  Cdistpalabras.Caption:=inttostr(dl);
  pmaslarga.Caption:=max;
  cantmaslarga.Caption:=inttostr(cmpal);
  cpalablras.caption:=inttostr(cp);
end;


end.


espero que se entienda... es mi primer pregunta. gracias de antemano, quien quiera me dice y lo cargo en una pagina dentro de un rar, para qe puedan ejecutarlo o algo... pero no logro solucionarlo.

Ahi esta el ejercicio: descarga

ecfisa 18-04-2011 19:24:49

Hola chelo_lpa y bienvenido a los foros de Club Delphi.:)

Ya agregué un enlace a la página de descargas donde está tu código y cambié las etiquetas [quote] [/quote] por [delphi] [/delphi] para que sea más legible.

Un saludo.

cloayza 19-04-2011 20:52:53

Te aconsejaria realizar los siguientes cambios:

Código Delphi [-]
{ primer recorrido, solo cuenta letras distinguiendo vocales de consonantes }
  while (length(mem) >= i) do
  begin
    a := 0;
    while (length(mem) >= i) and (mem[i] <> ' ') do
    begin
      if (mem[i] in setnum) or (mem[i] = ',') then
      begin
        //num[a]:=mem[i];
        num := Num+mem[i];
        a := a + 1;
      end;
      i := i + 1;
    end;
    b := 1; //B:=0;
    ok1:=false; ok2:=false;
    while ((length(num) <= a) and (b<=length(num))) do

Un abrazo


La franja horaria es GMT +2. Ahora son las 07:57:02.

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