Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Initialisierung falsch ! (https://www.delphipraxis.net/211244-initialisierung-falsch.html)

TERWI 21. Aug 2022 15:13

AW: Initialisierung falsch !
 
Tja, denke mal da hat sich jemand was dabei gedacht und es hat einen tieferen SInn, warum OnActivate (und was auch immer noch) "umgeleitet" wird.
Man kann das jetzt so oder so sehen ... wichtig ist, es zu wissen !
Dann sucht man nicht tagelang rum und versteht die Welt nicht mehr.

Und ehrlich gesagt: Hätte ich hier den Debugger benutzt, hätte mir die Anzeige wie in jaenicke's Bild auch keinen CM weitergebracht.
Wäre mir die "andere" Reihenfolge nicht im LOG aufgefallen, hätte ich wahrscheinlich in letzter Not die IDE neu installiert .... :shock:

Uwe's Antwort macht's dann noch etwas klarer.
Zitat:

Niemand hat behauptet dass Programmieren einfach sei.
GENAU ! 8-)

TERWI 21. Aug 2022 15:18

AW: Initialisierung falsch !
 
Nachtrag:
In der OH steht auch nur das drin, wie ich meinte es zu wissen
Zitat:

Bestimmt, ob die Komponente auf dem Bildschirm angezeigt wird.

Mit der Eigenschaft Visible können Sie die Sichtbarkeit des Steuerelements zur Laufzeit steuern. Wenn Visible True ist, wird das Steuerelement angezeigt. Hat die Eigenschaft den Wert False, ist es nicht zu sehen.

jaenicke 21. Aug 2022 17:32

AW: Initialisierung falsch !
 
Da steht doch deutlich "Wenn Visible True ist, wird das Steuerelement angezeigt.". Und genau das ist doch auch der Fall: Sobald das Programm ausgeführt wird, ist das Fenster sichtbar, genauso wie es bei jeder Komponente auf einem Formular auch der Fall ist, wenn Visible auf True steht.

Formulare werden zur Laufzeit im Grunde genauso geladen wie jede andere Komponente.

himitsu 21. Aug 2022 23:52

AW: Initialisierung falsch !
 
Bei der Mainform (die erste Form über Application.CreateForm) wird sie nach dem Laden immer auf Visible=True (Show) gesetzt.

Andere Forms werden sichtbar, wenn der Entwickler es danach sagt, also Show oder ShowModal (wenn die auch mit Visible=False designed wurden).
Und vor ShowModal muß die Form sowieso immer Visible=False sein.


Mit Visible=False hat man nach dem Erstellen (Create) auch noch genug Zeit um irgendwas einzustellen, vor dem Anzeigen.

TERWI 24. Aug 2022 19:28

AW: Initialisierung falsch !
 
... es wird immer verrückter.
Das Proggie funzt zwar i.d.R., aber mit ist aufgefallen, das so einige LOG-Zeilen fehlen. Dachte erst der Logger spinnt ... nein tut er nicht.
Die im neu aufgebauten Projekt zuletzt in der IDE hinzugefügte Form ZatVLC weigert sich beharrlich, LOGs anzuzeigen ... bis auf 2 (s.u.)
Damit nicht wieder diese Fragen wie "... und was ist mit Code ?" kommen, hier nun diverses.
Die Projektdatei:
Delphi-Quellcode:
program ZATTOO;

