Busqueda

Resultados

viernes, 29 de noviembre de 2013

Busqueda Incremental

Estaba algo lleno de polvo desde mi último post. Pero con el poder creativo avtivado.
Hace poco tuve la necesidad de implementar una búsqueda incremental, como programo en Lazarus, se me ocurrió desarrollar un componente que me facilitara esta labor. Pero pienso que falta pulirlo. Deseo y espero que alguno pueda ayudarme en esta albor y mejorar el componente para que sea los mas eficiente posible. A continuación les dejo el código:


  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
unit Zambusqueda;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, DbCtrls, db,
  DBGrids, StdCtrls;

type
  TZambusqueda = class(TCustomControl)
  private
    { Private declarations }
    FFuenteDatos: TDataSource;
    FCampoDatos: String;

    FBusquedaDatos: TDataSource;
    FCampoBusqueda: String;

    FDBedit: TDBEdit;
    FDBGrid: TDBGrid;

    function GetFuenteDeDatos: TDataSource;
    procedure SetFuenteDeDatos(Value: TDataSource);

    function GetCampoDatos: string;
    procedure SetCampoDatos(const Value: string);

    function GetFuenteDeDatos2: TDataSource;
    procedure SetFuenteDeDatos2(Value: TDataSource);

    function GetCampoDatos2: string;
    procedure SetCampoDatos2(const Value: string);

    procedure DBEditChange(Sender: TObject);
    procedure DBGridCellClick(Column: TColumn);

    procedure DSStateChange(Sender: TObject);
  protected
    { Protected declarations }
     property Edit: TDBEdit read FDBEdit write FDBEdit;
     property DBGrid: TDBGrid read FDBGrid write FDBGrid;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

  published
    { Published declarations }
    property FuenteDatos: TDataSource read GetFuenteDeDatos write SetFuenteDeDatos;
    //property CampoDatos: String read GetCampoDatos write SetCampoDatos;
    property CampoDatos: String read FCampoDatos write SetCampoDatos;

    property BusquedaDatos: TDataSource read GetFuenteDeDatos2 write SetFuenteDeDatos2;
    //property CampoBusqueda: String read GetCampoDatos2 write SetCampoDatos2;
    property CampoBusqueda: String read FCampoBusqueda write SetCampoDatos2;

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Zambrano Controls',[TZambusqueda]);
end;

procedure TZambusqueda.DSStateChange(Sender: TObject);
begin
   FDBGrid.Visible:= (FDBEdit.DataSource.State in dsEditModes) and FDBedit.Focused;
   inherited;
end;

constructor TZambusqueda.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  with GetControlClassDefaultSize do SetInitialBounds(0,0,150,150);

  FDBEdit := TDBEdit.Create(Self);
  FDBEdit.Caption := '';
  FDBEdit.Text    := '';
  FDBEdit.Visible  := True;
  FDBedit.CharCase := ecUppercase;
  FDBEdit.Parent   := Self;
  FDBedit.SetSubComponent(True); //Indica al IDE almacenar las propiedades modificadas
  FDBedit.ControlStyle := FDBedit.ControlStyle - [csNoDesignSelectable];
  FDBEdit.Align    := alTop;
  FDBEdit.OnChange := @DBEditChange;

  FDBGrid := TDBGrid.Create(Self);
  FDBGrid.Visible := False;
  FDBGrid.Parent  := Self;
  FDBGrid.Left := 0;
  FDBGrid.Options    := [dgTabs,dgAlwaysShowSelection,dgConfirmDelete,dgCancelOnExit];
  FDBGrid.ScrollBars := ssAutoVertical;
  FDBGrid.Top   := FDBedit.Height+2;
  FDBGrid.Anchors := [akTop,akLeft,akRight,akBottom];
  FDBGrid.Align := alBottom;
  FDBGrid.SetSubComponent(True);
  FDBGrid.ControlStyle := FDBGrid.ControlStyle - [csNoDesignSelectable];
  FDBGrid.OnCellClick:=@DBGridCellClick;
end;

destructor TZambusqueda.Destroy;
begin
  FDBedit.Destroy;
  FDBGrid.Destroy;
  inherited Destroy;
