Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   ??Como modificar una variable externa en un procedimiento?? (https://www.clubdelphi.com/foros/showthread.php?t=76805)

jasmad 28-11-2011 19:27:15

??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?

olbeup 28-11-2011 20:48:11

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.

Casimiro Notevi 28-11-2011 20:49:10

A ver si alguien lo entiende, yo no he llegado a comprender el problema :o

jasmad 28-11-2011 21:20:32

Cita:

Empezado por olbeup (Mensaje 419741)
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

jasmad 28-11-2011 23:07:45

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

ecfisa 28-11-2011 23:45:35

Cita:

Empezado por jasmad (Mensaje 419790)
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.

jasmad 01-12-2011 23:40:38

muchas gracias a todos ya pude solucionar el problema


La franja horaria es GMT +2. Ahora son las 04:16:58.

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