uses
  Vcl.Forms,
  LOGGER5 in 'LOGGER5.pas' {LOGGER},
  uHTTP in 'uHTTP.pas',
  ZAT_MAIN in 'ZAT_MAIN.pas' {ZATMain},
  ZAT_LIB in 'ZAT_LIB.pas' {ZatLIB},
  ZAT_CHL in 'ZAT_CHL.pas' {ZatChl},
  ZAT_CHLSEL in 'ZAT_CHLSEL.pas' {chl_BOX},
  ZAT_EPG in 'ZAT_EPG.pas' {ZatEpg},
  ZAT_INFO in 'ZAT_INFO.pas' {ZatINFO},
  ZAT_VLC in 'ZAT_VLC.pas' {ZatVLC};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TZATMain, ZATMain);
  Application.CreateForm(TZatLIB, ZatLIB);
  Application.CreateForm(TZatChl, ZatChl);
  Application.CreateForm(Tchl_BOX, chl_BOX);
  Application.CreateForm(TZatEpg, ZatEpg);
  Application.CreateForm(TZatINFO, ZatINFO);
  Application.CreateForm(TZatVLC, ZatVLC);
  Application.Run;
end.
Die Initialisierung - Auruf über OnShow der MainForm:
Delphi-Quellcode:
procedure TZatMAIN.FormInit(Sender: TObject);
begin
  Log('INIT', '... INIT MODULES ...');
  if FIsInit then exit; //
  ZatLIB._Init(Dispatcher);
  ZatCHL._Init(Dispatcher);
  chl_BOX._Init(Videopanel, ChangeChannel);
  ZatEPG._Init(Dispatcher, VideoPanel);
  ZatINFO._Init(Videopanel);
  ZatVLC._Init(Dispatcher,
               VideoPanel,
               'ZATTOO',  // name for graph
               TRUE);     // DO LOG
  FIsInit := true;  // State neccessary for RESIZE !!!
end;
Die neue Zat_VLC.pas (DFM dazu ist eine blanke Form mit nix drin):
Delphi-Quellcode:
unit ZAT_VLC;

interface

uses
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls,
  LOGGER5;

type
  TResponse = procedure(Typ, Mode, Result : integer) of object;

  TZatVLC = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FResponse  : TResponse;
    FVideoPanel : TPanel;
    FName      : string;
    FDoLog     : boolean;
    procedure LOG(S1, S2 : string);
  public
    function _Init(Response : TResponse;
                    Panel : TPanel;
                    Name : string;
                    DoLog : boolean = true) : integer;
  end;

var
  ZatVLC: TZatVLC;

implementation

{$R *.dfm}

procedure TZatVLC.FormCreate(Sender: TObject);
begin
  Log('CREATE', '... begin');
  FResponse  := NIL;
  FVideoPanel := NIL;
  FName      := '';
  FDoLog     := false;
  Log('CREATE', '... end');
end;

procedure TZatVLC.FormDestroy(Sender: TObject);
begin
  Log('DESTROY', '... begin');
  // das hier nur damit was passiert ....
  FResponse  := NIL;
  FVideoPanel := NIL;
  FName      := '';
  FDoLog     := false;
  Log('DESTROY', '... end');
end;

function TZatVLC._Init(Response : TResponse;
                       Panel : TPanel;
                       Name : string;   // for naming graho and ROT
                       DoLog : boolean = true) : integer;
begin
  Log('DoInit', ' ...begin');
  result     := -1;
  FResponse  := Response;
  FVideoPanel := Panel;
  FName      := Name;
  FDoLog     := DoLog;
  Log('DoInit', ' ...end');
end;

procedure TZatVLC.LOG(S1, S2 : string);
begin
  if (Assigned(LOGGER) AND FDoLog) then LOGGER.LOG('VLC', S1, S2);
end;