end;


function TZambusqueda.GetFuenteDeDatos: TDataSource;
begin
  Result := FFuenteDatos;
end;

procedure TZambusqueda.SetFuenteDeDatos(Value: TDataSource);
begin
    if Value=nil then SetCampoDatos('');

    FFuenteDatos := Value;
    FDBedit.DataSource := FFuenteDatos;
    FDBEdit.DataSource.OnStateChange:=@DSStateChange;
end;

function TZambusqueda.GetCampoDatos: string;
begin
  Result := FCampoDatos;
end;

procedure TZambusqueda.SetCampoDatos(const Value: string);
begin
  FCampoDatos := Value;
  FDBEdit.DataField := Value;
end;

procedure TZambusqueda.DBEditChange(Sender: TObject);
var
  Filtro: String;
begin
   FDBGrid.DataSource.DataSet.FilterOptions :=[foCaseInsensitive];
   FDBGrid.DataSource.DataSet.Filtered      :=False;
   if (Length(FDBEdit.Text)>0) and (FDBedit.DataSource.DataSet.State in dsWriteModes)
   then begin
     FDBGrid.Visible:=True;
     Filtro:=FCampoBusqueda + ' like ' + QuotedStr('*'+Trim(FDBEdit.Text)+'*');
     FDBGrid.DataSource.DataSet.Filter   := Filtro;
     FDBGrid.DataSource.DataSet.Filtered := true;
   end
   else begin
     FDBGrid.Visible:=False;
   end;
   inherited;
end;

procedure TZambusqueda.DBGridCellClick(Column: TColumn);
begin
  if not Assigned(FFuenteDatos) then exit;
  if not (FDBedit.DataSource.DataSet.State in dsWriteModes) then Exit;
  FDBEdit.Field.AsString := Trim(FDBGrid.Columns.Items[0].Field.Text);
  FDBGrid.Visible:=false;
end;

function TZambusqueda.GetFuenteDeDatos2: TDataSource;
begin
  Result := FBusquedaDatos;
end;

procedure TZambusqueda.SetFuenteDeDatos2(Value: TDataSource);
begin
    if Value=nil
    then begin
         SetCampoDatos2('');
    end;

    FBusquedaDatos := Value;
    FDBGrid.DataSource := FBusquedaDatos;
end;

function TZambusqueda.GetCampoDatos2: string;
begin
  Result := FCampoBusqueda;
end;

procedure TZambusqueda.SetCampoDatos2(const Value: string);
begin
  FCampoBusqueda := Value;
end;

end.

miércoles, 2 de noviembre de 2011

Función para calcular edad con MySQL

Lo siguiente es el script SQL para crear una función almacena para MySQL que permite calcular la edad

ejemplo de uso:

SELECT edad('1972-12-31','2011-11-02');

