Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-04-2016
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por jams73 Ver Mensaje
...si es posible Modificar el READONLY de los GRIDs existentes dentro de un proyecto
No debería ser muy difícil crear una utilidad en Delphi que:
(1) Recorra los Ficheros DFM de un directorio.
(2) Busque un elemento de la clase TDBGrid (o similar)
(3) Para ese elemento modifique la línea de ReadOnly
(4) Cree una copia de seguridad del fichero antiguo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #2  
Antiguo 14-04-2016
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Neftali Ver Mensaje
No debería ser muy difícil crear una utilidad en Delphi que:
(1) Recorra los Ficheros DFM de un directorio.
(2) Busque un elemento de la clase TDBGrid (o similar)
(3) Para ese elemento modifique la línea de ReadOnly
(4) Cree una copia de seguridad del fichero antiguo.
Hola Neftalí, en cuanto a esto, ¿te refieres a una utilidad que lea un DFM como cualquier archivo de texto implementando un "parseo" específico, o estás pensando en algo que use RTTI, TReader, TWriter, etc?

LineComment Saludos
Responder Con Cita
  #3  
Antiguo 14-04-2016
jams73 jams73 is offline
Miembro
 
Registrado: abr 2013
Posts: 16
Poder: 0
jams73 Va por buen camino
Seria interesante "escuchar" al maestro Neftali que le responde al maestro roman....
Responder Con Cita
  #4  
Antiguo 14-04-2016
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por roman Ver Mensaje
Hola Neftalí, en cuanto a esto, ¿te refieres a una utilidad que lea un DFM como cualquier archivo de texto implementando un "parseo" específico?
Exactamente a eso Román.

Un objeto TDBGrid en un DFM tiene una cabecera similar a esta (cambiando el nombre del componente):

Código Delphi [-]
  object DBGridClientes: TDBGrid
    ...

La parte del componente es bastante parecida a esta y siempre similar. Lo único "complejo" es si tiene o no columnas definidas.
Si tiene columnas será así:

Código Delphi [-]
object DBGrid1: TDBGrid
    Left = 48
    Top = 40
    Width = 481
    Height = 289
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
    Columns = <
      item
        Expanded = False
        Visible = True
      end
      item
        Expanded = False
        Visible = True
      end
      item
        Expanded = False
        Visible = True
      end>
  end

Si no tiene columnas así:

Código Delphi [-]
object DBGrid1: TDBGrid
    Left = 48
    Top = 40
    Width = 481
    Height = 289
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'MS Sans Serif'
    TitleFont.Style = []
  end

En ambos casos estará o no la propiedad ReadOnly así:

Código Delphi [-]
    ReadOnly = True

Si no está se considera a False.

No me parece complicado hacer un "parseo" de esos ficheros y modificarlos...
¿Qué os parece?
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 14-04-2016
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Otra opción más sencilla que se me ocurre es esta:

(1) Abrir los ficheros (DFM)
(2) Cambiar las líneas como esta:

Código Delphi [-]
  object DBGrid1: TDBGrid

Por otra como esta:

Código Delphi [-]
  object DBGrid1: TDBGridRO

Y crear un componente como este:

Código Delphi [-]
unit uDBGridRO;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Grids, DBGrids;

type
  TDbGridRO = class(TDbGrid)
  private
    { Private declarations }
  protected
    procedure Loaded; override;
  public
    { Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TDbGridRO]);
end;

{ TDbGridRO }

procedure TDbGridRO.Loaded;
begin
  inherited;

  Self.ReadOnly := True;
end;

end.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 14-04-2016
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.289
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Ahora que has comentado lo de RTTI, se me ha ocurrido otra forma de hacerlo durante la ejecución, en la que no haría falta modificar el código fuente de los DFM.

(1) Poddemos capturar la apertura de un formulario utilizando:

Código Delphi [-]
  Screen.OnActiveFormChange := FormChange;

(2) Y en ese momento podemos modificar en ejecución todos los TDBGrid que existan en ese formulario cambiandoles la propiedad ReadOnly.

Código Delphi [-]
procedure TForm1.FormChange(Sender: TObject);
var
  f:TForm;
  i:integer;
  grid:TDBGrid;
