PDA

Visualizza la versione completa : [DELPHI] Creare un form "personalizzato"


VaLvOnAuTa
18-05-2006, 14:57
Il titolo non è molto chiaro, lo so.
In pratica l'idea è quella di creare un TForm customizzato (per farne un popup alla google desktop per intenderci).
Ho creato la classe derivata da TForm

unit mypopup;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TPopForm = class(TForm)
pnlText,
pnlTitle: TPanel;
LblTitle,
LblText : TLabel;
public
constructor Create(AOwner: TComponent); override;
end;
implementation

constructor TPopForm.Create(AOwner: TComponent);
var
Desktop: TRect;
begin
inherited Create(AOwner);
Height := 120;
Width := 300;
if SystemParametersInfo(SPI_GETWORKAREA,0,@Desktop,0) then
begin
Left := Desktop.Right - Width;
Top := Desktop.Bottom - Height;
end;
pnlTitle.Align := alTop;
pnlTitle.Height := 20;
pnlTitle.Color := $00ff0000;
LblTitle.Parent := pnlTitle;
end;

end.E volevo crearlo a run-time durante l'esecuzione del programma (ad esempio al click di un bottone).
Però se lo costruisco così:
p:= TPopForm.Create(Form1); mi da "TPopForm Resource not found"

mentre se lo costruisco così
p.Create(Form1); mi dà stack overflow. In cosa sbaglio? :stordita:

alka
18-05-2006, 21:44
Manca il riferimento al file DFM che deve essere presente per consentire al form di prelevare i propri dati:


{$R *.dfm}

Qualcosa mi fa pensare che tu non abbia creato questo form nel modo convenzionale. :stordita:

VaLvOnAuTa
18-05-2006, 21:54
Originariamente inviato da alka
Manca il riferimento al file DFM che deve essere presente per consentire al form di prelevare i propri dati:


{$R *.dfm}

Qualcosa mi fa pensare che tu non abbia creato questo form nel modo convenzionale. :stordita: Quel coso è importante? :stordita:

No in realtà la mia idea era quello di creare una classe che potesse creare il form a run-time. E devo dire che ci sono pure riuscito. Solo che non riesco ad assegnare gli eventi al form una volta creato :fagiano:

alka
18-05-2006, 22:23
Originariamente inviato da VaLvOnAuTa
Quel coso è importante? :stordita:

Abbastanza. :stordita:


Originariamente inviato da VaLvOnAuTa
No in realtà la mia idea era quello di creare una classe che potesse creare il form a run-time. E devo dire che ci sono pure riuscito. Solo che non riesco ad assegnare gli eventi al form una volta creato :fagiano:
Quella classe puoi crearla comunque pur inserendo il Form nella maniera classica, con [File|New Form]. Non vedo quale sia il vantaggio di scrivere il form a mano, tralasciando elementi che generalmente sono fondamentali per il Form.

VaLvOnAuTa
19-05-2006, 13:04
Originariamente inviato da alka
Abbastanza. :stordita:


Quella classe puoi crearla comunque pur inserendo il Form nella maniera classica, con [File|New Form]. Non vedo quale sia il vantaggio di scrivere il form a mano, tralasciando elementi che generalmente sono fondamentali per il Form. Vantaggi nessuno (anche disegnarlo senza strumenti visuali è alquanto una rottura). Infatti ho lasciato perdere. Lascio che il form sia creato all'avvio e poi nascosto. Poi eventuali operazioni da eseguire all'evento "oncreate" le eseguo su "onshow" e mi risolvo i problemi. :zizi:
Pensavo che creandolo e distruggendolo quando serviva avrebbe risparmiato un pò di risorse. :fagiano:

alka
19-05-2006, 13:15
Originariamente inviato da VaLvOnAuTa
Pensavo che creandolo e distruggendolo quando serviva avrebbe risparmiato un pò di risorse.
Uh!? :confused:

Questo è sacrosanto, hai pienamente ragione, ma non capisco cosa c'entra la progettazione del form visuale e non con la creazione dinamica di un'istanza del form che puoi fare comunque e quando lo ritieni opportuno.

Perché intercettare l'OnShow e nascondere una form di cui non si ha bisogno lasciando che venga creata?

Hai la totale padronanza nella scelta di quali finestre debbano essere o meno create a runtime in modo automatico.

Vai nella finestra di dialogo delle opzioni del progetto, pagina "Forms" se non sbaglio, e scegli quali form creare automaticamente.

Ciao! :ciauz:

VaLvOnAuTa
19-05-2006, 15:23
Hai perfettamente ragione. Avevo pensato una cosa più o meno giusta e l'ho realizzata a pene di canide.
Bastava un

Application.CreateForm(TPopup, Popup);
Popup.Show;

Grazie mille :)

(E' venuta una cosa abbastanza carina.. stile popup di google desktop.. :zizi: )

Loading