AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Deklaration oder nicht?

Ein Thema von Delbor · begonnen am 6. Jan 2023 · letzter Beitrag vom 10. Jan 2023
Antwort Antwort
Seite 1 von 3  1 23      
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#1

Deklaration oder nicht?

  Alt 6. Jan 2023, 12:28
Delphi-Version: 11 Alexandria
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:

procedure PrintBitmap(Printer: TPrinter; Bitmap: TBitmap); 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.
Aber dieses Beispielprogramm gibt es schon seit vielen Jahren, und es muss auch mit älteren Versionen lauffähig sein.
Hier das Embarcadero-Wikki und seine Aussagen zur Deklaration unter Delphi 11 Alexandria.

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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#2

AW: Deklaration oder nicht?

  Alt 6. Jan 2023, 12:51
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Deklaration oder nicht?

  Alt 6. Jan 2023, 13:15
Hi Sherlock

Zitat:
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.
Und woher bekam dann Delphi seinen Ruf der Typsicherheit? Ich verstehe unter Typsicherheit nicht nur den sicheren Umggang mit Variablen, sondern auch den mit Prozeduren und Funktionen..

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Deklaration oder nicht?

  Alt 6. Jan 2023, 13:23
Wenn du einen Prozedurtyp TExample = procedure(...) hast, kannst du einer Variable dieses Typs auch nur Prozeduren zuweisen, deren Signatur dazu passt.
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
560 Beiträge
 
Delphi 12 Athens
 
#5

AW: Deklaration oder nicht?

  Alt 6. Jan 2023, 21:25
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?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Deklaration oder nicht?

  Alt 6. Jan 2023, 21:35
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?
Das wäre mir viel zu unübersichtlich. Wenn etwas für andere Units direkt veröffentlicht werden soll, verwende ich Klassenmethoden, damit man beim Aufruf im Quelltext sieht, wo die Methode herkommt. Ich mag global verfügbare einfache Prozeduren nicht in eigenem Code. Deshalb stehen lose Prozeduren bei mir in aller Regel nur unter implermentation.
Sebastian Jänicke
AppCentral

Geändert von jaenicke ( 6. Jan 2023 um 21:50 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Deklaration oder nicht?

  Alt 6. Jan 2023, 23:17
Hi zusammen
Zitat:
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?
Zumindest ich gehöre zu dieser Fraktion. Inlinedeklarationen gewöhne ich mir nicht an, auch wenn dies eine ganz bestimmte Schreibweise im Code voraussetzt, die von diesem deutlich abweicht. Kurz zum Interfaceteil/Prozedurkopf wechseln und zurück ist auch dank Delphis IDE kein Problem.

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. Hier habe ich von einer Bitmap geschrieben, die ich mit einem Fremdprogramm einer PDF hinzugefügt habe (Bezahlt-Stempel). Dieser Stempel wird in meinem Programm nicht angezeigt, in einer Demo des Herstellers meiner PDF-Komponenten hingegen schon.
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:
procedure PrintBitmap(Printer: TPrinter; Bitmap: TBitmap);
var
  InfoHeaderSize, ImageSize: DWORD;
  InfoHeader: PBitmapInfo;
  Image: Pointer;
begin
   xxx
end;
Die drei x stehen für einige Zeilen Code, die hier nicht interessieren. Diese Prozedur wird aus verschiedenen Routinen aufgerufen.
Eine Suche in der aktuellen Datei über den Suchen-Dialog erzeugt folgende Rückmeldung:

Zitat:
F:\Embarcadero Project Corner\Delphi Alexandria Corner\Delphi Alex Winsoft Demos 5-2\Viewer\Main.pas [2]
F:\Embarcadero Project Corner\Delphi Alexandria Corner\Delphi Alex Winsoft Demos 5-2\Viewer\Main.pas [2]
F:\Embarcadero Project Corner\Delphi Alexandria Corner\Delphi Alex Winsoft Demos 5-2\Viewer\Main.pas(518): procedure PrintBitmap(Printer: TPrinter; Bitmap: TBitmap);
F:\Embarcadero Project Corner\Delphi Alexandria Corner\Delphi Alex Winsoft Demos 5-2\Viewer\Main.pas(607): PrintBitmap(Printer, Bitmap);
Ein Code-Ausschnitt rund um die in der Meldung genannte Zeile 607:
Delphi-Quellcode:
            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
Es gibt in dieser Unit auch keinen entsprechenden Prozedur-Typ.

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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor ( 6. Jan 2023 um 23:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Deklaration oder nicht?

  Alt 7. Jan 2023, 00:13
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 forward; markiert).




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 virtual; abstract; eine Methode forwarden.
$2B or not $2B
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Deklaration oder nicht?

  Alt 7. Jan 2023, 00:30
Hi himitsu

Zitat:
Über ein "Interface" kann man auch getrennt, sogar in einer anderen Unit, für eine Klasse alles quasi als abgetrenten "Forward" deklarieren,
Sogar in einer andern Unit? Oder DLL?

Muss morgen mal sehen - vielleicht ist mir gerade ein Licht aufgegangen...

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: Deklaration oder nicht?

  Alt 7. Jan 2023, 01:01
via COM/ActiveX auch in einer anderen EXE oder gar in einem anderen PC.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:54 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