end.
... und nun die LOG-Datei dazu:
Delphi-Quellcode:
[20:14:40:543] [LOG - CREATE]: ... OK !
[20:14:40:606] [MAIN - CREATE]: ... begin
[20:14:40:612] [MAIN - CREATE]: ... end
[20:14:40:612] [ZATLIB - CREATE]: ... begin
[20:14:40:628] [ZATLIB - CREATE]: ... end
[20:14:40:644] [CHL - Create]: ...begin
[20:14:40:644] [CHL - Create]: ...end
[20:14:40:644] [CHLBOX - Create]: ...begin
[20:14:40:644] [CHLBOX - Create]: ...end
[20:14:40:644] [EPG - Create]: ...begin
[20:14:40:644] [EPG - Create]: ...end
[20:14:40:659] [INFO - Create]: ...begin
[20:14:40:659] [INFO - Create]: ...end
[20:14:40:675] [MAIN - INIT]: ... INIT MODULES ...
[20:14:40:675] [ZATLIB - DoInit]: ...begin
[20:14:40:675] [ZATLIB - DoInit]: ...end
[20:14:40:675] [CHL - DoInit]: ...begin
[20:14:40:675] [CHL - DoInit]: ...end
[20:14:40:675] [CHLBOX - DoInit]: ...begin
[20:14:40:691] [CHLBOX - DoInit]: ...end
[20:14:40:691] [EPG - DoInit]: ...begin
[20:14:40:691] [EPG - DoInit]: ... end
[20:14:40:691] [INFO - DoInit]: ...begin
[20:14:40:691] [INFO - DoInit]: ...end
..... wo ist das "[VLC - DoInit]: ...begin" geblieben `?
[20:14:40:691] [VLC - DoInit]: ...end
[20:14:42:765] [MAIN - CLOSE]: ... start
[20:14:42:765] [MAIN - CLOSE]: ... end
[20:14:42:765] [VLC - DESTROY]: ... begin
..... wo ist das "[VLC - DESTROY]: ... end" geblieben `?
[20:14:42:765] [INFO - Destroy]: ...begin
[20:14:42:765] [INFO - Destroy]: ...end
[20:14:42:765] [EPG - DESTROY]: ...begin
[20:14:42:765] [EPG - DESTROY]: ...end
[20:14:42:765] [CHLBOX - Destroy]: ...begin
[20:14:42:765] [CHLBOX - Destroy]: ...end
[20:14:42:765] [CHL - Destroy]: ...begin
[20:14:42:765] [CHL - Destroy]: ...end
[20:14:42:765] [ZATLIB - DESTROY]: ... begin
[20:14:42:765] [ZATLIB - DESTROY]: ... end
[20:14:42:781] [MAIN - DESTROY]: ... start
[20:14:42:781] [MAIN - DESTROY]: ... end
Bemerkungen zu siehe nachgetragen in der LOG-Datei.
Der Logger loggt sauber bis zum Ende durch.
Alle Formen sind prinzipiell wie die ZAT_VLC aufgebaut.
Initialisiert auch so wie gedacht und umgekehrt beim beenden.
Bei jeder weiteren Form das gleiche/ähnliche Spielchen.
Sehe ich da was nicht ?

Es sind nur die benötigten Dateien im Verzeichnis.
Von den Projektdaten bis auf die DPR alles gelöscht.
Auch alle DCU's.
Quasi ein nacktes Projekt.

himitsu 24. Aug 2022 19:51

AW: Initialisierung falsch !
 
Erstmal solltest du einfach mal in die Forms sehen, ob wirklich die Events (OnCreate) angehängt sind.

Zitat:

