![]() |
AW: TTimer als Var im Constructor eines TForms übergeben
Zitat:
|
AW: TTimer als Var im Constructor eines TForms übergeben
ich verstehe zwar den teil nicht ganz
Delphi-Quellcode:
mp.pMethod := @TdmMain.OnTimerTimeOut;
mp.pObject := nil; gTiPostpone.OnTimer := TNotifyEvent(mp); und das ist böse
Delphi-Quellcode:
aber bei mir meckert der Compiler nicht an;
if not Assigned(frmRem) then
frmRem := frmRem.Create(self); |
AW: TTimer als Var im Constructor eines TForms übergeben
Zitat:
2) meckert er zur Laufzeit auch nicht? |
AW: TTimer als Var im Constructor eines TForms übergeben
1.)
du hast Dich vertippt if not Assigned(frmRem) then frmRem := frmRem.Create(self); statt if not Assigned(frmRem) then frmRem := TfrmRem.Create(self); 2.) Tut twar nichts außer Fenster anzeigen, läut aber... |
AW: TTimer als Var im Constructor eines TForms übergeben
es gibt noch eine Falle:
DataModuleMain; private frmRem: TfrmRem; heißt wahrscheinlich (der Teil Code fehlte im Post) genauso wie FormRem; var frmRem: TfrmRem; hier kannst Du nie sagen welche der Variablen jetzt an welcher Stelle greift. |
AW: TTimer als Var im Constructor eines TForms übergeben
Auch die beiden letzten Tipps haben den Fehler nicht abstellen können.
@Bummi: Die Variable, die sich standardmäßig in dem frmRem befinden müsste hab ich gelöscht, um genau der Falle, die du angedeutet hast, vorzubeugen. Noch weitere Vorschläge?? Gruß |
AW: TTimer als Var im Constructor eines TForms übergeben
Zitat:
|
AW: TTimer als Var im Constructor eines TForms übergeben
Hallöchen,
abgesehen davon, dass sich mir der Sinn für dein Konstrukt nicht erschliesst und ich glaube, das du dich da in etwas verrannt hast, was du eventuell noch überdenken müsstest... um es ans Laufen zu bekommen, sind folgende Änderungen nötig: Da der Timer in der unit FormRem nicht benutzt wird, fehlt er zur Laufzeit und muss daher mit RegisterClass registriert werden.
Delphi-Quellcode:
Der Kram mit dem MethodPointer etc... unnötig kompliziert, kann vereinfacht werden.
unit FormRem;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TfrmRem = class(TForm) // ... private fTiPostpone: TTimer; public end; implementation {$R *.dfm} { TTfrmRem } {...} initialization RegisterClass(TTimer); end.
Delphi-Quellcode:
So müsste es jetzt funktionieren... Viel Spaß damit!
unit DataModuleMain;
interface uses SysUtils, Classes, ExtCtrls, FormRem; type TdmMain = class(TDataModule) procedure DataModuleCreate(Sender: TObject); private { Private-Deklarationen } public frmRem: TfrmRem; procedure OnTimerTimeOut(Sender: TObject); end; var dmMain: TdmMain; gTiPostpone: TTimer; implementation {$R *.dfm} //type // TMethodePionter = packed record // pMethod: Pointer; // pObject: TObject; // end; procedure TdmMain.DataModuleCreate(Sender: TObject); //var // mp: TMethodePionter; begin gTiPostpone := TTimer.Create(self); gTiPostpone.Enabled := false; // mp.pMethod := @OnTimerTimeOut; // mp.pObject := nil; gTiPostpone.OnTimer := OnTimerTimeOut; // TNotifyEvent(mp); frmRem := TfrmRem.Create(self); frmRem.PostPoneTimer := gTiPostpone; frmRem.Show(); end; procedure TdmMain.OnTimerTimeOut(Sender: TObject); begin gTiPostpone.Enabled := false; if not Assigned(frmRem) then frmRem := TfrmRem.Create(self); // <--- TfrmRem.Create !!! frmRem.PostPoneTimer := gTiPostpone; frmRem.Show(); end; end. MfG Wormid |
AW: TTimer als Var im Constructor eines TForms übergeben
RegisterClass ... Die Exception tritt auf, weil der DFM-Loader versucht einen Timer zu laden/erstellen, welchen er nicht kennt (automatisch kennt er immer nur Komponenten, beim Compilieren in der entsprechenden DFM-Resource enthalten waren)
RegisterClass behebt also nur das Symptom und Produziert nebenbei noch eine kleines Leck, falls der DFM-Loader einen Timer erstellt, in diesem Feld ablegt und man danach dieses Feld (Variable) mit dem externen Timer überschreibt. (der alte Timer wird dabei nicht gelöscht) Es wäre also besser irgendwie dem DFM-Loader beizubringen, daß ihn dieses Feld nichts angeht. Es darf also schonmal nicht als publisches deklariert sein, was es nicht ist ... also wie/wo/warum will der DFM-Loader dort einen TTimer laden? Diesen Grund (die Ursache) sollte man abstellen. |
AW: TTimer als Var im Constructor eines TForms übergeben
Zitat:
Naja kleiner Fehler große Wirkung und ein recht opulenter Thread :D. Danke noch mal an alle für ihre Vorschläge Grüße |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz