PDA

Ver la Versión Completa : referencia de tedit en TComponentList


richy08
05-12-2013, 17:23:45
Buen dia, les platico un poco mi duda si yo creo un tedit y lo agrego a un tcomponentlist de esta manera


product: TComponentList;



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


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



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.
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:

...
var
i: Integer;
begin
for i := 0 to product.Count-1 do
TEdit(product.Items[i]).Color := clRed;
end;


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

procedure TForm.FormDestroy(Sender: TObject);
begin
product.Free;
end;



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

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:

(FindComponent('Edit11') as TEdit).Color := clBlak;

que:

(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:

...
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:

...
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 :)