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 06-11-2003
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
Cambiar nombre por defecto en componentes

Cuando creamos una nueva clase de componente, digamos

Código:
type
  TAlignEdit = class(TEdit)
  end;
los nombres por defecto de componentes de esta clase al insertarlos desde la paleta serán AlignEdit1, AlignEdit2, AlignEdit3, etc.

Creo que alguna vez vi como redefinir este comportamiento para que el nombre por defecto sea otro. Particularmente me gustaría que se llamaran igual que su ancestro: Edit1, Edit2, Edit3, etc. aunque bien podría ser cualquier otro formato.

Ya me sumergí en el VCL pero no logro encontrar el método qe hay que sobreescribir.

¿Alguien lo sabe?

// Gracias
Responder Con Cita
  #2  
Antiguo 06-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Me parece haberlo visto o leído alguna vez, pero no recuerdo donde. Lo buscaría por el lado del IDesigner de la clase TCustomForm, o alguna superior. Supongo que tiene que venir por el lado de los editores de propiedades porque en tiempo de ejecución, cuando creas un componente este se crea sin nombre.

PD:
Observa el código de TReader.ReadComponent

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 06-11-2003
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
Gracias!

Ya busqué un poco aunque sin mucho éxito. No estoy seguro de que el Reader tenga que ver pues al momento de insertar una componente en tiempo de diseño no estamos leyendo las componentes. Pero voy a buscar esto del IDesigner.

// Saludos
Responder Con Cita
  #4  
Antiguo 06-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
Cita:
roman comentó:
No estoy seguro de que el Reader tenga que ver pues al momento de insertar una componente en tiempo de diseño no estamos leyendo las componentes.
Estoy de acuerdo, solo te lo sugerí porque a las apuradas me pareció código que podía llevarte a lo que buscas, no que ahí este la respuesta.

PD: Si tengo un tiempito extra, lo voy a investigar


Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 07-11-2003
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:
delphi.com.ar comentó:
PD: Si tengo un tiempito extra, lo voy a investigar
¿Podrá estar listo para mañana a las 5:00 pm?

No, de verdad no vayas a desgastarte ya que es sólo un pequeño "gusto" que me quiero dar.

Busqué un poco de IDesigner pero la única referencia que encontré en el código de la VCL es en la unidad Forms.pas:

Código:
type
  IDesignerHook = interface
  ...
  end
y la propiedad Designer de TCustomForm:

Código:
type
  TCustomForm = class(TScrollingWinControl)
    ...
  public
    property Designer: IDesignerHook read FDesigner write SetDesigner;
  end;
Sin embargo no he sido capaz de encontrar qué clase implementa la interfaz IDesignerHook aunque sospecho que este dichoso nombre por defecto no lo pone ni la componente ni el formulario, sino alguna de las interfaces del IDE que ha de ser la que construye un objeto que implemente IDesignerHook.

De ser así pues veo pocas esperanzas ya que me hubiera gustado que esto fuese una habilidad de la componente y no tener que escribir una de las interfaces del IDE, cosa que se puede pero además de ser un tema que prácticamente no conozco, se me hace como matar una pulga no ya con un misil sino con una bomba de plutonio.

Claro que podría lograr lo que quiero sobreescribiendo el método SetName de la componente (ya lo probé) pero tendría entonces que manejar yo mismo la auto numeración de los nombres, verificar que no entren en conflicto con otras componentes, etc.

Bueno, si sabes de algo interesante soy "todo oídos" o mejor dicho, "todo ojos".

// Saludos
Responder Con Cita
  #6  
Antiguo 07-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
En este momento estoy metido en un emborllo, así que no creo llegar para las 5:00... Además... ¿Horario de que lugar del mundo estamos hablando?


En Delphi 5 no existe la interface IDesignerHook, pero como interesante tengo una interface IDesignNotification con los métodos ItemInserted, ItemDeleted y ItemsModified pero creo que la implementación esta en algún paquete compilado como dsnide50. Desde ya te adelanto que no vas a encontrar el código de muchos editores de propiedades, las implementaciones de muchas clases e interfaces. Recuerdo hace unos años pedir a borland el código del TInspListBox (El object inspector) , a lo que me respondieron:
Cita:
The Borland supplied property editor code is not distributable so unless you are trying to write an IDE Object Inspector replacement, you will have to write this code from scratch.

Esta prueba no funcionó:

Código:
type
  TMyComponentNameProperty = class(TComponentNameProperty)
  public
    procedure SetValue(const Value: string); override;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterPropertyEditor(TypeInfo(TComponentName), TComponent, 'Name', TNameProperty);
end;


procedure TNameProperty.SetValue(const Value: string);
begin
  inherited SetValue('Prueba_' + Value);
end;
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 07-11-2003 a las 01:25:28.
Responder Con Cita
  #7  
Antiguo 07-11-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
¿Te parece algo tan barato como esto?

Código:
unit WctlformX;

interface

procedure Register;

implementation

uses
  Controls, SysUtils, DsgnIntf;

function PropertyMapperFunc(Obj: TPersistent; PropInfo: PPropInfo): TPropertyEditorClass;
var
  NameValue: string;
begin
  if (PropInfo^.Name = 'Name') and
     not ((Obj is TWinControl) and (TWinControl(Obj).Parent = Nil)) Then
  begin
    NameValue := GetStrProp(Obj, PropInfo);
    if (NameValue[1] <> '_') Then
      SetStrProp(Obj, PropInfo, '_' + NameValue);
  end;

  Result := Nil;
end;

procedure Register;
begin
  RegisterPropertyMapper(PropertyMapperFunc);
end;

end.
como funcionar funciona, pero sinceramente no me gusta nada.

Te comento que estube probando:

1 > Crear clases heredadas de TWinControlCustomModule y TWinControlForm, pertenecientes a la unit Wctlform que está compilada en el dsnide*.bpl, por lo que pude ver muy por debajo, estas son las clases de los forms que utiliza el IDE cuando creas en tiempo de diseño un TCustomForm o un TCustomDataModule. Estas clases implementan la interface IDesignerHook, el problema es que no encontré como registrarlas para probarlas. Si te interesa te paso el código.

2 > Probé crear una clase:
Código:
TIdeFormNotifier = class(TNotifierObject, IOTAFormNotifier, IOTAIDENotifier)
, donde recibo sin problemas las notificaciones AfterCompile, BeforeCompile y FileNotification, pero no recibo ComponentRenamed, que es la que me interesa.

Bueno te dejo esas inquietudes, ya que solo las probé muy por encima, si verdaderamente te interesa y crees que esta pueda ser otra solución (yo no creo que venga por ahí, hay que buscar qué método de que clase es el que da los nombres), esta en tus manos seguir investigando.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
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


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


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