wo ist das "[VLC - DoInit]: ...begin" geblieben `?
Ja, und wo ist das "Create" geblieben? :roll:

Rate mal was passiert, wenn die Form nicht da ist und du Methoden davon aufrufen willst.

Und nun rate auch mal was der Debugger da helfen kann.
z.B. Haltepunkt auf
Delphi-Quellcode:
ZatLIB._Init(Dispatcher);
und die Maus über ZatLIB halten, oder diese Variable in die "überwachten Ausrücke" aufnehmen. (in den "lokalen Variablen" sieht man sie natürlich nicht)



Haltepunkte [F5] auf
Application.Initialize;
Application.CreateForm(TZatVLC, ZatVLC);
und
ZatLIB._Init(Dispatcher);
dann F9 ab den Haltepunkten weiter mit F8 und schauen was passiert.

Im nächsten Durchlauf, wenn man eine Stelle entdeckt hatte, ab welcher es falsch läuft, einmal mit F7 reingehn, falls man nich bereits aus der "knallenden Position" oder aus dem Stacktrace was erkennt.

Beim Halt an einer Exception, wenn man nichts sieht, dann nochmal F7 ... mehr als noch mehr schiefgehn kann eh nicht und mit etwas Glück wird es besser.

TERWI 24. Aug 2022 20:09

AW: Initialisierung falsch !
 
Stimmt - OnCreate fehlt da auch. Hab ich vergessen zu notieren.
Der OnCreate-Event ist definitv besetzt !
Mit der "Vorgängerdatei" ging das ja auch (siehe eingangs) und das funktioniert auch alles anscheinend und
ES KNALLT NIRGENDWO !
Wenn ich alle auskarkierten LOG() in den _Init's, FormCreate/-Destroy setze, sehe ich auch alle....
NUR DIE ZAT_VLC eben nicht (mehr).

Und nun bitte nicht lachen:
Ich hab einige F-Tasten hier am Schleppi kaputt. Auch F9.
Das wird schwierig mit dem Debugger....
(Das ist kein Witz)

Delphi.Narium 24. Aug 2022 20:23

AW: Initialisierung falsch !
 
Delphi-Quellcode:
 if (Assigned(LOGGER) AND FDoLog) then LOGGER.LOG('VLC', S1, S2);
Ist Logger ein entsprechende Methode zugewiesen? Wenn ja, wo?

Und:
Delphi-Quellcode:
FDoLog := false;
Die Zuweisung von
Delphi-Quellcode:
FDoLog := DoLog;
erfolgt erst nach dem
Delphi-Quellcode:
Log('CREATE', '... begin');
, von daher ist das Fehlen des Begin bei
Delphi-Quellcode:
..... wo ist das "[VLC - DoInit]: ...begin" geblieben `?
korrekt, es wäre eher verwunderlich, wenn es ausgegeben würde.

Delphi-Quellcode:
function TZatVLC._Init(Response : TResponse;
                       Panel : TPanel;
                       Name : string; // for naming graho and ROT
                       DoLog : boolean = true) : integer;
begin
  FDoLog := DoLog; // Bevor diese Zuweisung erfolgt, kann nicht geloggt werden.
                   // In Log muss FDoLog zur Ausgabe zwingend = true sein.
                   // Da _Init nach dem FormCreate erfolgt, kann aus dem FormCreate
                   // kein Eintrag im Logfile stehen.
  Log('DoInit', ' ...begin');
  result := -1;
  FResponse := Response;
  FVideoPanel := Panel;
  FName := Name;
  Log('DoInit', ' ...end');
end;
Wenn die F-Tasten kaputt sind: Du kann alles auch per Maus über das Menü erreichen. Gibt halt dann ein paar zusätzliche Kilometer, die die Maus laufen muss.

F9 ist einfach nur: Programm starten, da das bei Dir ja funktioniert, nimmst Du da weiterhin den funktionierenden Weg.

Uwe Raabe 24. Aug 2022 21:33

AW: Initialisierung falsch !
 
Wenn ich das richtig verfolge, wird FDoLog erst kurz vor DoInit-end auf true gesetzt. Alles davor kann somit nicht im Log erscheinen.
Delphi-Quellcode:
  FDoLog := DoLog;
  Log('DoInit', ' ...end');

TERWI 25. Aug 2022 01:39

AW: Initialisierung falsch !
 
Redo ...
Ich nehme alles zurück und behaupte das Gegenteil...

Uwe hat Recht - mein Fehler, jetzt hab ich*s auch gesehen
' ... AND FDoLog' ist das Prob.

Ich schäme mich zutiefst, das ich das nicht selbst gesehen habe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:07 Uhr.
Seite 3 von 4     123 4      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz