Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cambiar nombre por defecto en componentes (https://www.clubdelphi.com/foros/showthread.php?t=5044)

roman 06-11-2003 16:48:55

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

delphi.com.ar 06-11-2003 17:11:19

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!

roman 06-11-2003 20:55:29

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

delphi.com.ar 06-11-2003 23:40:21

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!

roman 07-11-2003 00:07:32

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

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

delphi.com.ar 07-11-2003 00:59:30

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


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) :D, 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 07-11-2003 22:45:13

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

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


La franja horaria es GMT +2. Ahora son las 02:15:39.

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