Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Warum kompiliert Delphi diesen Codeabschnitt nicht??? (https://www.delphipraxis.net/8773-warum-kompiliert-delphi-diesen-codeabschnitt-nicht.html)

ustra 11. Sep 2003 18:12


Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Hallo,

folgende Codedeklaration(steht alles in einer Unit):

Delphi-Quellcode:
  type TSicherung = class(TObject)

     public
        procedure kontrolle;
     end;

  type TsicherungCad = class(TSicherung)

     public
       procedure kontrolle;
  end;

....

  procedure TSicherungCad.kontrolle;
  begin
      exit;
  end;

  procedure TSicherung.kontrolle;
  begin
    exit;
  end;
Wenn ich das Projekt kompiliere, wird keine Fehlermeldung ausgegeben, aber es wird nicht der Inhalt der Prozedur von TsicherungCad.kontrolle compiliert. irgendwie ignoriert der Compilier den Code. Ich erkenne es folgendermaßen: Wenn ich in der Zeile, wo exit steht, einen Haltepunkt setzen will, ist in dem roten Kreis ein gelbes Kreuz. Wenn es vom Kompilier erkannt wurde als auszuführenden Code, dann ist in Delphi 5 (benutze ich) immer noch ein blauer Punkt neben der Zeile, was hier nicht der Fall ist. Nun meine Frage, wie schaffe ich es, dass Delphi diesen Codeabschnitt kompiliert? Ich stehe vor einem Rätsel und kann es mir nicht erklären.

Beste Grüße und danke im voraus für Eure Hilfe
Ulrich

Luckie 11. Sep 2003 18:17

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Eventuell solltest du mal Code reinschreiben, der auch was macht. :roll:

ustra 11. Sep 2003 18:22

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Hallo,

es steht schon Code drin. Ich habe nur exit; reingeschrieben, damit es nicht zu unübersichtlich wird. Im Original sieht es so aus:

Delphi-Quellcode:
procedure TsicherungCad.kontrolle;
  begin
      if FindWindow(nil, 'CAD-Hauptprogramm') = 0
      then begin
        Sicherung.haupt_aktiv(false);
        Sicherung.sichern(sPfadLokal);
        if boNetz
        then
         Sicherung.sichern(sPfadNetz);
      end
      //Ansonsten warten, bis Cadkontrolle geschlossen ist
      else begin
        Sicherung.haupt_aktiv(true);
        TWarten.enabled:=true;
        SendStringTohandle(FindWindow(nil, 'CAD-Hauptprogramm'), 'Schließen');
      end;
  end;
Beste Grüße
Ulrich

Luckie 11. Sep 2003 18:38

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Wird der Code auch aufgerufen im Programm?

MSCH 11. Sep 2003 18:42

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Interessant wird, wenn wir die Stelle zu sehen bekommen, wo TSicherungCad.Controlle aufgerufen wird. Du deklarierst 2 Klassen mit ein und derselben Procedure ohne zu zu überschreiben etc.
Wo ist da der Sinn ?

Code der nicht aufgerufen wird, ignoriert der Linker. Dann funktioniert auch kein Breakpoint.

grez
msch

roderich 11. Sep 2003 18:44

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Du leitest TSicherungCad von TSicherung ab, welches schon eine Methode Kontrolle hat, und deklarierst in TSicherungCad dann nochmal diese Methode Kontrolle.

Fehlt Dir da nicht ein inherited oder reintroduce oder irgendsowas (aus dem Kopf) ??!?

Roderich

Chewie 11. Sep 2003 18:50

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Außerdem: Da nur ein Exit in der Prozedur drinne steht, könnte ich mir vorstelllen, dass die Codeoptimierung von Delphi dies entfernt, da es ja unnötig ist.

Luckie 11. Sep 2003 18:56

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
@Chewie: Schon mal etwas weiter, als bis zum ersten Posting gelesen? :roll:

Chewie 11. Sep 2003 19:04

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Ja, hab ich, aber ich hab es so verstanden, dass er auch beim Testen nur Exit drinnehatte und das Exit nicht nur fürs Forum geschrieben hat.

ustra 11. Sep 2003 19:12

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Hallo,

vielleicht noch mal ein paar Sätze: Ich habe eine Klasse TSicherung mit verschiedenen Eigenschaften und Methoden (Bsp.: construktor, destruktor). Habe ich aber der Einfachheit hier nicht angegeben. Von dieser Klasse erzeuge ich weitere. TsicherungCad und TSicherungPHP sind weitere Klassen, die von TSicherung alle Methoden und Eigenaschften erben. Nun will ich bei den klassen TSicherungphp und TSicherungCad unterschiedlichen Code in der Prozedur kontrolle schreiben. Das will ich errreichen, in dem ich einfach die Prozedur bei den verschiedenen Klasen überschreibe. Ich habe in der Schule das auch mal so gemacht und da hat es funktioniert.

Beste Grüße und schönen Dank für die bisherige rege Beteiliung
Ulrich

PS: So sieht die Deklaration aus(diesmal nicht zensiert):

Delphi-Quellcode:
  type TSicherung = class(TObject)

     private
       LManuellDatum, LAutoDatumLetzte, LAutoDatumNaechste : TLabel;
       TAuto, TWarten : TTimer;
       App : TApplication;
       Sicherung : TKopieren;
       iInterval, iBereinigenInterval : integer;
       boNetz, boBereinigen : boolean;
       sPfadLokal, SPfadNetz, sTypart : string;
       procedure TAutoOnTimer(Sender : TObject);
       procedure SendStringToHandle(Wnd: Hwnd; const AText: string);
       procedure TWartenOnTimer (Sender : TObject);

     public
        constructor create (GStatus : TGauge; LDatei, LAutoLetzteDatum, LAutoNaechDatum, LManDatum : TLabel; Applicat : TApplication; Formular : TForm; Data : TDatabase; Query : TQuery; sTyp : string);
        destructor destroy;  
        procedure kontrolle;
        procedure sichern;
        procedure einstellungen_aktualisieren;
  end;

  type TsicherungCad = class(TSicherung)

     public
       procedure kontrolle;
  end;

 type TsicherungPHP = class(TSicherung)

     public
       procedure kontrolle;
  end;

Rumpi 11. Sep 2003 20:15

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Zitat:


folgende Codedeklaration(steht alles in einer Unit):

Delphi-Quellcode:
type
  TSicherung = class(TObject)
  public
    procedure kontrolle; virtual;
  end;

  TsicherungCad = class(TSicherung)
  public
    procedure kontrolle; override;
  end;

//****************************************************************

procedure TSicherung.kontrolle;
begin
  // Hauptcode
end;

//****************************************************************
procedure TSicherungCad.kontrolle;
begin
  // du kannst hier den Hauptcode rufen mit
  inherited Kontrolle;
   // !!!und oder!!! neuen Kontrolle-code schreiben
end;

mfg Rumpi

ustra 12. Sep 2003 14:29

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Hilfe,

Delphi kompliert es immer noch nicht, obwohl ich genau wie Rumpi es geschrieben hat inherited kontrolle; und dergleichen eingefügt habe. Er macht es nicht. Ich verstehe es nicht.

cu
Ulrich

Christian Seehase 12. Sep 2003 14:36

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Moin Ulrich,

hast Du schon mal versucht die vom Projekt erzeugten Dateien (DCU und EXE) zu löschen (Sicherung nicht vergessen!), und dann das Projekt neu erzeugen zu lassen?

ustra 12. Sep 2003 14:40

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Hallo,

auf die Idee bin ich auch ncoh gekommen und es hat nichts gebracht. Hast Du ncoh eine Idee?

Beste Grüße
Ulrich

Christian Seehase 12. Sep 2003 14:43

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Moin Ulrich,

nein, jetzt fällt mir so auch nichts mehr ein...
Kannst Du mal die Sourcen hier anhängen (ohne DCU/EXE)? Am besten wohl gezippt.
Ich könnte dann mal sehen was der Compiler bei mir macht. Ich hab' ja auch D5Pro.

ustra 12. Sep 2003 15:10

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Hi,

anbei das Projekt. Die Projektdatei und die dazugehörigen-Dateien müssen unter c:\buco_bwp\Server liegen, da es sonst zu Fehlern kommt.

Ich habe gerade Delphi neu installiert und gemerkt, das da irgendetwas nicht simmt. Ich erzeuge noch ein weiteres Objekt namens Sicherung. Wenn ich das in der Deklaration entfernt habe (auskommentiert), dann hat er trotzdem nicht gemekcert bei Aufrufen wie sicherung.free; Was nun überhaupt nicht sein darf.

Beste Grüße
Ulrich

ustra 12. Sep 2003 15:13

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Hi,

kurzer Nachtrag: Ihr müßt in der Unit Usicherung nachschauen. Alle anderen sind uninteressant.

Ulrich

sakura 12. Sep 2003 15:17

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Die Lösung ist einfach. Die Methode Kontrolle von TSicherungCad wurde "wegoptimiert". Du hast im gesamten Projekt nicht eine Instanz dieser Klasse erstellt, also hat Delphi es auch nicht für nötig erachtet diese ins Projekt mit einzubinden ;-)