el resultado es 38;

 
DROP FUNCTION IF EXISTS edad
delimiter //
CREATE FUNCTION edad(fnac DATE,fact DATE) RETURNS INT
BEGIN
DECLARE aux INT;
IF YEAR(fnac)>YEAR(fact) THEN
SET aux = -1;
ELSE
SET aux = (YEAR(fact)-YEAR(fnac)) - (RIGHT(fact,5)<(RIGHT(fnac,5));
END IF;
RETURN aux;
END//
delimiter ;

Deseo le sirva de provecho, y no olvide de hacer sus comentarios.





Ing. Tom Zambrano
"El hombre inteligente no es aquel que lo sabe todo, sino aquel que sabe aplicar lo poco que sabe"
Zilver sTone
"El poder del hombre no radica en su fuerza, sino en el poder de su palabra"


lunes, 31 de octubre de 2011

Crear una base de datos con PHP5

En las versiones anteriores a PHP5 para crear o eliminar una Base de datos de mysql se usaban las funciones mysql_create_db() y mysql_drop_db() respectivamente. Actualmente con PHP5 ya no se usan, mas bien se emplea una consulta sql para tal propósito, como muestra a continuación:


<?php
$bd = "iuty";
$host = 'localhost';
$pass = 'root';
$user = '123456';

if(!($link = mysql_connect($host,$pass,$user))){
    echo "No se ha podido conectar al servidor";
}
else{
    //Elimina la base de datos
    $eliminar = mysql_query("DROP DATABASE IF EXISTS $bd",$link);
   
    //crea la base de datos
    $crear = mysql_query("CREATE DATABASE $bd",$link);
   
    //string sql para crear la tabla estudiante
    $sql = "CREATE TABLE estudiante (expediente INT not null primary key, nombre VARCHAR(35), fec_nac DATETIME no null);";
   
    //selecciona la base de datos
    mysql_select_db($bd,$link);
   
    //crea la tabla
    if(mysql_query($sql,$link)){
        echo "base de datos creada correctamente";
    }
    else {
        echo "No se ha podido crear la base de datos";
    }
}

?>




Ing. Tom Zambrano
"El hombre inteligente no es aquel que lo sabe todo, sino aquel que sabe aplicar lo poco que sabe"
Zilver sTone
"El poder del hombre no radica en su fuerza, sino en el poder de su palabra"

viernes, 30 de septiembre de 2011

esperar pulsado de tecla en C

Esto es una articulo que encontré ya hace un tiempo, en un lugar que no recuerdo, y que copio tal cual lo encontré, respetando y dando crédito a las personas involucradas en el mismo

esperar pulsado de tecla en C

Leonardo Mosquera
Tue, 11 Sep 2007 14:01:46 -0700
On 9/11/07, Andorogynus ! <[EMAIL PROTECTED]> wrote:
>
> Como puedo hacer en C para simular un INKEY$ (que viejo !)
> Es decir, efectuar una pausa hasta que el tipo presione una tecla.
>
> Probe con getchar() pero no me permite abortar (Ctrl-C) el programa.
>

A continuacion te adjunto una contribucion que hizo alguien a la lista de mi
universidad una vez. Podes recortar todo lo que no sea getch() y su soporte.
Tene en cuenta la licencia, o al menos no copies/pegues sino que
"inspirate".

Nota: tradicionalmente se usa ncurses para eso que queres hacer, pero yo
mismo ya conclui que ncurses es demasiado armatoste si simplemente queres
pausar el programa por la duracion de exactamente 1 tecla.


------------------------------------------------------------------------

/* +++++++++++ conio.h de Porland (versión trucha del Borland :-)
+++++++++++
*
* Autor: Omar Murray (Crux_) Versión: 0.0.2
* Licencia: GPL Fecha: 05/06/07
*
* Esto intenta ser una recopilación de las funciones más utilizadas en
* la librería <conio.h> de Borland para poder generar código y compilar
* utilizando gcc en GNU/Linux, y luego poder correrlo en un entorno
* Borland sin necesidad de modificar el código escrito. Mayormente son
trozos
* de código obtenido de inet y recopilados en una sola librería. La
idea es
* utilizarlo para fines educativos; está en absoluto estado alfa, así
que su
* uso queda a riesgo de quien lo utilice.
*
* CHANGELOG
* v 0.0.1 Se implemente funciones getch() y clrscr().
* v 0.0.2 se agrega función gotoxy(), se ordena código.*/

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

//******************FUNCION GETCH****************************
int getch( ) {
struct termios oldt,
newt;
int ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}

//******************FUNCION CLRSCR*****************************
void clrscr( ) {
system("clear");
}

//**************** **FUNCION GOTOXY*****************************
int gotoxy(int x, int y) {
char essq[100]; // String variable to hold the escape sequence
char xstr[100]; // Strings to hold the x and y coordinates
char ystr[100]; // Escape sequences must be built with characters

// ** Convert the screen coordinates to strings
sprintf(xstr, "%d", x);
sprintf(ystr, "%d", y);

// ** Build the escape sequence (vertical move)
essq[0] = '\0';
strcat(essq, "\033[");
strcat(essq, ystr);

// ** Described in man terminfo as vpa=\E[%p1%dd
// ** Vertical position absolute
strcat(essq, "d");

// ** Horizontal move
// ** Horizontal position absolute
strcat(essq, "\033[");
strcat(essq, xstr);

// // Described in man terminfo as hpa=\E[%p1%dG
strcat(essq, "G");

// ** Execute the escape sequence
// ** This will move the cursor to x, y
printf("%s", essq);
return 0;
}



Ing. Tom Zambrano
"El hombre inteligente no es aquel que lo sabe todo, sino aquel que sabe aplicar lo poco que sabe"
Zilver sTone
"El poder del hombre no radica en su fuerza, sino en el poder de su palabra"

lunes, 14 de marzo de 2011

OpenOffice Macro para Impress

Saludos seguidores;

Hacia algún tiempo que no dejaba un post por acá.
Bueno resulta que en nuestro trabajo, CBIT-Yaracuy se presento una situación para el desarrollo de software educativo para las Canaima empleado Impress, de como introducir texto en una caja de texto y validar éste.

Indagando, buscando e investigando se logro dar con una solución empleando Macros de OpenOffice, acá la solución desarrollada:
Y este es el código Basic de las macros empleadas:

REM ***** BASIC *****
REM Codigo desarrollado por Ing. Tom Zambrano
REM el CBIT "Prof. Ferdinando Manto"
REM Marzo 2011
REM Se autoriza el empleo de este código, puede copiarlo, estudiarlo, modificarlo, distribuirlo
REM siempre y cuando de crédito de la autoría del mismo
Option Explicit

global oDoc As Object 'Para obtener la instancia del documento Impress
global oPre As Object 'Para obtener la instancia de la presentación
global oPreContr As Object 'Para obtener el los controles de la presentación
global oPagAct1 As Object 'Para obtener la instancia de la diapositiva donde esta la actividad
global oCajaTexto As Object 'Obtiene la instancia de la caja de texto

Sub Main

End Sub

Sub validar
obtenerAreaTrabajo
if (ucase(oCajaTexto.String)="ALGO") then
msgbox "muy bien"
oPreContr.gotoNextSlide() 'Va a la proxima diapositiva
oCajaTexto.String = "" 'para garantizar que la caja de texto quede vacia
else
msgbox "revisa tu respuesta"
oPreContr.gotoSlide(oPagAct1)
End IF
End Sub

Sub obtenerAreaTrabajo
oDoc = ThisComponent
oPagAct1 = oDoc.DrawPages.getByName("actividad1") 'Puede emplearse tambien
oCajaTexto = oPagAct1.getLinks().getByName("cajatexto")
oCajaTexto.CharHeight = 44
oPre = oDoc.Presentation
oPreContr = oPre.getController()
End Sub

Sub Tecla1
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "1"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub Tecla2
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "2"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub Tecla3
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "3"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub Tecla4
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "4"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub Tecla5
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "5"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub Tecla6
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "6"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub Tecla7
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "7"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub Tecla8
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "8"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub Tecla9
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "9"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub Tecla0
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "0"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaBorrar
Dim L As integer

obtenerAreaTrabajo

L = len(oCajaTexto.String)
if L>0 then
oCajaTexto.String = Left(oCajaTexto.String,L-1)
End If

oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaQ
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "Q"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaW
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "W"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaE
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "E"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaR
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "R"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaT
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "T"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaY
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "Y"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaU
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "U"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaI
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "I"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaO
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "O"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaP
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "P"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaA
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "A"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaS
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "S"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaD
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "D"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaF
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "F"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaG
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "G"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaH
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "H"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaJ
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "J"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaK
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "K"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaL
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "L"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaNtilde
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "Ñ"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaZ
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "Z"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaX
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "X"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaC
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "C"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaV
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "V"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaB
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "B"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaN
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "N"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaM
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + "M"
oPreContr.gotoSlide(oPagAct1)
End Sub

Sub TeclaSpace
obtenerAreaTrabajo
oCajaTexto.String = oCajaTexto.String + " "
oPreContr.gotoSlide(oPagAct1)
End Sub

A cada objeto, se le asigna un nombre, sobe todo a la caja de texto, y en la interacción de los objetos se le asocia la macro correspondiente

Deseo que este código les sea de utilidad y de provecho, no duden en dar crédito de su desarrollo, porque el conocimiento es de todos y todos tenemos derecho a el.

No olvides en hacer tus comentarios

viernes, 4 de febrero de 2011

fondo verde






Ing. Tom Zambrano

"El hombre inteligente no es aquel que lo sabe todo, sino aquel que sabe aplicar lo poco que sabe"
Zilver sTone

"El poder del hombre no radica en su fuerza, sino en el poder de su palabra"


jueves, 22 de julio de 2010

Arreglo de Objetos. Un poco de ayuda

Creación de Objetos
Creamos un objeto mediante la siguiente sintaxis:

Objeto a(arg1, arg2); //Creo un objeto Objeto, usando el contructor de argumentos arg1 y arg2
Objeto b; //Creo un objeto Objeto, usando el constructor sin parámetros

En ambos casos, se creo un objeto en memoria estática. Es decir, la memoria asignada para la función o método donde se creo el objeto. Una vez que la función finaliza, el objeto se destruye.

Para crear un objeto en memoria dinámica usamos:


Objeto* a = new Objeto(arg1, arg2);

Objeto* b = new Objeto;

Si queremos crear un arreglo de objetos en memoria dinámica usamos:


Objeto* c = new Objeto[20] //Creo un arreglo de 20 espacios de Objeto.


Cuando definimos un objeto en memoria dinámica, esta memoria queda tomada por el resto de la ejecución del programa hasta que nosotros llamemos al destructor por medio de:

delete a;
delete b;
delete [] c; //Si al crear el objeto usamos [] (Hicimos un arreglo) entonces delete // se debe llamar con []

Debemos tener en cuenta que la memoria estática se obtiene en el momento en que se compila el programa. La memoria dinámica se asigna durante la ejecución. Es decir, podemos pedir la medida justa de memoria de acuerdo a parámetros que se pueden obtener en tiempo de ejecución. A cambio de este beneficio, debemos preocuparnos de liberar la memoria que pedimos. Cada vez que hacemos un new, debemos preocuparnos de hacer delete después. Edemas, en los destructores de la clase debemos preocuparnos de hacer delete en la memoria que hayamos pedido con new dentro del objeto.

un ejemplo de como hacer lo anteriormente descrito

main()
{

... // Aquí deberían estar declaradas algunas o las variables que se necesitan

int dim; //Dimensión del arreglo de objetos

alumno *p; //Crea un puntero a objeto alumno, Se asume que la clase alumno esta implementada
alumno *aux; //Puntero auxiliar tipo alumno (Solo por ejemplo pero no es necesario)

cout << "Cuantos alumnos tiene la clase? ";
cin >> dim; //Para cuantos objetos hay que liberar memoria? // es de ejemplo
cout << "\n";

p = new alumno[dim]; //Asigna memoria dinámicamente

if (p==0) //Si p=0 no hay memoria suficiente
{
cout << "Error no hay suficiente memoria";
return 0; //Sale del programa
};

aux=p; //Asignación de un puntero a otro del mismo tipo

do //estructura do...while
{ //que mantiene en el ciclo principal
cout << " \n";

... // aqui debería estar el menu de opciones

cin >> opcion;

switch (opcion)
{
case 1: (p+numero_objeto) -> ingresar(); //operador flecha en vez de operador punto
numero_objeto++;
break;
case 2: cout <<"\n";
cout <<"Lista de Estudiantes inscritos \n";
for (i=0;i<numero_objeto;i++)
{
cout << "Estudiante numero " << i;
cout << ": ";
(aux+i) -> mostrar_nombre();
cout << "\n";
}
break;
case 3: cout << "Ingrese el número de lista del estudiante a examinar \n";
cin >> n;
cout << "Alumno: ";
(p+n) ->mostrar_nombre();
cout << "\n";
(p+n) -> reporte();
break;
default: return 0; //Sale del programa
}
} while (opcion !=4); //sale del programa

delete [] p; //libera la memoria asignada a *p
}


Ing. Tom Zambrano

"El hombre inteligente no es aquel que lo sabe todo, sino aquel que sabe aplicar lo poco que sabe"
Zilver sTone

"El poder del hombre no radica en su fuerza, sino en el poder de su palabra"










Get news, entertainment and everything you care about at Live.com. Check it out!