Ir al contenido



Foto

Componente con Comportamiento Raro


  • Por favor identifícate para responder
6 respuestas en este tema

#1 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 19 mayo 2012 - 11:58

Hola compañeros, siguiendo  el curso de creacion de componente de delphi del Sr. Luis Roche (Curso Estupendo), en su Capitulo 7, he creado mi nuevo componente, pero hay un par de cuestiones que no terminan de funcionar.

La primera y más estraña es que creo e instalo el componente, lo pongo en mi proyecto y medio funciona (aclaro más adelante), pero lo raro es que si deso quitarlo del form me da una series de mensajes y no me deja eliminarlo el primer mensaje que  me da
es

Invalid Pointer operation


El segundo es que no me carga los iconos respectivos del Archivo Res

El tercero (y este es muy estraño ya que funcionaba) es que no muestra el descuento, no estoy seguro de si no funciona el Timer o que pasa

y por último el cuarto es que No Puedo crear propiedades Tfont, me d una serie de errores muy extraños, así que tengo que llamar a lasdiversas propiedades del Font por separado.

Adjunto el componente el Registro , el pas y el Form necesarios con todo su código, y el archivo Res en un sólo Zip, el componente esta en su principio, ya que la idea es que sea un contenedor, para pedir password, mostrar errores, etc.., tener en cuenta que falta el Pakage para cargalo y en el Requieres falta añadir el designide.dcp

Archivos adjuntos


  • 0

#2 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 20 mayo 2012 - 12:38

A los Moderadores pueden agregar al Título 'Componente con ' qque no se porque se me borro al escribir.


Muchas Gracias.
  • 0

#3 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 22 mayo 2012 - 12:47

Que nadie tiene ni idea?
  • 0

#4 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 552 mensajes
  • LocationEspaña

Escrito 22 mayo 2012 - 06:25

¿Para que versión de Delphi lo estás creando / instalando?

Yo recuerdo que leí el curso de Luis Roche para la versión de Delphi 6, hace ya tiempo. No se si para las versiones más modernas ha cambiado algo el uso de las units de diseño.

Un saludo
  • 0

#5 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 22 mayo 2012 - 06:48

Saludos.

No he visto el código pero normalmente esto ocurre por varias razones:
- No has sobrescrito el método Destroy para liberar la referencia al (los) objeto(s) que creaste.
- Si utilizas propiedades tipo Persitent debes asegurarte de liberar el Owner al momento de la destrucción de la clase.
- No has sobrescrito el método Notification para realizar la asignación adecuada.

Prueba y nos avisas.
  • 0

#6 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 22 mayo 2012 - 10:15

¿Para que versión de Delphi lo estás creando / instalando?


Delphi 2010

Saludos.

No he visto el código pero normalmente esto ocurre por varias razones:
- No has sobrescrito el método Destroy para liberar la referencia al (los) objeto(s) que creaste.
- Si utilizas propiedades tipo Persitent debes asegurarte de liberar el Owner al momento de la destrucción de la clase.
- No has sobrescrito el método Notification para realizar la asignación adecuada.

Prueba y nos avisas.


1º), si no estoy equivocado , en el destroy libero todas las partes.
2º) Si uso Persitent, pero la verdad, no se si libero el Owner
3º) ni idea

La verdad muchas gracias por vuestra ayuda, el problema es que ayer me quede en mi otra casa y ahora hasta finales de semana, no voy a poder seguir con el componente, pero os pongo el código, del archivo principal, y así lo podeís comprobar, y ayudarme. muchas gracias compañeros, por cierto, he hecho una serie de ajustes en el código y eliminando el Timer y poniendo un Imagenlist, solucione varios de los otros problemas.




