PDA

Ver la Versión Completa : Seleccionar un rango de DBEdits


Lenny
22-09-2011, 21:24:27
Buenas y gracias de antemano ante cualquier ayuda u/o comentario...
Tengo una duda existencial, ¿Es posible seleccionar un rango de DBEdits para, por ejemplo, seleccionar los DBEdits del 1 al 10 y dejarlos en "ReadOnly = True" sin afectar a los demas? Mas que nada es para no tener que escrivir el codigo correspondiente por cada DBEdit a cambiar ya que necesito dejar el resto intacto...
Utilizo Delphi 2010, MySQL, Zeos 7... de antemano Muchas Gracias...

oscarac
22-09-2011, 21:34:44
yo uso mas o menos esta funcion


for i := 0 to (Self.ComponentCount - 1) do begin
if (Self.Components[i] is TDBEdit) or (Self.Components[i] is TComboBox) then begin
TEdit(Self.Components[i]).Enabled := False;
end;
end;

Lenny
22-09-2011, 23:01:16
Gracias Oscarac, es mas menos lo que necesito, tengo un codigo similar que hace lo mismo, pero este codigo afecta a todos los DBEdits, y yo necesito solo algunos, en rangos, del 1 al 10 por ejemplo, no todos...
Esop... espero alguien pueda ayudarme a buscar una solucion...

roman
22-09-2011, 23:22:52
A los DBEdit que quieras cambiar ponles su propiedad Tag igual a 1 en el inspector de objetos y en el código de oscarac añades la condición:


(Self.Components[i].Tag = 1)


// Saludos

ecfisa
22-09-2011, 23:33:11
Hola.

También podes hacerte un procedimiento que cambie cualquier propiedad ordinal, siempre que la tengan, de los controles del form:


uses TypInfo;

procedure TForm1.SetCtrlsProp(Lista: array of string; AProperty: string;
Value: Variant);
var
i,j: Integer;
begin
for i:= High(Lista) downto Low(Lista) do
begin
j:= 0;
while(j < ControlCount)and(Controls[j].Name <> Lista[i])do Inc(j);
if(j < ControlCount)and(Controls[j].Name = Lista[i]) then
begin
if GetPropInfo(Controls[j].ClassInfo, AProperty) <> nil then
SetOrdProp(Controls[j], AProperty, Value);
end;
end;
end;


Eso te permite hacer cosas como por ejemplo:

procedure TForm1.Button1Click(Sender: TObject);
begin
SetCtrlsProp(['Edit1', 'Edit3', 'Edit2'],'Enabled', False);
SetCtrlsProp(['DBGrid1', 'DBEdit1', 'DBEdit2'], 'ReadOnly', True);
SetCtrlsProp(['Edit1', 'Edit2', 'DBGrid1'], 'Color', clYellow);
end;

Lo que sí tenés que ser cuidadoso con los nombres, el procedimiento no es tan virtuoso como para distinguir Edit1 de EdiT1 ... :)
Pero si deseas ese comportamiento, es muy sencillo implementar que ignore mayúsculas/minúsculas. (UpperCase)

Saludos.

Edito: Me olvidé de avisarte, el procedimiento funciona sólo con propiedades ordinales. (no podrías cambiar la propiedad Text por ejemplo)

Lenny
22-09-2011, 23:36:15
Uffff!!! Muchas gracias!!! Gracias por la pronta respuesta y mas aun por la variedad de soluciones, en una media hora mas menos probare los codigos, muchas gracias nuevamente, espero no tener problemas... Byes!!

ecfisa
23-09-2011, 00:40:29
Hola.

Aunque no pretende ser código de alto vuelo con el uso de RTTI ( esa taréa se la dejo a Neftalí ), te completé el procedimiento para que contemple algunos tipos más de propiedades. (no podía ser tan haragán...:p).

uses TypInfo;

procedure TForm1.SetCtrlsProp(Lista: array of string; AProp,Value: Variant);
var
i,j: Integer;
PInfo: PPropInfo;
begin
for i:= High(Lista) downto Low(Lista) do
begin
j:= 0;
while(j < ControlCount)and(Controls[j].Name <> Lista[i])do Inc(j);
if(j < ControlCount)and(Controls[j].Name = Lista[i]) then
begin
PInfo:= GetPropInfo(Controls[j].ClassInfo, AProp);
if PInfo <> nil then
begin
case PInfo^.PropType^.Kind of
tkString,tkLString:SetStrProp(Controls[j],Aprop,VarToStr(Value));
tkInteger: SetOrdProp(Controls[j], AProp, StrToInt(Value));
tkEnumeration: SetOrdProp(Controls[j], AProp,Value);
else
raise Exception.Create('caso no contemplado');
end;
end;
end;
end;
end;


Ahora podés hacer por ejemplo:

SetCtrlsProp(['Edit1', 'Edit3', 'Edit2'], 'Text', 'NUEVO TEXTO');
SetCtrlsProp(['DBGrid1', 'DBEdit1', 'DBEdit2'], 'ReadOnly', True);
SetCtrlsProp(['Edit1', 'Edit2', 'DBGrid1'], 'Color', clYellow);
SetCtrlsProp(['Edit1'], 'Cursor', crHandPoint);


Un saludo.