Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   evento onclick del button (https://www.clubdelphi.com/foros/showthread.php?t=55087)

richard187 08-04-2008 01:20:33

evento onclick del button
 
hola.

soy nuevo en esto del entorno de delphi

me dieron una tarea sobre pilas y colas para ke desarrolle un programa con su interfaz grafica

kisiera ke me ayuden en un problema que tengo al programar el evento onclic del button

tengo las siguientes funciones y procedimietos OPP
el problema ya esta casi resuelto, cree una aplicacion y una unit nueva

la unit uPilas es la siguiente..
( en esto no hay problemas )

Cita:

unit uPilas;
interface
uses StdCtrls, Dialogs;
const maxpila=10;
type
tipoinfo = string ;
TPila = object
private
tope: 0..maxpila;
items:array [1..maxpila]of tipoinfo;
public
constructor init;
function vacia:boolean;
function llena:boolean;
procedure insertar(x: tipoinfo);
function eliminar:tipoinfo;
end;
implementation
constructor TPila.init;
begin
tope:=0;
end;
function TPila.vacia:boolean;
begin
vacia:=(tope=0);
end;
function TPila.llena:boolean;
begin
llena:=(tope=maxpila);
end;
function TPila.eliminar:tipoinfo;
begin
if vacia then ShowMessage('Pila vacia')
else
begin
eliminar:=items[tope];
dec(tope);
end;
end;
procedure TPila.insertar(x: tipoinfo);
begin
if llena then showmessage('Pila llena')
else
begin
inc(tope);
items[tope]:=x;
end;
end;
end.
en la segunda unidad donde se llaman a las funciones lo hice de la siguiente manera..
en realidad es aqui donde me pierdo.. no se como llamar correctamente
en si el programa se ejecuta normal, pero al momento de insertar o eliminar un elemento me sale un error por fa ayudenme :(

la unit ufPilas de la forma es la siguiente:

Cita:

unit ufPilas;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
eInsertar: TEdit;
bInsertar: TButton;
bEliminar: TButton;
lbMostrar: TListBox;
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure bInsertarClick(Sender: TObject);
procedure bEliminarClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses uPilas;
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var p: TPila;
begin
p.init;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
eInsertar.SetFocus;
eInsertar.SelectAll;
end;
procedure TForm1.bInsertarClick(Sender: TObject);
var p: TPila;
begin
if length(eInsertar.Text)=0 then
showmessage('texto en blanco')
else
begin
lbmostrar.items.Append(eInsertar.Text);
p.insertar(eInsertar.Text);
eInsertar.setfocus;
eInsertar.SelectAll;
end;
end;
procedure TForm1.bEliminarClick(Sender: TObject);
var p: TPila; x: Tpila;
begin
p.eliminar();
lbmostrar.Items.delete(lbmostrar.Items.InstanceSize);
end;

end.

espero me ayuden

delfib 08-04-2008 01:26:02

Intenta con p:= tpila.init; en lugar de llamar solo p.init

richard187 08-04-2008 02:01:46

error al llamar la funcion
 
en realidad el problema esta cuando intento llamar a la funcion con el ebutton

en los siguientes codigos

Código Delphi [-]
procedure TForm1.bInsertarClick(Sender: TObject);
var p: TPila;
  begin
    if length(eInsertar.Text)=0 then
       showmessage('texto en blanco')
     else
         begin
         lbmostrar.items.Append(eInsertar.Text);
         p.insertar(eInsertar.Text);
         eInsertar.setfocus;
         eInsertar.SelectAll; 
         end;
  end;
procedure TForm1.bEliminarClick(Sender: TObject);
var p: TPila; x: Tpila;
begin
  p.eliminar();
  lbmostrar.Items.delete(lbmostrar.Items.InstanceSize);
end;



este es el error que me sale cuando lo ejecuto:

http://www.sucrevip.net/img/error.JPG

Northern 08-04-2008 02:18:25

Todos los TObject antes de inicializarlos hay que crearlos:

P := TPila.Create;

...después les asignas valores, por ejemplo P.Tope := 0;

y al finalizar los liberas

P.Free;


pero si no les asignas memoria -> crash!!!! :)


Saludos

richard187 08-04-2008 02:30:19

gracias por la ayuda pero:

El error persiste
creo ke el problema esta en como estoy llamando a las funciones OOP

ahh. y por cierto.. el evento onclick del button bEliminar no realiza su tarea,

les agradeceria si me envian nuevas sugerencias para programar los eventos de los dos button : bInsertar, bEliminar.

gracias..

porfa ayuden..

keyboy 08-04-2008 02:33:39

A ver, no hace falta "construir" el objeto con

Código Delphi [-]
p := TPila.Create;

ó

Código Delphi [-]
p := TPila.Init;

De hecho, la primera da un error de Undeclared identifier. Sí, leyeron bien. No hace falta porque el compañero Richard está usando el tipo object, que no sigue el mismo modelo de construcción que TObject.

Cita:

Empezado por ayuda de delphi
You can create instances of an object type using the New procedure and destroy them with the Dispose procedure, or you can simply declare variables of an object type, just as you would with records.

El ejemplo que pone, lo he probado y no me ha presentado errores, siempre y cuando se use P.Init o se de un valor inicial a tope, de lo contrario en la inserción

Código Delphi [-]
items[tope]:=x;

seguramente se accederá a un elemento inexistente del arreglo.

Por otra parte, aunque no me marca errores, se debe usar una variable P que trascienda los eventos OnClick. Al ser variables locales, una no tiene que ver con la otra.

Pero, lo más importante, es que deje de usar el tipo object, que ya no se recomienda, y use las clases tal como todos las conocemos.

Bye

richard187 08-04-2008 03:19:09

a pesar de todas las ayudas..
sobretodo a keyboy que me aclaro algunas dudas..

mi programa sigue con los mismos errores :S

nose que hizo keyboy para que a el mi programa no le presente errores o kisas la version del delphi influye (estoy usando la version 7.2)

ayuden uds que saben del tema

thanks :)

