Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich? (https://www.delphipraxis.net/196060-assigned-tform-instanzenvariable-funktionsuebergabe-moeglich.html)

günni0 19. Apr 2018 19:06

Delphi-Version: 10.2 Tokyo

Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Ich habe eine Funktion, welcher ich eine TForm-Variable übergebe. Es existiert nicht zwangsweise bereits eine Instanz dieses Formulars.

Damit mein Code schön sauber bleibt, packe ich alles in Prozeduren. Eine davon speichert die Fenstergröße und -position. Einziger Parameter ist die Form-Instanzenvariable, die aber wie gesagt auch nil sein kann.

Bin ich jetzt gezwungen ein if Assigned(formxyz) then da drum zu packen oder geht das auch direkt im Funktionsaufruf irgendwie?

hoika 19. Apr 2018 19:14

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Hallo,
die richtige Position der NIL-Auswertung ist in der Prozedur selbst.

günni0 19. Apr 2018 19:14

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Dann bleibt ja nichts anderes übrig als ein if vor die Funktion zu setzen in diesem Falle. Denn der Parameter ist die Instanz selbst.

bernau 19. Apr 2018 22:18

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Zeig doch mal deinen bestehenden Code.

Jasocul 20. Apr 2018 06:10

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Zitat:

Zitat von günni0 (Beitrag 1399886)
Dann bleibt ja nichts anderes übrig als ein if vor die Funktion zu setzen in diesem Falle. Denn der Parameter ist die Instanz selbst.

Nein.
Du kannst auch in der Funktion selbst prüfen, ob der übergebene Wert assigned ist. Kurzes Beispiel:
Delphi-Quellcode:
function MeineFunktion(aForm : TForm) : Boolean;
begin
  Result := Assigned(aForm);
  if Result then
  begin
    // Position der Form setzen
  end;
end;

TigerLilly 20. Apr 2018 07:07

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
So ist das zwar defensiv programmiert, aber schlechter Stil. Für einen Form, den es gar nicht gibt, die Position speichern zu wollen, ist nicht sauber. Ich würde das Problem an der Stelle lösen, wo es auftritt: beim Aufruf bzw noch vorher in der Logik, die auswählt, für welchen Form die Position gespeichert werden soll.

günni0 20. Apr 2018 07:21

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Zitat:

Zitat von Jasocul (Beitrag 1399907)
Zitat:

Zitat von günni0 (Beitrag 1399886)
Dann bleibt ja nichts anderes übrig als ein if vor die Funktion zu setzen in diesem Falle. Denn der Parameter ist die Instanz selbst.

Nein.
Du kannst auch in der Funktion selbst prüfen, ob der übergebene Wert assigned ist. Kurzes Beispiel:
Delphi-Quellcode:
function MeineFunktion(aForm : TForm) : Boolean;
begin
  Result := Assigned(aForm);
  if Result then
  begin
    // Position der Form setzen
  end;
end;

Spätestens beim Aufruf von MeineFunktion() kracht es dann.
Delphi-Quellcode:
procedure MeineFunktion(const aForm : TForm);
begin
  Mach etwas mit aForm
end;

// Kein Problem
if Assigned(aForm ) then
 MeineFunktion(aForm);

// Problem (egal ob man Assigned in MeineFunktion hat oder nicht)
MeineFunktion(aForm);

bernau 20. Apr 2018 07:49

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Zitat:

Zitat von günni0 (Beitrag 1399914)
Spätestens beim Aufruf von MeineFunktion() kracht es dann.

Das bezweifel ich mal. Mit dem assign wird ja kontrolliert, ob aForm NIL ist.

Es könnte aber sein, daß aForm nicht NIL ist sondern einen undefinierten Zustand hat. Das solltest du mit dem Debugger mal kontrollieren.

günni0 20. Apr 2018 07:51

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Zitat:

Es könnte aber sein, daß aForm nicht NIL ist sondern einen undefinierten Zustand hat.
Das Formular wird bei Programmstart nicht erzeugt.

Zitat:

Das solltest du mit dem Debugger mal kontrollieren.
Starter :thumb:

SProske 20. Apr 2018 08:08

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Auch in der Starter gibt es den Debugger, nur die Hover-Anzeige funktioniert halt nicht - aber über die überwachten Ausdrücke kommst du ja trotzdem dran.

günni0 20. Apr 2018 08:13

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Ich habe es anders überprüft. Angezeigt wird mir nur die zweite Showmessage.

Delphi-Quellcode:
    if Assigned(frmInfo) then
     ShowMessage('Assigned');
    if frmInfo= nil then
     ShowMessage('Nil');

Neutral General 20. Apr 2018 08:14

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Assigned fragt ja auch ab ob etwas UNGLEICH nil ist.
Natürlich wird dann nur einer deiner 2 MessageBoxen angezeigt ;)
Delphi-Quellcode:
if Assigned(frmInfo) then // = if frmInfo <> nil then
  ShowMessage('Assigned');
