Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Seleccionar un rango de DBEdits (https://www.clubdelphi.com/foros/showthread.php?t=75849)

Lenny 22-09-2011 21:24:27

Seleccionar un rango de DBEdits
 
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

Código Delphi [-]
 
   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:

Código Delphi [-]
(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:

Código Delphi [-]
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:
Código Delphi [-]
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

Muchisimas gracias!!!
 
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).
Código Delphi [-]
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:
Código Delphi [-]
  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.


La franja horaria es GMT +2. Ahora son las 16:45:36.

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