AGB  ·  Datenschutz  ·  Impressum  







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

Undeklarierte Prozeduren aufrufen

Ein Thema von Doofy · begonnen am 25. Sep 2007 · letzter Beitrag vom 25. Sep 2007
Antwort Antwort
Doofy

Registriert seit: 25. Sep 2007
Ort: Elmshorn
2 Beiträge
 
#1

Undeklarierte Prozeduren aufrufen

  Alt 25. Sep 2007, 15:42
Hallo!

Habe die Aufgabe bekommen, die Sierpinski-Kurve beliebiger Ordnung rekursiv (auf ein Canvas) zu zeichnen. Dazu habe ich zwar Hilfen bekommen (durch die ich noch durchsteigen muss), möchte allerdings erst einmal die auf Wikipedia angegebene Methode auf Delphi übertragen. Das Problem, das sich mir jetzt stellt, ist das, dass Prozeduren aufgerufen werden, die erst später deklariert werden können, da diese 4 Prozeduren sich untereinander aufrufen.

Bisher habe ich Folgendes:
Delphi-Quellcode:
 private
    { Private-Deklarationen }
    procedure sierpA (level:integer);
    procedure sierpB (level:integer);
    procedure sierpC (level:integer);
    procedure sierpD (level:integer);[
[...]
procedure sierpA (level:integer);
begin
  if level > 0 then
  begin
    sierpA (level-1); forwdNW (dist);
    sierpB (level-1); forwdN (dist*2); // Zeile 60
    sierpD (level-1); forwdSO (dist);
    sierpA (level-1);
  end;
end;

procedure sierpB (level:integer);
[usw]
Die Frage ist nun also, ob man das irgendwie biegen kann, dass keine Fehlermeldungen mehr à la "[Fehler] Unit1.pas(60): Undefinierter Bezeichner: 'sierpB'" mehr bekomme und ich das Programm kompilieren kann.
Bei Java scheint das zu klappen, bei Delphi allerdings nicht.

Bin für Antworten aller Art dankbar.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

Re: Undeklarierte Prozeduren aufrufen

  Alt 25. Sep 2007, 15:46
Dadurch, dass Du die Methoden als private Klassenmethoden deklariert hast, musst Du sie im implementation-Teil auch als Klassenmethoden implementieren.

Delphi-Quellcode:
type TMyClass = class
  ...
  private
    procedure proc1;
    procedure proc2;
end;

implementation

procedure TMyClass.proc1;
begin
  ...
end;

procedure TMyClass.proc2;
begin
  ...
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#3

Re: Undeklarierte Prozeduren aufrufen

  Alt 25. Sep 2007, 15:47
Deine Implementierungen sind keine Mitglieder einer Klasse. Im Interfaceteil oben hast du sie aber als Mitglieder einer Klasse (wohl deiner TForm1) deklariert. Entweder oder ...
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#4

Re: Undeklarierte Prozeduren aufrufen

  Alt 25. Sep 2007, 15:48
Zitat von Doofy:
Die Frage ist nun also, ob man das irgendwie biegen kann, dass keine Fehlermeldungen mehr à la "[Fehler] Unit1.pas(60): Undefinierter Bezeichner: 'sierpB'" mehr bekomme und ich das Programm kompilieren kann.
Ja, kann man. Und zwar, in dem man Klassenmethoden auch als solche implementiert.

Delphi-Quellcode:
Type
   TForm1 = Class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
   private
      Procedure Klassenmethode();
   End;

   procedure Keine_Klassenmethode();

Var
   Form1: TForm1;

Implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Klassenmethode;
begin
   ShowMessage('Ich bin eine Klassenmethode');
end;

procedure Keine_Klassenmethode();
Begin
   Showmessage('Ich bin keine Klassenmethode');
End;

Edit: erst kein Roter Kasten und dann funzen auch noch die Delphi-Tags nimmer - was ist hier los?!?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Undeklarierte Prozeduren aufrufen

  Alt 25. Sep 2007, 15:54
Wenn du es mit Funktionen statt mit Methoden implementieren willst (wo sind die militanten OOPler? ), dann kannst du die forward-Deklaration verwenden:
Delphi-Quellcode:
procedure sierpA (level:integer); forward;

procedure sierpB (level:integer);
begin
//...
end;

procedure sierpA (level:integer);
begin
//...
end;
@s-off: Das sind keine Klassenmethoden, sondern normale Methoden!
[edit] Wir geraten heute irgendwie oft wegen Nichtigkeiten aneinander. Sollte nur ein Klarstellung sein. [/edit]
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#6

Re: Undeklarierte Prozeduren aufrufen

  Alt 25. Sep 2007, 15:57
Zitat von Apollonius:
@s-off: DAS SIND KEINE KLASSENMETHODEN, SONDERN NORMALE METHODEN!
Schrei doch nicht gleich so.
Entschuldige bitte, dass ich hier mit meiner Begriffswahl etwas falsch lag.
Ich bin halt davon ausgegangen, dass jemandem der Bezug so klarer ist; wusste ja nicht, dass Du dabei gleich Herzklabastern bekommst...

Dennoch korrekt, dass Du das hier klargestellt hast; aber der Ton spielt die Musik.
  Mit Zitat antworten Zitat
Doofy

Registriert seit: 25. Sep 2007
Ort: Elmshorn
2 Beiträge
 
#7

Re: Undeklarierte Prozeduren aufrufen

  Alt 25. Sep 2007, 16:02
Das ging ja schneller als ich dachte. Nun meckert der Compiler auch nicht mehr, scheint also zu klappen.
Danke euch allen!
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:18 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