delphi
  1. unit UMiFContenedor;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
  7.   // Variants,
  8.  
  9.   type
  10.     TModel =(FormMensaje,FormEditor);
  11.     TTypeAcc = (IInfo,IOk,IError,Iquestion,INone);
  12.     TIConBand = (SInfo,SError,SQuestion,SCheck,SNone);
  13.     TIconMensaje = (MError,MQuestion,MInfo,MNone);
  14.  
  15. //----{LA BANDA}------------------------------------------------------------------------
  16.     TBand = class (Tpersistent)        //La banda
  17.     private
  18.         FBanda :Boolean;    //Mostrar banda con icono
  19.         FTextBand      :string;    //Texto a mostrar en la banda
  20.         FColorBand    :TColor; //Color De La banda
  21.         FIconBand  :TIConBand;  //Iconop de la banda
  22.         FFontSize  :Integer;  //Tamaño de la Fuente
  23.         FFontColor  :TColor;    //Color de la fuente de la banda
  24.         FFontName  :TFontName;  //Nombre de la fuente de la banda
  25.  
  26.         procedure setFontName  (const Value:TFontName);
  27.         procedure setBanda (const Value:Boolean);
  28.         procedure setTextBand (const Value:string);
  29.         procedure setColorBand (const Value:TColor);
  30.         procedure setIconBand  (const Value:TIConBand);
  31.         procedure setFontSize  (const Value:Integer);
  32.         procedure setFontColor (const Value:TColor);
  33.     published
  34.         property  Banda :Boolean      read FBanda          write setBanda default True;
  35.         property  TextBand :string      read FTextBand      write setTextBand;
  36.         property  ColorBand :TColor      read FColorBand      write setColorBand default clBtnFace;
  37.         property  IconBand :TIConBand read FIconBand write SetIconBand    default SNone;
  38.         property  FontSize  :Integer read FFontSize write SetFontSize    default 12;
  39.         property  FontColor :TColor read FFontColor write SetFontColor  default clBlack;
  40.         property  FontName :TFontName read FFontName write SetFontName;      //Nombre de la fuente de la banda
  41.     end;
  42. //----{DESCUENTO}----------------------------------------------------------------------
  43.     TDescuento = class (Tpersistent)        //Cuenta atras
  44.     private
  45.         FCuentaAtras  :Boolean;    //Realiza una cuenta atraz
  46.         FTimeCuenta    :Integer;    //Numero de segundos para la cuanta atraz
  47.         procedure setCuentaAtras (const Value:Boolean);
  48.         procedure setTimeCuenta (const Value:Integer);
  49.     published
  50.         property  CuentaAtras :Boolean      read FCuentaAtras    write setCuentaAtras default True;
  51.         property  TimeCuenta  :Integer      read FTimeCuenta    write setTimeCuenta        default 30;
  52.     end;
  53. //----{EL COMPONENTE}-------------------------------------------------------------------
  54.     TMiFContenedor = class(TComponent)
  55.     private
  56.         FBand :TBand;      //Llamamos a la colection de la banda
  57.         FDescuento :TDescuento; //Llamamos a la coleccion Descuento
  58.         FTitulo :string;    //Titulo de la barra del Form
  59.         FMensaje     :string;    //Texto a mostrar
  60.         FIcono  :TIconMensaje;  //Icono a mostrar
  61.         FSound :Boolean;    //Hacer sonar al mostrar
  62.         FModel        :TModel;      //Modelo del Form a llamar
  63.         FTypeAcc      :TTypeAcc;    //Determina parametros como icono, sonido color
  64.         FColor        :TColor;      //Color para partes no banda
  65.         FMentFontColor :TColor;  //Color de la fuente del Mensaje
  66.         FMEnFontSize  :Integer;  //Tamaño de la fuente
  67.         FMenFontNegrita:Boolean;  //Usar la Fuente del mensaje en negrita
  68.         FMenFontName  :TFontName;    //Fuente a usar
  69.  
  70.         procedure setMenFontName (const Value:TFontName);
  71.         procedure setMenFontNegrita(const Value:Boolean);
  72.         procedure setMenFontSize (const Value:Integer);
  73.         procedure setMentFontColor (const Value:TColor);
  74.         procedure setTitulo (const Value:string);
  75.         procedure setMensaje (const Value:string);
  76.         procedure setIcono (const Value:TIconMensaje);
  77.         procedure setSound (const Value:Boolean);
  78.         procedure setModel (const Value:TModel);
  79.         procedure setTypeAcc  (const Value:TTypeAcc);
  80.         procedure SetColor    (const Value:TColor);
  81.     protected
  82.     public
  83.         constructor Create(AOwner:TComponent);override;
  84.         procedure Execute;
  85.         destructor    Destroy; override;
  86.     published
  87.         property  Titulo :string    read FTitulo        write setTitulo;
  88.         property  Mensaje :string    read FMensaje     write setMensaje;
  89.         property  Icono   :TIconMensaje read FIcono write SetIcono default MNone;
  90.         property  Sound :Boolean      read FSound      write setSound default False;
  91.         property  Model :TModel      read FModel        write setModel    default FormMensaje;
  92.         property  TypeAcc :TTypeAcc    read FTypeAcc write setTypeAcc  default INone;
  93.         property  Color    :TColor      read FColor        write SetColor      default clBtnFace;
  94.         property  Banda    :TBand      read FBand          write FBand;                            //Sin esta no se ve
  95.         property  Descuento :TDescuento  read FDescuento    write FDescuento;
  96.         property  MentFontColor :TColor read FMentFontColor write SetMentFontColor  default clBlack;
  97.         property  MenFontSize  :Integer read FMEnFontSize write setMenFontSize    default 10;
  98.         property  MenFontNegrita:Boolean read FMenFontNegrita write SetMenFontNegrita default False;
  99.         property  MenFontName :TFontName read FMenFontName write SetMenFontName;
  100.   end;
  101.  
  102. implementation
  103.  
  104. uses UFMensaje, //Tipo Showmesaage
  105.     UEditor; //Editor con teclado para memos
  106.  
  107. constructor TMiFContenedor.Create(AOwner: TComponent);
  108.  
  109. begin
  110.   inherited Create(Aowner);
  111.   FBand :=TBand.Create;
  112.   with FBand do
  113.   begin
  114.       FBanda   :=True;
  115.       FTextBand :='';
  116.       FColorBand   :=clBtnFace;
  117.       FIconBand :=SNone;
  118.       FFontColor    :=$00CC3300;
  119.       FFontName      :='Arial';
  120.       FFontSize      :=12;
  121.   end;
  122.   FDescuento :=TDescuento.Create;
  123.   with FDescuento do
  124.   begin
  125.       FCuentaAtras :=True;
  126.       FTimeCuenta :=30;
  127.   end;
  128.   FTitulo :='Tirulo';
  129.   FMensaje :='Mensaje';
  130.   FIcono      :=MNone;
  131.   FSound :=False;
  132.   FModel      :=FormMensaje;
  133.   FTypeAcc :=INone;
  134.   FColor      :=clBtnFace;
  135.   FMEnFontSize :=10;
  136.   FMentFontColor :=clBlack;
  137.   FMenFontNegrita:=False;
  138.   FMenFontName :='Arial';
  139.  
  140. end;
  141.  
  142. destructor TMiFContenedor.Destroy;
  143. //------------------------------------------------------------------------------
  144. //**************************************************************[ DESTRUOY ]****
  145. //  Se encarga de liberar la memoria
  146. //------------------------------------------------------------------------------
  147. begin
  148.   FBand.Free;
  149.   FDescuento.Free;
  150. end;
  151.  
  152. procedure TMiFContenedor.Execute;  //------------------------------------------------[Inicio Execute]----
  153. //------------------------------------------------------------------------------
  154. //***************************************************************[ EXECUTE ]****
  155. //  Llama segun el Model
  156. //------------------------------------------------------------------------------
  157. var VarIIcon,VariiconMen:Integer;
  158. begin
  159.   case FTypeAcc of
  160.     IInfo:begin
  161.               FBand.ColorBand:=$003399FF;
  162.               FBand.FontColor:=$00CC6600;
  163.               VarIIcon:=2;
  164.           end;
  165.     IOk  :begin
  166.               FBand.ColorBand:=clGreen;
  167.               FBand.FontColor:=$00FF7FFF;
  168.               VarIIcon:=4;
  169.           end;
  170.     IError:begin
  171.               FBand.ColorBand:=clRed;
  172.               FBand.FontColor:=clAqua;
  173.               VarIIcon:=1;
  174.           end;
  175.  
  176.     Iquestion:begin
  177.               FBand.ColorBand:=clNavy;
  178.               FBand.FontColor:=$007FFFFF;
  179.               VarIIcon:=3;
  180.           end;
  181.     INone:begin
  182.               FBand.FontColor:=$FFFFFFF0;
  183.               VarIIcon:=0;
  184.           end;
  185.   end;
  186.   case FIcono  of
  187.       MError:VariiconMen:=1;
  188.       MQuestion:VariiconMen:=3;
  189.       MInfo:VariiconMen:=2;
  190.       MNone:VariiconMen:=0;
  191.   end;
  192.   case FModel of
  193.     FormMensaje:begin      //Para tipo Showmmesage
  194.     FFormensaje:=TFFormensaje.Create(Application);
  195.                   try
  196.                       //  FTTitux,FTMenx,FTBanx:string;
  197.                     FFormensaje.Fbandx:=FBand.FBanda;
  198.                     FFormensaje.FColorPX:=FBand.FColorBand;
  199.                     FFormensaje.FTBanx:=FBand.FTextBand;
  200.                     FFormensaje.FIconBx:=VarIIcon;
  201.                     FFormensaje.Panel1.Font.Size:=FBand.FFontSize;
  202.                     FFormensaje.Panel1.Font.Color:=FBand.FFontColor;
  203.                     FFormensaje.Panel1.Font.Name:=FBand.FFontName;
  204.                     FFormensaje.Panel1.Font.Style:=[fsBold];
  205.                     FFormensaje.FtimerX:=FDescuento.FCuentaAtras;
  206.                     FFormensaje.FIntervalx:=FDescuento.FTimeCuenta*1000;
  207.                     FFormensaje.FTMenx:=FMensaje;
  208.                     FFormensaje.FTTitux:=FTitulo;
  209.                     FFormensaje.FColorX:=FColor;
  210.                     FFormensaje.FIconMx:=VariiconMen;
  211.                     FFormensaje.FSoundx:=FSound;
  212.                     FFormensaje.Memo1.Font.Name:=FMenFontName;
  213.                     FFormensaje.Memo1.Font.Color:=FMentFontColor;
  214.                     FFormensaje.Memo1.Font.Size:=FMEnFontSize;
  215.                     if FMenFontNegrita then FFormensaje.Memo1.Font.Style:=[fsBold]
  216.                                       else FFormensaje.Memo1.Font.Style:=[];
  217.                     FFormensaje.Iniciar;
  218.                     Fformensaje.ShowModal;
  219.                   finally
  220.                     Fformensaje.Free;
  221.                   end;
  222.     end;
  223.       FormEditor:begin
  224.                     FEditor:=TFEditor.Create(Application);
  225.                   try
  226.                       FEditor.Memo1.Font.Name:=FMenFontName;
  227.                       FEditor.Memo1.Font.Color:=FMentFontColor;
  228.                       FEditor.Memo1.Font.Size:=FMEnFontSize;
  229.                       if FMenFontNegrita then FEditor.Memo1.Font.Style:=[fsBold]
  230.                                         else FEditor.Memo1.Font.Style:=[];
  231.                       FEditor.VarStextOriginal:=FMEnsaje;
  232.                       FEditor.Memo1.Lines.text:=FMensaje;
  233.                       FEditor.showmodal
  234.  
  235.                   finally
  236.                       FMENSAJE:=FEditor.Memo1.Lines.text;
  237.                     FEditor.Free;
  238.                     end;
  239.                 end;
  240.  
  241.   end;
  242.  
  243. end;                                //------------------------------------------------[Fin Execute]-------
  244.  
  245. procedure TMiFContenedor.SetColor(const Value: TColor);
  246. //------------------------------------------------------------------------------
  247. //*****************************************************************[ Color ]****
  248. //  Color general del Form
  249. //------------------------------------------------------------------------------
  250. begin
  251.   if FColor<>value then FColor:=Value;
  252. end;
  253.  
  254. procedure TMiFContenedor.SetIcono(const Value: TIconMensaje);
  255. //------------------------------------------------------------------------------
  256. //*****************************************************************[ ICONO ]****
  257. // Icono del Mensaje
  258. //------------------------------------------------------------------------------
  259. begin
  260.   if FIcono<>value then FIcono:=Value;
  261. End;
  262.  
  263.  
  264. procedure TMiFContenedor.setMensaje(const Value: string);
  265. //------------------------------------------------------------------------------
  266. //***************************************************************[ Mensaje ]****
  267. //  Texto general del Cuerpo
  268. //------------------------------------------------------------------------------
  269. begin
  270.   if FMensaje<>value then FMensaje:=Value;
  271. end;
  272.  
  273. procedure TMiFContenedor.setModel(const Value: TModel);
  274. //------------------------------------------------------------------------------
  275. //*****************************************************************[ MODEL ]****
  276. //  Los diferentes tipos de mensajes a mandar
  277. //------------------------------------------------------------------------------
  278. begin
  279.   if FModel<>value then FModel:=Value;
  280. end;
  281.  
  282. procedure TMiFContenedor.setSound(const Value: Boolean);
  283. //------------------------------------------------------------------------------
  284. //*****************************************************************[ Sound ]****
  285. // Mandar sonido al mostrar el form (ojo si TypeAcc <>Inone, los carde windows)
  286. //------------------------------------------------------------------------------
  287. begin
  288.   if FSound<>value then FSound:=Value;
  289. end;
  290.  
  291. procedure TMiFContenedor.setTitulo(const Value: string);
  292. //------------------------------------------------------------------------------
  293. //****************************************************************[ Titulo ]****
  294. // Texto que aparece en el Caption del Form si lo tiene
  295. //------------------------------------------------------------------------------
  296. begin
  297.   if FTitulo<>value then FTitulo:=Value;
  298. end;
  299.  
  300. procedure TMiFContenedor.setTypeAcc(const Value: TTypeAcc);
  301. //------------------------------------------------------------------------------
  302. //***************************************************************[ TypeAcc ]****
  303. //  Carga valores como color, sonido, Texto de la banda e icono, según acción seleccionada
  304. //------------------------------------------------------------------------------
  305. begin
  306.   if FTypeAcc<>value then FTypeAcc:=Value;
  307. end;
  308.  
  309. procedure TMiFContenedor.SetMenFontSize(const Value: Integer);
  310. //------------------------------------------------------------------------------
  311. //***********************************************************[ MENFONTSIZE ]****
  312. // Tamaño de la fuente del Mensaje
  313. //------------------------------------------------------------------------------
  314. begin
  315.   if FMenFontSize<>value then FMenFontSize:=Value;
  316. End;
  317.  
  318. procedure TMiFContenedor.SetMentFontColor(const Value: TColor);
  319. //------------------------------------------------------------------------------
  320. //*********************************************************[ MENTFONTCOLOR ]****
  321. // Color de la fuente del Mensaje
  322. //------------------------------------------------------------------------------
  323. begin
  324.   if FMentFontColor<>value then FMentFontColor:=Value;
  325. End;
  326.  
  327. procedure TMiFContenedor.SetMenFontNegrita(const Value: Boolean);
  328. //------------------------------------------------------------------------------
  329. //********************************************************[ MENFONTNEGRITA ]****
  330. // Usar la Fuente del mensaje en negrita
  331. //------------------------------------------------------------------------------
  332. begin
  333.   if FMenFontNegrita<>value then FMenFontNegrita:=Value;
  334. End;
  335.  
  336. procedure TMiFContenedor.SetMenFontName(const Value: TFontName);
  337. //------------------------------------------------------------------------------
  338. //***********************************************************[ MENFONTNAME ]****
  339. // Fuente a usar
  340. //------------------------------------------------------------------------------
  341. begin
  342.   if FMenFontName<>value then FMenFontName:=Value;
  343. End;
  344.  
  345.  
  346. //La banda------------------------------------------------------------------------------------------------
  347. procedure TBand.setBanda(const Value: Boolean);
  348. //------------------------------------------------------------------------------
  349. //*****************************************************************[ Banda ]****
  350. //  Muestrar la banda y lo que conlleba
  351. //------------------------------------------------------------------------------
  352. begin
  353.   if FBanda<>value then FBanda:=Value;
  354. end;
  355.  
  356.  
  357. procedure TBand.setColorBand(const Value: TColor);
  358. //------------------------------------------------------------------------------
  359. //*************************************************************[ ColorBand ]****
  360. //  Color de la banda, cambia según TypeAcc
  361. //------------------------------------------------------------------------------
  362. begin
  363.   if FColorBand<>value then FColorBand:=Value;
  364. end;
  365.  
  366. procedure TBand.SetFontSize(const Value: Integer);
  367. //------------------------------------------------------------------------------
  368. //**************************************************************[ FONTSIZE ]****
  369. // Tamaño de la fuente en la banda
  370. //------------------------------------------------------------------------------
  371. begin
  372.   if FFontSize<>value then FFontSize:=Value;
  373. End;
  374.  
  375. procedure TBand.SetFontColor(const Value: TColor);
  376. //------------------------------------------------------------------------------
  377. //*************************************************************[ FONTCOLOR ]****
  378. // Color de la fuente de la banda
  379. //------------------------------------------------------------------------------
  380. begin
  381.   if FFontColor<>value then FFontColor:=Value;
  382. End;
  383.  
  384. procedure TBand.SetFontName(const Value: TFontName);
  385. //------------------------------------------------------------------------------
  386. //**************************************************************[ FONTNAME ]****
  387. // Nombre de la fuente de la banda
  388. //------------------------------------------------------------------------------
  389. begin
  390.   if FFontName<>value then FFontName:=Value;
  391. End;
  392.  
  393.  
  394. procedure TBand.SetIconBand(const Value: TIConBand);
  395. //------------------------------------------------------------------------------
  396. //**************************************************************[ ICONBAND ]****
  397. // iconos de uso en la banda
  398. //------------------------------------------------------------------------------
  399. begin
  400.   if FIconBand<>value then FIconBand:=Value;
  401. End;
  402.  
  403. procedure TBand.setTextBand(const Value: string);
  404. //------------------------------------------------------------------------------
  405. //**************************************************************[ TextBand ]****
  406. // texto de la banda, cambia según TypeAcc
  407. //------------------------------------------------------------------------------
  408. begin
  409.   if FTextBand<>value then FTextBand:=Value;
  410. end;
  411.  
  412. //Descuento -------------------------------------------------------------------------------
  413. procedure TDescuento.setCuentaAtras(const Value: Boolean);
  414. //------------------------------------------------------------------------------
  415. //***********************************************************[ CuentaAtras ]****
  416. // Muestra o No la cuenta atras
  417. //------------------------------------------------------------------------------
  418. begin
  419.   if FCuentaAtras<>value then FCuentaAtras:=Value;
  420. end;
  421.  
  422. procedure TDescuento.setTimeCuenta(const Value: Integer);
  423. //------------------------------------------------------------------------------
  424. //************************************************************[ TimeCuenta ]****
  425. // Número de segundo de cuenta atras
  426. //------------------------------------------------------------------------------
  427. begin
  428.   if FTimeCuenta<>value then FTimeCuenta:=Value;
  429. end;
  430.  
  431. end.


  • 0

#7 Desart

Desart

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 715 mensajes
  • LocationEspaña

Escrito 26 mayo 2012 - 01:15

Hola compañeros, doy el tema como resuelto, ya que he logrado solucionar los diversos problemas, de una manera o de otra

El cuarto punto, lo solucione cargando las propiedades del Font (no todas), de manera independiente.
El tercero monte un sistema de espera, que no es en segundos, pero que vale como idea.
El segundo, cargue unos iconos en un ImagenList y paso el dato como un  integer, y ene el form muestro la imagen que equivale al valor del integer.
Y el primero y el que más me preocupaba, era una chorrada de error, bastaba con añadir  en el Destroy la siguiente linea



delphi
  1. inherited;


  • 0