Autor Beitrag
Bienenelf
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Sa 17.03.12 03:41 
Guten Abend Programmierer,

ich bin ein Programmier Neuling ( Verstehe nur die Grundlagen) und habe deswegen eine Frage.
Ich habe mir zu dem Thema auch ein Buch gekauft und einige pdfs mir durchgelesen, aber werde aus den Dingern auch nicht schlauer für meine Problematik.

Ich habe eine Basisklasse

ausblenden Delphi-Quelltext
1:
Type TFileSemAuto = class(TObject)					

und eine abgeleitete Klasse
ausblenden Delphi-Quelltext
1:
type TDigitImageProcess = class(TFileSemAuto)					

Nun habe ich in meine TFileSemAuto eine Methode um Fehler zu überprüfen, wie Bsp.: ob die Datei existiert etc. In dieser Function soll dann ein MessageBox aus einer Case Anweisung aufgerufen werden.
ausblenden Delphi-Quelltext
1:
function DefectReportCheck( const Value:ShortInt):Integer; virtual;					

Es können aber auch in meiner TDigitImageProcess Klasse Fehler entstehen.
Aus diesem Grund habe ich die Funktion virtual erstellt und sie dann nochmals in meiner TDigitImageProcess aufgerufen function DefectReportCheck( const Value:ShortInt):Integer; override;

In der Basisklasse habe ich einen ganz einfachen Code geschrieben (Case, if then else). Den identischen Code habe benötige ich auch in meiner abgeleiteten Klasse, plus das inherited damit er auch nach den anderen Fehlern überprüft.
und so sieht der Code aus in der abgeleiteten Klasse:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
var Temp:Boolean;
begin
begin
  Case Value of
  4:  begin
        Case Application.MessageBox(PChar(Failur4+#13+Information2),
             PChar(Failur4),17of
          IDOK: result:=1;
          IDCANCEL: result:=0;
        end;
      end;
  5:  begin
        Case Application.MessageBox(PChar(Failur5+#13+Information2),
             PChar(Failur5),17of
          IDOK: result:=1;
          IDCANCEL: result:=0;
        end;
      end;
  else
    inherited DefectReportCheck(Value);
  end;
end;

Identisch sieht auch der Code in der Basisklasse aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
begin
  Case Value of
  1:  begin
        Case Application.MessageBox(PChar(Failur1+#13+Information1),
             PChar(Failur1), 17of
          IDOK: FErrorHandel:=1;
          IDCANCEL: FErrorHandel:=0;
        end;
      end;
  2:  begin
        Case Application.MessageBox(PChar(Failur2+#13+Information1),
             PChar(Failur2), 17of
          IDOK: FErrorHandel:=1;
          IDCANCEL: FErrorHandel:=0;
        end;
      end;
  3:  begin
        Case Application.MessageBox(PChar(Failur3+#13+Information1),
             PChar(Failur3), 17of
          IDOK: FErrorHandel:=1;
          IDCANCEL: FErrorHandel:=0;
        end;
      end;
  end;
end;


Das sind die Codes, jetzt mein Problem:

Nun will ich den Code aus meiner Basisklasse aufrufen und mir den Wert Rückgeben lassen,
aber dieser wird ja durch die abgeleitete Klasse wieder überschrieben. Weil er am Ende der Bearbeitung nochmals in die abgeleitete Klasse anfängt und mir dann kein Wert übergibt.
Kann mir jemand da Helfen?

gruß Bienenelf

Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Sa 17.03.12 07:48 
Hey,

also sofern ich dich richtig verstanden habe:
ausblenden Delphi-Quelltext
1:
result := inherited DefectReportCheck(Value);					

ansonsten:
lass das virtual weg und caste auf die Basisklasse:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var 
  test: TDigitImageProcess;
  returnCode: Integer;


test := TDigitImageProcess.Create;
try
  returnCode := (test as TFileSemAuto).DefectReportCheck(0); //zugriff auf die Methode der Basisklasse
finally
  test.Free;
end;


MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Sa 17.03.12 11:33 
Hallo,

Versuche mal das. Definition einer lokalen Variablen in der abgeleiteten Klasse (s.o.) und dann Übergabe des Ergebnisses des Inherited Aufrufs an diese lokale Variable. Dann brauchst Du m.E. gar nichts an den Definitionen zu ändern. Und gleich auch noch vielleicht das Ganze aus dem Else-Zweig herausnehmen, damit die inherited-Methode überhaupt aufgerufen wird, falls nicht schon in der abgeleiteten Methode ein Case-Fall zutrifft.

Viel Erfolg

Gunther

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
type TDigitImageProcess = class(TFileSemAuto)

  ErgBasisDefectReport : integer;


function DefectReportCheck( const Value:ShortInt):Integer; virtual;
 
  
:
:

function TDigitImageProcess.DefectReportCheck( const Value:ShortInt):Integer; virtual;

var Temp:Boolean;
begin
  Case Value of
  4:  begin
        Case Application.MessageBox(PChar(Failur4+#13+Information2),
             PChar(Failur4),17of
          IDOK: result:=1;
          IDCANCEL: result:=0;
        end;
      end;
  5:  begin
        Case Application.MessageBox(PChar(Failur5+#13+Information2),
             PChar(Failur5),17of
          IDOK: result:=1;
          IDCANCEL: result:=0;
        end;
      end;
  end;
  ErgBasisDefectReport := inherited DefectReportCheck(Value);
end;

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.

Für diesen Beitrag haben gedankt: Bienenelf
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: So 18.03.12 14:23 
Hey,

so hat die Funktion aber unter Umständen einen undefinierten Rückgabewert. Wenn ich eine Funktion definiere, dann will ich da auch was zurück bekommen, also warum es so umständlich machen un den Wert erst in einer Varible zwischenspeichern, wenn ich es auch gleich als Ergebnis zurück geben kann?!

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
Bienenelf Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 23.03.12 19:45 
Danke hatte geklappt, habe das alles noch was umgeschrieben damit ich kein undefinierten Zustand habe.
Ich wusste nicht, dass man das mit inherited machen kann: result:= inherited(xyz)

nun bin ich ein schritt schlauer und bedanke mich bei euch... :)

gruß
Bienenelf...