HINWEIS aus
Delphi-Quellcode:
     public
        constructor create (GStatus : TGauge; LDatei, LAutoLetzteDatum, LAutoNaechDatum, LManDatum : TLabel; Applicat : TApplication; Formular : TForm; Data : TDatabase; Query : TQuery; sTyp : string);
        destructor destroy;  
        procedure kontrolle; virtual;
        procedure sichern;
        procedure einstellungen_aktualisieren;
unbedingt
Code:
     public
        constructor create (GStatus : TGauge; LDatei, LAutoLetzteDatum, LAutoNaechDatum, LManDatum : TLabel; Applicat : TApplication; Formular : TForm; Data : TDatabase; Query : TQuery; sTyp : string);
        destructor destroy; [color=#ff0000]override;[/color]
        procedure kontrolle; virtual;
        procedure sichern;
        procedure einstellungen_aktualisieren;
machen.

...:cat:...

Rumpi 12. Sep 2003 15:20

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Mein D7 nimmt's

nur das die *.res Datei erzeugt werden musste.


mfg Rumpi

ustra 12. Sep 2003 15:27

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Hi,

Mensch, so einfach und dennoch so schwierig. Beim ganzen rum experimentieren hatte ich beim erzeugen die Klasse in TSciherung umbenannt. Vorher stand da auch TsicherungCad. Aber danke für Deine und Eure Hilfe. ich wäre daran wohl nur mit sehr viel Mühe das geschafft. Recht herzlcihen Dank. Ihr seid ein Super Forum.

Beste Grüße
Ulrich

Rumpi 12. Sep 2003 15:31

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Hi,

kleine Tips

du hast zum einen immer
destructor Detroy; override; // vergessen

und zum anderen

constructor TXXX.Create;
begin
inherited Create;
....
end;

als auch


destructor TXXX.Destroy;
begin
...
inherited Destroy;
end;

... Memory leichen!
Nicht Destroy aufrufen sondern

FXXX.Free; // ruft dann automatisch Destroy !

oder

FreeAndNil(FXXX)


mfg Rumpi

sakura 12. Sep 2003 15:31

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Zitat:

Zitat von ustra
Ihr seid ein Super Forum.

Gerade hat jemand geschrieben, daß wir doof sind. Das ist ein gutes Balsam für meine Seele und der anderen Person will ich es mal verzeihen :angle:

Wenn die Frage ausreichen beantwortet ist, bitte noch entsprechend kennezeichnen (oben rechts). Danke.

...:cat:...

ustra 13. Sep 2003 14:32

Re: Warum kompiliert Delphi diesen Codeabschnitt nicht???
 
Hi Rumpi,

habe Deine Tipps noch eingepflegt. Werde mich damit noch mal etwas näher beschäftigen. Danke für die Tipps.

Beste Grüße
Ulrich


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 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