FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Cambiar nombre por defecto en componentes
Cuando creamos una nueva clase de componente, digamos
Código:
type TAlignEdit = class(TEdit) end; 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 |
#2
|
||||
|
||||
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. |
#3
|
||||
|
||||
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 |
#4
|
||||
|
||||
Cita:
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. |
#5
|
||||
|
||||
Cita:
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 Código:
type TCustomForm = class(TScrollingWinControl) ... public property Designer: IDesignerHook read FDesigner write SetDesigner; end; 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 |
#6
|
||||
|
||||
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:
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. |
#7
|
||||
|
||||
¿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. 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) 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. |
|
|
|