ah y por cierto.. el uso del tipo object, me recomendo la docente de la materia.. (de uso impresindible para la estructura de los datos)

link de la imagen del error: http://www.sucrevip.net/img/error.JPG

y gracias nuevamente :)

Northern 08-04-2008 03:22:42

Cierto, ahora que lo miré un poco yo lo haría de esta manera:

Código Delphi [-]
unit uPilas;
interface
uses StdCtrls, Dialogs;
const
  maxpila=10;
type
  tipoinfo = string ;
  TPila = class(Tobject)
  private
    tope: 0..maxpila;
    items:array [1..maxpila]of tipoinfo;
  public
    constructor Create;
    function vacia: boolean;
    function llena: boolean;
    procedure insertar(x: tipoinfo);
    function eliminar: tipoinfo;
  end;
implementation
constructor TPila.Create;
begin
  inherited Create;
  tope:=0;
end;
function TPila.vacia: boolean;
begin
  vacia := (tope = 0);
end;
function TPila.llena: boolean;
begin
  llena := (tope=maxpila);
end;
function TPila.eliminar: tipoinfo;
begin
  if vacia then
    ShowMessage('Pila vacia')
  else
  begin
    eliminar:=items[tope];
    dec(tope);
  end;
end;
procedure TPila.insertar(x: tipoinfo);
begin
  if llena then
    showmessage('Pila llena')
  else
  begin
    inc(tope);
    items[tope] := x;
  end;
end;
end.



La unit ufPilas (la del form):
Código Delphi [-]
unit ufPilas;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    eInsertar: TEdit;
    bInsertar: TButton;
    bEliminar: TButton;
    lbMostrar: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure bInsertarClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
uses uPilas;
{$R *.dfm}
var
  P: TPila;
procedure TForm1.FormCreate(Sender: TObject);
begin
  p := TPila.Create;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
  eInsertar.SetFocus;
  eInsertar.SelectAll;
end;
procedure TForm1.bInsertarClick(Sender: TObject);
begin
  if length(eInsertar.Text) = 0 then
    showmessage('texto en blanco')
  else
  begin
    lbmostrar.items.Append(eInsertar.Text);
    p.insertar(eInsertar.Text);
    eInsertar.setfocus;
    eInsertar.SelectAll;
  end;
end;
procedure TForm1.bEliminarClick(Sender: TObject);
var
  x: Tpila;
begin
  p.eliminar();
  lbmostrar.Items.delete(lbmostrar.ItemIndex);
end;
end.


Así ya funciona...eso creo


Saludos

richard187 08-04-2008 04:01:59

gracias a todos las participaciones todas me fueron sumamente utiles.

ahora me surgio un ultimo problema, talves sea mas de logica que de uso de la sintaxis de delphi, pero quisiera algunos sugerencias..

como puedo programar el evento onclick del button bEliminar, para que elimine los elementos de la pila uno por uno (como corresponde en una pila), puesto que como yo lo puse no funciona correctamente

gracias nuevamente..!!


La franja horaria es GMT +2. Ahora son las 00:19:51.

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