Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   referencia de tedit en TComponentList (https://www.clubdelphi.com/foros/showthread.php?t=84787)

richy08 05-12-2013 17:23:45

referencia de tedit en TComponentList
 
Buen dia, les platico un poco mi duda si yo creo un tedit y lo agrego a un tcomponentlist de esta manera

Código Delphi [-]
 product: TComponentList;

Código Delphi [-]
      
          edit:= TEdit.Create(nil);
          edit.Name:='Edt'+inttostr(Qry_lineaproductoP.fieldbyname('id').Value);
          //edit.Caption:=Qry_lineaproducto.fieldbyname('nombre').Value;
          edit.Left:= leftEdit;
          edit.Top:=top;
          edit.Width:=57;
          edit.Height:=17;
          edit.Parent:=PageControl1.Pages[tabshhet];
          edit.Tag :=Qry_lineaproductoP.fieldbyname('id').Value;
          //CheckBox.hint:=Qry_unit.fieldbyname('semail').Value;
          edit.OnExit:=DoOnExit;
          edit.text:=Qry_lineaproductoP.fieldbyname('max').Value;
          product.Add(edit);
                                           <--aqui no necesito  destruir a edit?? con edit.free;


si despues modifico alguna propiedad de ese edit en el form por medio de la funcion DoOnExit

Código Delphi [-]
procedure TFrm_POmym1.DoOnExit(Sender: TObject);    
begin
  if Sender is Tedit then
  begin
    with Tedit(Sender) do
    begin
        color:=clSkyBlue;
   .
   .
   .

si recorro el tcomponent list de esta manera, ese cambio a la propiedad text del edit esta ligado en el tcomponentlist??

Código Delphi [-]

   for i := product.Count-1 downto 0 do
    begin
             showmessage((TEdit(product[i]).text);  <--Rsultado debe de ser color clSkyBlue
    end;

gracias por anticipado

ecfisa 05-12-2013 17:59:58

Hola richy08.
Cita:

si recorro el tcomponent list de esta manera, ese cambio a la propiedad text del edit esta ligado en el tcomponentlist??
Si. En este otro ejemplo, se ponen todos los edits agregados al TComponentList en color rojo:
Código Delphi [-]
...
var
  i: Integer;
begin
  for i := 0 to product.Count-1 do
    TEdit(product.Items[i]).Color := clRed;
end;

Cita:

<--aqui no necesito destruir a edit?? con edit.free;
Si no pones la propiedad OwnsObjects en False, TComponentList liberará los componentes agregados cuando se destruya la instancia del mismo.

Ejemplo:
Código Delphi [-]
procedure TForm.FormDestroy(Sender: TObject);
begin
  product.Free;
end;

Cita:

Código Delphi [-]
showmessage((TEdit(product[i]).text);  <--Rsultado debe de ser color clSkyBlue

Eso no va a suceder... El procedimiento ShowMessage recibe como parámetro el texto y no las propiedades del TEdit, por lo tanto no lo mostrará en color clSkyBlue.

Saludos :)

richy08 05-12-2013 18:08:55

gracias ecfisa por la respuesta , creo que lo ultimo fue error de dedo :o, pero si se pone asi, esto si lo imprimiria

Código Delphi [-]
showmessage(inttostr((TEdit(product[i]).color));

ahora me surge otra duda como puedo dibujar los componentes de producto(TComponent list) de nuevo en la forma , esto lo necesito por que en la pantalla
necesito paginar los productos, pero algunos datos puieron haber cambiado(por ejemplo el color del tedit) y al regresar a la misma pagina necesito que se repinten igual.

saludos

ecfisa 05-12-2013 18:28:02

Hola richy08.

No se si entendí lo que buscas hacer, ¿ Es algo como tomar una instantánea mediante el TComponentList, modificar alguna propiedad en algún edit y luego volverlos al estado anterior ?

Saludos :)

richy08 05-12-2013 18:39:08

trato de explicarlo mejor, en la pantalla solo apareceran por ejemplo 20 productos , de un total de 100, entonces los productos se paginaran de 20 en
20(total 5 paginas ) , usare dos botones uno de atras y otro de adelante, para ir apareciendo los productos segun en la paginacion en que esten.

ejemplo:

estoy en la paginacion 1 y muevo una propiedad de un tedit por ejemplo la de color, luego presiono el boton de adelante (cambio a pagina 2) , si despues presiono el boton hacia atras (cambio a pagina 1), me gustaria volver a pintar ese tedit pero desde el TObjectList para que aparezca con su propiedad color modificada, entonces la pregunta es como pintar los objetos del TobjectList a la forma

saludos

ecfisa 05-12-2013 19:29:29

Hola richy08.

De ahí mi pregunta anterior... No creo que te sea útil para ese propósito.

Lo que sucede es que las propiedades Items[n] de TComponentList y TObjectList, en realidad son apuntadores (a un TComponent y un TObject respectivamente). Por lo tanto todo cambio que se provoque en un componente asignado, se verá reflejado en el elemento de la lista y viceversa.

Por ejemplo, si tenemos asignado en la posición 10 de una lista el control "Edit11" es lo mismo hacer:
Código Delphi [-]
  (FindComponent('Edit11') as TEdit).Color := clBlak;
que:
Código Delphi [-]
  
  (Lista.Items[10] as TEdit).Color := clBlack;
Ambos códigos hacen referencia a la misma instancia, uno u otro provocan el mismo efecto.

Si deseas guardar los estados relevantes de los controles de cada TTabSheet al abandonarlo para restaurarlo al ingresar nuevamente, podrías valerte de TIniFile o TRegistry.

Saludos. :)

richy08 05-12-2013 20:09:54

Gracias ecfisa, si eso me temia por eso me estaba apoyando en un tmemo, ahi guardo las propiedas que cambian (que en realidad solo es el campo text
que guarda una cantidad), y si esa cantidad es mayor que 0 se pinta de azul, entonces creare una funcion que me recupere del tmemo esa propiedad(cuando pagine ) y de existir se la volvere a aplicar , muchas gracias por tu tiempo y explicacion

saludos

ecfisa 06-12-2013 03:41:35

Hola richy08.

Para no dejarte la pelota picando, te pongo un ejemplo de como hacerlo en ambos casos.

Usando Registry:
Código Delphi [-]
...
implementation

uses Registry;

var
 CurrentTab: Integer = 0;

procedure TForm1.FormCreate(Sender: TObject);
var
  i,j: Integer;
  e  : TEdit;
begin
  with TRegistry.Create do
  try
    RootKey:= HKEY_CURRENT_USER;
    if OpenKey('MiProg\PageCtrl',False) then
    begin
      with PageControl1 do
      begin
        for i := 0 to PageCount - 1 do
          for j := 0 to Pages[i].ControlCount-1 do
            if Pages[i].Controls[j] is TEdit then
            begin
              e := TEdit(Pages[i].Controls[j]);
              e.Text := ReadString(e.Name+'Text');
              e.Color:= ReadInteger(e.Name+'Color');
            end;
        CloseKey;
        ActivePageIndex := 0;
      end;
    end;
  finally
    Free;
  end;
end;

procedure TForm1.PageControl1Change(Sender: TObject);
var
  i: Integer;
  e: TEdit;
begin
  with TRegistry.Create do
  try
    RootKey:= HKEY_CURRENT_USER;
    if OpenKey('MiProg\PageCtrl', True) then
    begin
      with PageControl1 do
      begin
        for i := 0 to Pages[CurrentTab].ControlCount-1 do
          if Pages[CurrentTab].Controls[i] is TEdit then
          begin
            e := TEdit(Pages[CurrentTab].Controls[i]);
            WriteString(e.Name+'Text', e.Text);
            WriteInteger(e.Name+'Color', e.Color);
          end;
        for i := 0 to Pages[ActivePageIndex].ControlCount-1 do
          if Pages[ActivePageIndex].Controls[i] is TEdit then
          begin
            e := TEdit(Pages[CurrentTab].Controls[i]);
            WriteString(e.Name+'Text', e.Text);
            WriteInteger(e.Name+'Color', e.Color);
          end;
        CurrentTab := ActivePageIndex;
      end;
      CloseKey;
    end;
  finally
    Free;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i, j: Integer;
  e: TEdit;
begin
  with TRegistry.Create do
  try
    RootKey:= HKEY_CURRENT_USER;
    if OpenKey('MiProg\PageCtrl', True) then
    begin
      with PageControl1 do
      begin
        for i := 0 to PageCount - 1 do
          for j := 0 to Pages[i].ControlCount-1 do
            if Pages[i].Controls[j] is TEdit then
            begin
              e := TEdit(Pages[i].Controls[j]);
              WriteString(e.Name+'Text', e.Text);
              WriteInteger(e.Name+'Color', e.Color);
            end;
        end;
        CloseKey
     end;
  finally
    Free;
  end;
end;

Usando IniFiles:
Código Delphi [-]
...
implementation

uses IniFiles;

var
 CurrentTab: Integer = 0;

procedure TForm1.FormCreate(Sender: TObject);
var
  i,j: Integer;
  e : TEdit;
begin
  with TIniFile.Create(ExtractFilePath(Application.ExeName)+'PROG.INI') do
  try
    with PageControl1 do
    begin
      for i:= 0 to PageCount - 1 do
        for j:= 0 to Pages[i].ControlCount-1 do
          if Pages[i].Controls[j] is TEdit then
          begin
            e := TEdit(Pages[i].Controls[j]);
            e.Text := ReadString(e.Name,'Text','');
            e.Color:= ReadInteger(e.Name,'Color',clWindow);
          end;
      ActivePageIndex := 0;
    end;
  finally
    Free;
  end;
end;

procedure TForm1.PageControl1Change(Sender: TObject);
var
  i: Integer;
  e: TEdit;
begin
  with TIniFile.Create(ExtractFilePath(Application.ExeName)+'PROG.INI') do
  try
    with PageControl1 do
    begin
      for i:= 0 to Pages[CurrentTab].ControlCount-1 do
        if Pages[CurrentTab].Controls[i] is TEdit then
        begin
          e := TEdit(Pages[CurrentTab].Controls[i]);
          WriteString(e.Name,'Text', e.Text);
          WriteInteger(e.Name,'Color', e.Color);
        end;
      for i:= 0 to Pages[ActivePageIndex].ControlCount-1 do
        if Pages[ActivePageIndex].Controls[i] is TEdit then
        begin
           e := TEdit(Pages[CurrentTab].Controls[i]);
           e.Text := ReadString(e.Name,'Text','');
           e.Color:= ReadInteger(e.Name,'Color',clWindow);
        end;
      CurrentTab := ActivePageIndex;
    end;
  finally
    Free;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i,j: Integer;
  e: TEdit;
begin
  with TIniFile.Create(ExtractFilePath(Application.ExeName)+'PROG.INI') do
  try
    with PageControl1 do
      for i:= 0 to PageCount - 1 do
        for j:= 0 to Pages[i].ControlCount-1 do
          if Pages[i].Controls[j] is TEdit then
          begin
            e := TEdit(Pages[i].Controls[j]);
            WriteString(e.Name,'Text', e.Text);
            WriteInteger(e.Name,'Color', e.Color);
          end;
  finally
    Free;
  end;
end;

Saludos :)


La franja horaria es GMT +2. Ahora son las 16:41:30.

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