![]() |
Delphi-Version: 11 Alexandria
Deklaration oder nicht?
Hi zusammen
Ich arbeite zwar unter Delphi Alexandria, aber zur Zeit unter einem Beispielprogramm, das höchstens mit Delphi 10 kompiliert wurde. Mein Stolperstein ist folgendes:
Delphi-Quellcode:
Dies ist nicht etwa die Deklaration im Interface, sondern der Prozedurkopf im implementation-Teil. Nach den neuen Deklarationsregeln (Deklaration von Variablen bei Erstgebrauch) könnte ich mir vorstellen, dass ähnliches auch für Prozeduren gilt.
procedure PrintBitmap(Printer: TPrinter; Bitmap: TBitmap);
Aber dieses Beispielprogramm gibt es schon seit vielen Jahren, und es muss auch mit älteren Versionen lauffähig sein. ![]() Meines Wissens war es unter Pascal seit Jahrzehnten möglich, Prozeduren zu verwenden, die nicht innerhalb einer (Form-)Klasse deklariert sind, sondern zB. kurz vor oder nach der Formvariablen (beliebig im interface-Teil?). Aber dass eine Prozedur gar nicht deklariert ist, kann ich mir schlicht nicht vorstellen. Was hab ich übersehen? Wie lange gibt es mittlerweile die neuen Deklarationsregeln? Gruss Delbor |
AW: Deklaration oder nicht?
Kurz: Das war schon immer so. Im Prinzip mußt Du im Interface nur deklarieren, was auch außen (also außerhalb der Unit) sichtbar/verwendbar sein soll.
Sherlock |
AW: Deklaration oder nicht?
Hi Sherlock
Zitat:
Gruss Delbor |
AW: Deklaration oder nicht?
Wenn du einen Prozedurtyp
Delphi-Quellcode:
hast, kannst du einer Variable dieses Typs auch nur Prozeduren zuweisen, deren Signatur dazu passt.
TExample = procedure(...)
Das ist kurz gesagt Typsicherheit: Du kannst verschiedene Typen nicht einfach so untereinander zuweisen. Ob die Prozedur im Interface der Unit nach außen veröffentlicht wurde oder ob die Variable im Prozedurkopf oder inline im Code deklariert wurde, spielt dabei keine Rolle. |
AW: Deklaration oder nicht?
Gehe ich recht in der Annahme, dass ihr alle trotzdem jede Prozedur auch im Interface deklariert, auch wenn sie nur in der Unit verwendet wird?
|
AW: Deklaration oder nicht?
Zitat:
|
AW: Deklaration oder nicht?
Hi zusammen
Zitat:
Ich hab das erst so verstanden, dass ich dich gründlich missverstanden habe, bzw. dass ich mit meiner ungenügenden Beschreibung zu einem Missverständnis verleitet habe. Missverständnis hin oder her ich zeig das mal am besten am konkreten Beispiel. ![]() Da ich verständlicherweise wissen will, woran das liegt, habe ich damit begonnen, den Code zu klonen (damit ich nichts überlese). Und in eben dieser Demo ist die gezeigte Prozedure ohne wirkliche Deklaration enthalten:
Delphi-Quellcode:
Die drei x stehen für einige Zeilen Code, die hier nicht interessieren. Diese Prozedur wird aus verschiedenen Routinen aufgerufen.
procedure PrintBitmap(Printer: TPrinter; Bitmap: TBitmap);
var InfoHeaderSize, ImageSize: DWORD; InfoHeader: PBitmapInfo; Image: Pointer; begin xxx end; Eine Suche in der aktuellen Datei über den Suchen-Dialog erzeugt folgende Rückmeldung: Zitat:
Delphi-Quellcode:
Es gibt in dieser Unit auch keinen entsprechenden Prozedur-Typ.
if Pdf.FormFill then
begin Bitmap := Pdf.RenderPage(0, 0, Printer.PageWidth, Printer.PageHeight, ro0, [rePrinting]); try PrintBitmap(Printer, Bitmap); // <= Zeile 607: finally Bitmap.Free; end; end Interessant ist, dass die CloneForm, mit deren Hilfe ich ermitteln will, wieso dieses Demoprogramm meine Pdfs mt dem Stempel anzeigt, mein eigenes Programm aber nicht, die Prozedur PrintBitmap und deren Aufruf(e) enthält, aber schon ohne Kompilierung als unbekannt kennzeichnet. Das bedeutet, dass eine Deklaration im Original vorhanden ist, aber weder von Delphi geschweige denn von mir gefunden wird... Als Info vielleicht noch wichtig: Das Programm verwendet die DLL PDFium... Gruss Delbor |
AW: Deklaration oder nicht?
Und was ist nun mit der Zeile 518?
Was ist da drumrum? Es gibt "Methoden" in Klassen (und auch in Records). Dort ist in der Typdeklaration immer eine "Forward"-Deklaration vorhanden (egal ob im Interface oder der Implementation) und dann in der Implementation die eigentlich Deklaration der Methode. Einzelne Prozeduren/Funktionen (nicht in einer Klasse) stehen ebenfalls immer in der Implementation und man kann optional auch vorher eine Forward-Deklaradion angeben. Entweder im Interface, oder auch in der Implementation (hier aber mit
Delphi-Quellcode:
markiert).
forward;
Auch Klassen und und Zeigertypen kann man als Forward, vor dem eigentlichen Typen deklarieren, so lange es innerhalb des selben TYPE-Blocks steht. Über ein "Interface" kann man auch getrennt, sogar in einer anderen Unit, für eine Klasse alles quasi als abgetrenten "Forward" deklarieren, ebenso wie über eine Vererbung als
Delphi-Quellcode:
eine Methode forwarden.
virtual; abstract;
|
AW: Deklaration oder nicht?
Hi himitsu
Zitat:
Muss morgen mal sehen - vielleicht ist mir gerade ein Licht aufgegangen... Gruss Delbor |
AW: Deklaration oder nicht?
via COM/ActiveX auch in einer anderen EXE oder gar in einem anderen PC.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:03 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-2025 by Thomas Breitkreuz