Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-11-2011
jasmad jasmad is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 75
Poder: 13
jasmad Va por buen camino
??Como modificar una variable externa en un procedimiento??

Buenas,

Lo que quiero hacer es recorrer los componentes de un form que esta lleno de puros chekbox y si esta marcado llamo a un procedimiento que me modifica una variable global llamada perfil:TPerfil que contiene una TObjectList de TDetallePerfil. Entonces por cada check marcado tengo que hacer un add a la lista de detalles; pero no puedo simplemente
Código Delphi [-]
perfil.Detalles.Add(form.Controls[i])


porque tengo que validar varias cosas en el form y ademas crear un objeto detalle para insertarlo, entonces me hice un procedimiento
Código Delphi [-]
procedure asignarDetalles(var perfil:TPerfil;const accionFuncionalidad:Integer);

pongo solo la declaracion porque es muy(muy) extenso

pero el var no me sirve ya que cada vez que entra al procedimiento compruebo recorriendo el list que solo se encuentran los ultimos registros
y en la bd se inserta asi por lo tanto puedo deducir que el procedure no modifica como quiero: no borra las otras propiedades del perfil pero si los elementos que se encontraban en el list.

Ustedes que conocen, ¿me podrian ayudar?
Responder Con Cita
  #2  
Antiguo 28-11-2011
Avatar de olbeup
olbeup olbeup is offline
Miembro
 
Registrado: jul 2005
Ubicación: Santiago de la Ribera (España)
Posts: 685
Poder: 19
olbeup Va camino a la fama
En vez de utilizar esto:
Código Delphi [-]
perfil.Detalles.Add(form.Controls[i])
Utiliza este otro:
Código Delphi [-]
perfil.Detalles.AddObject(form.Controls[i])
El .Detalles tiene que ser TStrings para poder utilizar lo anterior.
Cuando recuperes el objecto lo tienes que hacer:
Código Delphi [-]
...
var
  oCtrl: TCheckBox;
  nI: Integer;
begin
  for nI := 0 to (perfil.Detalles.Count -1) do
  begin
    oCtrl := (perfil.Detalles.Objects[nI] as TCheckBox);
    if oCtrl.Checked then
    begin
      ...
      ...
    end;
  end;
end;
Espero que sea esto lo que estés buscando.

Un saludo.
Responder Con Cita
  #3  
Antiguo 28-11-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
A ver si alguien lo entiende, yo no he llegado a comprender el problema
Responder Con Cita
  #4  
Antiguo 28-11-2011
jasmad jasmad is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 75
Poder: 13
jasmad Va por buen camino
Cita:
Empezado por olbeup Ver Mensaje
El .Detalles tiene que ser TStrings para poder utilizar lo anterior.
no es un TStrings es un TObjectList que lo uso para guardar objetos creados por mi, un TDetallePerfil es lo que guardo en este TObjectList

la verdad es que lo que ocupo es saber como modificar la variable sin que el procedimiento me modifique los registros que ya hay en esta
Responder Con Cita
  #5  
Antiguo 28-11-2011
jasmad jasmad is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 75
Poder: 13
jasmad Va por buen camino
ok a ver si me explico en otras palabras lo que necesito es tomar un objeto declarado en un formulario y enviarlo como parametro a un procedimiento y que este lo modifique sin borrar los datos que el objeto ya trae
Responder Con Cita
  #6  
Antiguo 28-11-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por jasmad Ver Mensaje
ok a ver si me explico en otras palabras lo que necesito es tomar un objeto declarado en un formulario y enviarlo como parametro a un procedimiento y que este lo modifique sin borrar los datos que el objeto ya trae
Ahora, creo entenderte.

Te pongo un ejemplo simple donde se crean TCheckBox, a algunos se les modifica las propiedades Left y Checked al azar y luego se muestra en un ListBox aquellos que tengan la propiedad Checked en True.
Código Delphi [-]
...
implementation

uses Contnrs;

var
  Lst: TObjectList;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Lst:= TObjectList.Create;
end;

procedure AsignarDetalles(CB: TCheckBox; Accion: Integer);
begin
  CB.Checked:= Boolean(Accion);
  if CB.Checked then
    CB.Left:= CB.Left + 20;
end;

procedure TForm1.btnCrearClick(Sender: TObject);
var
  i: Integer;
  cb: TCheckBox;
begin
  for i:= 1 to 10 do
  begin
    cb:= TCheckBox.Create(nil);
    cb.Name   := 'CheckBox' + IntToStr(i);
    cb.Height := 25;
    cb.Left   := 30;
    cb.Top    := 25 + 25 *i;
    cb.Parent:= Self;
    Lst.Add(cb);
  end;
end;

procedure TForm1.btnAsignarClick(Sender: TObject);
var
  i: Integer;
begin
  Randomize;
  for i:= 0 to Lst.Count -1 do
     AsignarDetalles(TCheckBox(Lst.Items[i]), Random(2));
end;

procedure TForm1.btnMostrarClick(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to Lst.Count - 1 do
    if TCheckBox(Lst.Items[i]).Checked then
      ListBox1.Items.Add(TCheckBox(Lst.Items[i]).Name);
end;
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
  ObjLst.Free;
end;

Si los componentes fueron añadidos en diseño para pasarlos al TObjectList, habría que reemplazar btnCrearClick por:
Código Delphi [-]
procedure TForm1.btnGuardarObjLstClick(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to ComponentCount -1 do
    if Components[i] is TCheckBox then
      ObjLst.Add(TCheckBox(Components[i]))
end;

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 01-12-2011
jasmad jasmad is offline
Miembro
NULL
 
Registrado: jul 2011
Posts: 75
Poder: 13
jasmad Va por buen camino
muchas gracias a todos ya pude solucionar el problema
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como Utilizar una variable externa en FastReport? hmrvivas Impresión 4 11-09-2007 16:38:30
Como saber si un procedimiento asigna bien una variable Antuan Varios 1 17-09-2005 14:15:27
Modificar la variable Path en ejecución adlfv API de Windows 1 01-09-2005 22:59:56
modificar Procedimiento Almacenado JulioGO Firebird e Interbase 5 07-04-2005 00:32:24
Insertar un memo como variable externa en freereport fmatias Impresión 0 02-06-2003 15:23:24


La franja horaria es GMT +2. Ahora son las 22:23:58.


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
Copyright 1996-2007 Club Delphi