begin
  if Assigned(Screen.Activeform) then begin
    f := Screen.Activeform;
    for i := 0 to (f.ComponentCount - 1) do begin
      if (f.Components[i] is TDBGrid) then begin
        grid := TDbGrid(f.Components[i]);
        // Modificarlo
        grid.Color := clMoneyGreen;
      end;
    end;

  end;
end;

Lo he probado con un ejemplo y en mi caso en diseño todos los DBGrid son blancos y en ejecución les cambio el color (pero podría cambiar el ReadOnly).

__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #7  
Antiguo 14-04-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.053
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
La primera opción es más sencilla, al alcance de casi cualquiera.
La segunda opción es más profesional, aunque no sé si valdría la pena "cargar" con un nuevo componente clonado.

Desde luego, la opción sencilla y "semi" chapucera es la más cómoda

EDITO: La tercera opción, también bastante profesional puede que añada unos milisegundos más en la carga de cada Form, sobre todo si hay muchos componentes.

Última edición por Casimiro Notevi fecha: 14-04-2016 a las 18:27:21.
Responder Con Cita
  #8  
Antiguo 14-04-2016
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
La segunda opción es ingeniosa, no cabe duda, pero cargaríamos con un componente de palo que sería como un invitado molesto . La tercera opción es la más sencilla pero, como dice maese Casimiro, un poco chapucera y quizá buena para algo temporal.

Por RTTI, pensaba yo más bien en leer un DFM como lo hace el IDE, usando un TReader, pero creo que puede complicarse el asunto al no saber de antemano las clases que deben registrarse.

La primera opción, el parseo del texto, creo que sería la más adecuada, pero de pronto no me parece tan sencilla o al alcance de cualquiera, considerando que el DBGrid puede estar anidado en otros contenedores y hay que determinar bien dónde termina la lista de sus propiedades. Vamos, creo que es algo que parece sencillo pero que presentará complicaciones a la hora de implementarlo.

Creo que es un reto interesante, y me parece que sería igual de sencillo (e igual de difícil) pensar en algo más general: parsear todo el DFM y almacenarlo en una estructura de datos manejable por código. Pero desconozco con qué detalles podemos encontrarnos. Por ejemplo, en principio había pensado que el DFM era una lista de propiedades y subobjetos

Código:
object name: class
  property = value
  property = value
  ...
  object name: class
    ..
  end
  ..
pero ahora me recuerda maese Neftali que hay elementos como las columnas, que son colecciones:

Código:
property = <
  item
    property = value
    property = value
    ...
  end
  item
    property = value
    property = value
    ...
  end
  ...
¿Con qué otras sopresas podemos encontrarnos?

LineComment Saludos
Responder Con Cita
  #9  
Antiguo 15-04-2016
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Las "sorpresas" que comenta román, las he vivido.

En algunos componentes, al cambiar una propiedad a cierto valor, el IDE de Delphi retoca automáticamente otras propiedades para que todo sea coherente (no recuerdo el caso concreto). La ventaja de hacerlo con Cnpacks, es que cambia la propiedad y ordena al IDE que cargue el componente, así que el IDE retoca las demás.

Un ejemplo, aunque no sea el caso, si modificas la propiedad Color de un panel, se cambia la propiedad ParentColor a False. Si el cambio lo haces tú por RTTI, tendrás que modificar ambas propiedades porque "Delphi no se entera del cambio que has hecho". Repito que este no es el caso porque lo hace la clase TControl, pero cuando tienes paquetes en tiempo de diseño de algunos componentes, ellos hacen el trabajo sucio por tí.


Por cierto, como siempre, ideas alternativas muy ingeniosas. Cuidadito con proyectos que tengan algún form guardado en Binario en lugar de "text DFM" (ya sea por error o lo que sea, también me ha pasado )

Saludos!
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Como sincronizar dos o mas Grids? AzidRain Varios 4 23-12-2011 03:41:28
Modificar el exe resultante de un Proyecto en Delphi 5 radge Varios 5 08-09-2010 17:36:10
Cambiar propiedad a todos los componentes de un proyecto jcarteagaf Varios 6 06-03-2008 23:55:33
Un proyecto para todos los reportes o... Johnny Q Impresión 0 28-07-2005 22:50:08
acceder a todos pero modificar algunos... Alfredo OOP 5 21-12-2004 17:55:39


La franja horaria es GMT +2. Ahora son las 17:58:08.


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
Copyright 1996-2007 Club Delphi