if frmInfo= nil then
  ShowMessage('Nil');

günni0 20. Apr 2018 08:18

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Also bin ich kein bisschen weiter, weil mir der Debugger nichts anzeigt :P
Ich belasse es einfach bei der if Assigned() then-Abfrage die ich vor jede der vier, fünf Prozeduren schreibe.

Neutral General 20. Apr 2018 08:21

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Zitat:

Zitat von günni0 (Beitrag 1399937)
Also bin ich kein bisschen weiter, weil mir der Debugger nichts anzeigt :P
Ich belasse es einfach bei der if Assigned() then-Abfrage die ich vor jede der vier, fünf Prozeduren schreibe.

Mit der Einstellung wirst du nicht weit kommen :duck:
Du MUSST lernen wie man mit dem Debugger arbeitet. Ansonsten bist du früher oder später komplett aufgeschmissen.

günni0 20. Apr 2018 08:22

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Ich habe den Fehler gefunden. Sag ich euch aber nicht, weil es ein zu extremer "Wie kann man so dumm und blind sein"-Fehler ist :stupid:


Man sollte nicht auf Variablen eines Formulars zugreifen, wenn das Formular noch nicht erstellt wurde :roll:

freimatz 23. Apr 2018 14:19

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Man sollte die automatisch erstellten globalen Variablen eines Formulars gar nie verwenden:!:

bernau 23. Apr 2018 20:23

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Zitat:

Zitat von freimatz (Beitrag 1400249)
Man sollte die automatisch erstellten globalen Variablen eines Formulars gar nie verwenden:!:

Ich lösche die auch sofort. Diese Variablen sind "Bäh".

Wäre schön, wenn es eine Konfigurationsmöglichkeit geben würde, dass neue erstellt Formulare nicht automatisch erzeugt werden und diese globale Formularvariable erst gar nicht angelegt wird.

TigerLilly 23. Apr 2018 20:35

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
http://docwiki.embarcadero.com/RADSt...mular-Designer

Ganz unten.

bernau 24. Apr 2018 05:42

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Zitat:

Zitat von TigerLilly (Beitrag 1400285)

Cool. Seit wann gibt es das denn? Oder ar ich die letzen 23 Jahre blind.

(Aber diese blöde Formularvariable wird dennoch erstellt)

Uwe Raabe 24. Apr 2018 17:01

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von bernau (Beitrag 1400290)
Cool. Seit wann gibt es das denn? Oder ar ich die letzen 23 Jahre blind.

Also, Delphi 5 kannte das zumindest auch schon:

bernau 24. Apr 2018 20:56

AW: Assigned + TForm-Instanzenvariable in Funktionsübergabe möglich?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1400375)
Also, Delphi 5 kannte das zumindest auch schon:

Dann war ich tatsächlich bilnd :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:21 Uhr.

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