Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Vertändnisfrage zu 'Meldungen' (https://www.delphipraxis.net/196644-vertaendnisfrage-zu-meldungen.html)

Delbor 6. Jun 2018 09:24

Vertändnisfrage zu 'Meldungen'
 
Hi zusammen

Ich habe hier ein offensichtlich etwas älteres Programm (NikomsoftOCR), das zwar zu laufen scheint - soweit ich vorerst mitbekommen habe: Scannen läuft einwandfrei, nur beim anschliessenden OCR wird am Ende eine Fehlermeldung erzeugt - aber nach dem Kompilieren 3 Meldungen nach folgendem Muster hinterlässt:
Zitat:

[dcc32 Hinweis] fmMainU.pas(383): H2443 Inline-Funktion 'MessageDlg' wurde nicht expandiert, weil Unit 'System.UITypes' in der USES-Liste nicht angegeben ist
Von F1 ist offensichtlich keine Hilfe zu erwarten (Keine Hilfe für dcc32 gefunden.)
Wissen wollte ich von ihr eigentlich, was 'nicht expandiert' bedeutet.

Gruss
Delbor

Der schöne Günther 6. Jun 2018 09:25

AW: Vertändnisfrage zu 'Meldungen'
 
Suche doch mal mit der Internet-Suchmaschine deines Vertrauens nach "H2443" ;-)

Delbor 6. Jun 2018 09:55

AW: Vertändnisfrage zu 'Meldungen'
 
Hi Günther

Danke für den ¨Tip! Da war ich ja gar nicht soweit weg.
Zitat:

Anmerkung: Sie können diese Hinweise deaktivieren, indem Sie das Inlining in Projekt > Optionen > Compilieren ausschalten.
Ob dies einfach so eine gute Idee ist, wage ich allerdings zu bezweifeln. Zumindest sollte man dies nicht generell tun, denke ich.

Gruss
Delbor

Der schöne Günther 6. Jun 2018 09:59

AW: Vertändnisfrage zu 'Meldungen'
 
Die Meldung sagt dir doch schon was du tun kannst:
  • Du hast eine Routine machWas() in Unit "B" und rufst diese aus Unit "A" auf
  • Die Implementierung deiner Routine machWas() benutzt in Kram aus einer Unit "C"
  • Du musst nun in deiner Unit "A" ebendiese Unit "C" in deine "uses"-Anweisung aufnehmen

So bekommt man den Tag auch rum.

Delbor 6. Jun 2018 10:07

AW: Vertändnisfrage zu 'Meldungen'
 
Hi Günther

Ja, klar. Das ist der einfachste Weg, die Meldung wegzukriegen. Ich wollte sie aber nicht einfach weghaben, sondern auch wissen, was sie bedeutet.
Denn ganz so harmlos, wie die Anmerkung vermuten lassen kann, ist die wohl nicht.

Gruss
Delbor

Sailor 6. Jun 2018 10:20

AW: Vertändnisfrage zu 'Meldungen'
 
IIRC bewirkt INLINE, daß die Routine nicht wie üblich aufgerufen wird,sondern der entsprechende Maschinencode während der Generierung direkt im Programm angeordnet wird. Sollte also höchstens Auswirkungen auf die Ausführungsgeschwindigkeit haben.

Uwe Raabe 6. Jun 2018 10:28

AW: Vertändnisfrage zu 'Meldungen'
 
Zitat:

Zitat von Delbor (Beitrag 1404018)
Ich wollte sie aber nicht einfach weghaben, sondern auch wissen, was sie bedeutet.

Etwas ausführlicher: MessageDlg ist in Vcl.Dialogs als inline deklariert. In diesem Fall erzeugt der Compiler keinen Funktionsaufruf, sondern fügt den Code der Funktion direkt ein. Damit das gelingt, muss dieser Code natürlich auch an dieser Stelle compilierbar sein.

Nun sind einige der Typdeklarationen in Vcl.Dialogs einfach nur Aliase zu Typen aus System.UITypes:
Delphi-Quellcode:
type

  TMsgDlgType = System.UITypes.TMsgDlgType;
  {$NODEFINE TMsgDlgType}

  TMsgDlgBtn = System.UITypes.TMsgDlgBtn;
  {$NODEFINE TMsgDlgBtn}
  TMsgDlgButtons = System.UITypes.TMsgDlgButtons;
  {$NODEFINE TMsgDlgButtons}
Aus nicht näher ersichtlichen Gründen braucht der Compiler im Falle einer Inline-Auflösung Zugriff auf die originalen Deklarationen. Deswegen muss in deiner Unit die System.UITypes aufgeführt sein.

Machst du das nicht, wird das inline nicht aufgelöst und ein regulärer Call erzeugt.

himitsu 6. Jun 2018 10:36

AW: Vertändnisfrage zu 'Meldungen'
 
So in etwa.
Man kann es sich fast wie die Makros aus anderen Programmiersprachen vorstellen.
Der "Inhalt" dieser Funktion/Prozedur wird an der "Aufrufstelle" eingefügt, an statt einem CALL/Aufruf zu dieser Funktion.
> Es entfällt also ein Sprung, was bei "kurzen" Funktionen den Programmablauf verbessern kann.
(dass dieses "Einfügen" vom Compiler oft/meistens nicht wirklich optimal vorgenommen wird und bei Assembler-Funktionen praktisch garnicht gut geschehen kann, das ist eine andere Angelegenheit)

Und hier sagt der Compiler einfach nur
Zitat:

ich habe an der Stelle keinen Zugriff auf alles, was diese Funktion benötigt und ignoriere daher das INLINE.


PS: Was sich garnicht auflösen lässt, wäre z.B. ein Zugriff auf eine Funktion, globale Variable oder einen Typ, welcher in der Implementation der anderen Unit deklariert wurde.
> Hier geht nur INLINE weglassen oder diesen Teil ins Interface verschieben.

Fritzew 6. Jun 2018 11:18

AW: Vertändnisfrage zu 'Meldungen'
 
Warum aber eine Routine wie MessageDlg inline deklariert wurde erschließt sich mir nicht wirklich.
Inline macht eigentlich nur Sinn wenn die Abarbeitung sich dann "messbar" auf die Ausführungsgeschwindigkeit auswirkt.
Ich bezweifle das für eine Dialogbox.........

Delbor 6. Jun 2018 11:34

AW: Vertändnisfrage zu 'Meldungen'
 
Hi zusammen

Vielen Dank für eure aufschlussreichen Antworten!

@Fritzew
Zitat:

Ich bezweifle das für eine Dialogbox.........
Andrerseits - wenn ich sehe, wielange andere Fenster (nicht unbedingt Delphi) brauchen, um sich aufzubauen... Ob das damit zusammenhängt, weiss ich nicht wirklich, aber ich ahlte es nicht für ausgeschlossen, dass sich das beim Threadmanagment von Windows bemerkbar macht.

Gruss
Delbor


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:09 Uhr.
Seite 1 von 2  1 2      

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