Entwickler-Ecke
Sonstiges (Delphi) - OOP-Problem
Liam - So 23.05.10 20:57
Titel: OOP-Problem
Hallo Leute,
Ich hab da ein kleines Problem. Ich soll in einem Programm verschiedene Autos zur Auswahl bieten (versch. Antriebsarten) und die dann auch ausgeben mit bestimmten werten. Leider bekomm ich jetzt die Meldung "Inkompatible Typen Integer und String" sowie "Nicht genügend wirkliche Parameter" Kann mir da einer von euch helfen?
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: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, unit2, unit3;
type TForm1 = class(TForm) RadioGroup1: TRadioGroup; Memo1: TMemo; Ed_L_H: TEdit; Ed_Rw: TEdit; Ed_L_E: TEdit; Anlegen: TButton; procedure AnlegenClick(Sender: TObject); private public end;
var Form1: TForm1; Auto: TFahrzeug; M_Leistung: string; M_Bezeichnung: string;
implementation
{$R *.dfm}
procedure TForm1.AnlegenClick(Sender: TObject); begin case Radiogroup1.itemindex of 0: begin Bezeichnung := 'Verbrennungsmotor'; Auto:=TFahrzeug.create(Radiogroup1.Items.GetText, Ed_L_H.Text); Memo1.lines.Add := Auto.getDaten; end; 1 : begin M_Bezeichnung:= 'Elektromotor'; end; 2 : begin M_Bezeichnung:= 'Hybridantrieb'; end; 3 : begin M_Bezeichnung:= 'Wasserstoffantrieb'; end;
end;
end;
end. |
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: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| unit Unit2; interface uses sysutils; Type TFahrzeug = class (TObject) private public constructor create (M_Bezeichnung: string; M_Leistung: string); function getDaten: string; virtual; end; var Bezeichnung: string; Leistung: string; M_Leistung, M_Bezeichnung: string;
implementation
constructor TFahrzeug.create (M_Bezeichnung: string; M_Leistung: string); begin Bezeichnung := M_Bezeichnung ; Leistung :=M_Leistung ; end;
function TFahrzeug.getDaten: string; begin result:= Bezeichnung + Leistung; end;
end. |
MfG
Liam
Delete - So 23.05.10 21:16
Die Fehlermeldungen sind doch an Deutlichkeit kaum noch zu überbieten. Einmal passen die Datentypen nicht zusammen. Du versuchst einer Integer Variablen eonen String zu zuweisen (oder umgekehrt). Und das andere mal rufst du eine Routine auf und übergibst nicht die richtige Zahl an Parametern. Die Fehler sollten sich alle selber finden und beheben lassen.
Gausi - So 23.05.10 21:42
Hallo und :welcome: in der Entwickler-Ecke,
Du versuchst damit Memo1.lines.Add := Auto.getDaten; einen String in das memofeld einzufügen. Das geht aber nicht so.
Der String, den du einfügen willst, muss als Parameter der Methode Add übergeben werden, z.B. Memo1.lines.add('neue Zeile');
Black200607 - So 23.05.10 22:30
Hallo und guten Abend, :wink2:
In deiner Unit2 vereinbarst du die Variablen M_Bezeichnung und M_Leistung global und Bezeichnung und Leistung ebenso. M_Bezeichner und M_Leistung sind nur Parameter, müssen also nur bei create in die Parameter in den Klammern geschrieben werden(wie du es getan hast). Desweiteren wäre es wahrscheinlich besser die Bezeichnung und Leistung als Objektvariablen zu deklarieren, damit sie zum Objekt gehören, nicht zur Unit.
entschuldigt bitte wenn ich mich irre :oops:
Liam - Mo 24.05.10 00:19
Heyho,
Mittlerweile läuft alles wie gewünscht. Allerdings gibts noch das Problem der Memoausgabe. In einem Editfenster ist das ja kein Problem.
Ach ja, und bei der Hybridunit (Unit3) sollen die Leistung und die Zusatzleistung eigentlich noch zusammengerechent werden. Da haperts auch noch ein bisschen, da ich das ja vorher vererbe. Und eigentlich soll die Klasse auch noch mit ausgegeben werden. Da hab ich aber absolut keine Idee, wie das ich das anstellen könnte.
Hier mal die 4 Units
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: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, unit2, unit3, unit4;
type TForm1 = class(TForm) RadioGroup1: TRadioGroup; Memo1: TMemo; Ed_L_H: TEdit; Ed_Rw: TEdit; Ed_L_E: TEdit; Anlegen: TButton; Edit1: TEdit; procedure AnlegenClick(Sender: TObject); private public end;
var Form1: TForm1; Auto: TFahrzeug; Hybrid: THybridfahrzeug; Alternativ: TAlternativfahrzeug;
implementation
{$R *.dfm}
procedure TForm1.AnlegenClick(Sender: TObject); begin case Radiogroup1.itemindex of 0: begin Auto:=TFahrzeug.create(Radiogroup1.Items[0], Ed_L_H.Text); Edit1.Text := Auto.getDaten; end; 1 : begin Alternativ:=TAlternativfahrzeug.create(Radiogroup1.Items[1], Ed_L_H.Text, Ed_Rw.text); Edit1.text:=Alternativ.getDaten; end; 2 : begin Hybrid:=THybridfahrzeug.create(Radiogroup1.Items[2], Ed_L_H.Text, Ed_L_E.text); Edit1.text := Hybrid.getDaten; end; 3 : begin Alternativ:=TAlternativfahrzeug.create(Radiogroup1.Items[3], Ed_L_H.Text, Ed_Rw.text); Edit1.text:=Alternativ.getDaten; end;
end;
end;
end. |
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:
| unit Unit2; interface uses sysutils; Type TFahrzeug = class (TObject) private public constructor create (M_Bezeichnung: string; M_Leistung: string); function getDaten: string; virtual;
end; var Bezeichnung: string; Leistung: string; M_Leistung, M_Bezeichnung: string;
implementation
constructor TFahrzeug.create (M_Bezeichnung: string; M_Leistung: string); begin Bezeichnung := M_Bezeichnung ; Leistung :=M_Leistung ; end;
function TFahrzeug.getDaten: string; begin result:= Bezeichnung +' '+ Leistung + 'kW'; end;
end. |
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: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| unit Unit3; interface uses sysutils, unit2; Type THybridfahrzeug = class (TFahrzeug) private public constructor create (M_Bezeichnung: string; M_Leistung, E_M_Leistung: string); function getDaten: string; override; Function getEndleistung: string; end; var Bezeichnung: string; Leistung, Zusatzleistung, Endleistung:string; M_Leistung, E_M_Leistung: string;
implementation
constructor THybridfahrzeug.create (M_Bezeichnung: string; M_Leistung,E_M_Leistung: string); begin inherited create (M_Bezeichnung, M_Leistung); Zusatzleistung := E_M_Leistung; end;
Function THybridfahrzeug.getEndleistung: string; var Basisleistung, Mehrleistung, Gesamtleistung: integer; begin
Basisleistung := strtoint(M_Leistung); Mehrleistung := strtoint (E_M_Leistung); Gesamtleistung := Basisleistung + Mehrleistung; Endleistung := inttostr (Gesamtleistung); end;
function THybridfahrzeug.getDaten: string; begin result:= inherited getDaten + ' '+ 'Zusatzleistung:'+' '+Zusatzleistung+'kW'; end;
end. |
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:
| unit Unit4; interface uses sysutils, unit2; Type TAlternativfahrzeug = class (TFahrzeug) private public constructor create (M_Bezeichnung: string; M_Leistung, E_M_Reichweite: string); function getDaten: string; override; end; var Bezeichnung: string; Leistung, Zusatzleistung, Endleistung:string; M_Leistung, Reichweite, E_M_Reichweite: string;
implementation
constructor TAlternativfahrzeug.create (M_Bezeichnung: string; M_Leistung,E_M_Reichweite: string); begin inherited create (M_Bezeichnung, M_Leistung); Reichweite := E_M_Reichweite; end;
function TAlternativfahrzeug.getDaten: string; begin result:= inherited getDaten + ' '+ Reichweite +'km'; end;
end. |
MfG
Liam
jaenicke - Mo 24.05.10 00:31
Liam hat folgendes geschrieben : |
| Allerdings gibts noch das Problem der Memoausgabe. In einem Editfenster ist das ja kein Problem. |
Die letzten beiden Beiträge hast du wohl nicht gelesen, oder?
Gausi hat dir direkt den Quelltext gezeigt wie du die Methode Add beim Memo richtig benutzt.
Und
Black200607 hat dich darauf hingewiesen, dass du bei den globalen Variablen erstens zwei zu viel hast und zweitens diese lieber als Felder in deine Klasse gehören.
Unit2.pas
5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| { ... } type TFahrzeug = class(TObject) private FBezeichnung, FLeistung: string; public constructor Create(M_Bezeichnung, M_Leistung: string); function getDaten: string; virtual; end;
implementation
constructor TFahrzeug.Create (M_Bezeichnung, M_Leistung: string); begin FBezeichnung := M_Bezeichnung; FLeistung := M_Leistung; end;
function TFahrzeug.getDaten: string; begin Result := FBezeichnung + ' ' + FLeistung + 'kW'; end;
end. |
Liam - Mo 24.05.10 00:48
Okey, sorry. Hab die Variabeln jetzt mal gelöscht/private gesetzt.
Und zu der Ausgabe ins Memo muss ich mir da auch noch was einfallen lassen, wie ich die eingabedaten da ausgebe. Vorher festlegen geht ja schlecht.
jaenicke - Mo 24.05.10 00:54
Liam hat folgendes geschrieben : |
| Und zu der Ausgabe ins Memo muss ich mir da auch noch was einfallen lassen, wie ich die eingabedaten da ausgebe. Vorher festlegen geht ja schlecht. |
Naja, eben mit in die Ausgabe reinschreiben aus den Edits, wenn du das meinst. Wo ist das Problem da gerade? :gruebel:
Nebenbei ist dein Ansatz nicht gerade OOP-mäßig sinnvoll, da du mehrfach Code schreibst. Was du eigentlich u.a. mit OOP verhindern willst. Abgesehen davon nutzt du auch da total unsinnig globale Variablen...
Zudem gibst du deine Fahrzeuge nicht wieder frei.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.AnlegenClick(Sender: TObject); var MyCar: TFahrzeug; begin case RadioGroup1.ItemIndex of 0: MyCar := TFahrzeug.Create(RadioGroup1.Items[0], Ed_L_H.Text); 1: MyCar := TAlternativfahrzeug.Create(Radiogroup1.Items[1], Ed_L_H.Text, Ed_Rw.Text); 2: MyCar := THybridfahrzeug.Create(Radiogroup1.Items[2], Ed_L_H.Text, Ed_L_E.Text); 3: MyCar := TAlternativfahrzeug.Create(Radiogroup1.Items[3], Ed_L_H.Text, Ed_Rw.Text); end; try Edit1.Text := MyCar.GetDaten; finally MyCar.Free; end; end; |
Liam - Mo 24.05.10 14:39
Cool, vielen Dank. Nun läuft es fast so, wie es soll.
Jetzt ist noch die Frage, wie ich den Klassennamen mit ausgebe. Und die eine Zusammenrechnung funktioniert auch noch nicht.
Hier ist mal die Rechnung
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Function THybridfahrzeug.getEndleistung: string; var Basisleistung, Mehrleistung, Gesamtleistung: integer; begin
Basisleistung := strtoint(M_Leistung); Mehrleistung := strtoint (E_M_Leistung); Gesamtleistung := Basisleistung + Mehrleistung; Endleistung := inttostr (Gesamtleistung); end; |
jaenicke - Mo 24.05.10 15:31
Liam hat folgendes geschrieben : |
| Jetzt ist noch die Frage, wie ich den Klassennamen mit ausgebe. |
Meinst du vielleicht MyCar.ClassName?
Liam hat folgendes geschrieben : |
| Und die eine Zusammenrechnung funktioniert auch noch nicht. |
Äußerst präzise Fehlerbeschreibung... :roll:
Ich vermute einmal du meinst, dass da kein Ergebnis ankommt. Könnte daran liegen, dass du Result gar keinen Wert zuweist...
Liam - Mo 24.05.10 16:43
Okey, danke für den Klassennamen.
Was das zusamenrechnen betrift mein ich 2 Eingegebene zahlen sollen zu einer zusammengesetzt werden.
Die Variable "Endleistung" steht dann in der GetDaten-Funktion. Das Problem aber ist, dass die Grunddaten schon mit vererbt werden, was ja in der Unit2 festgelegt ist. Wie kann ich Delphi da sagen, dass in die Unit3 die Leistung nicht mit vererbt wird?
jaenicke - Mo 24.05.10 16:54
Dein Problem liegt darin, dass du es falsch angehst. Anstatt TFahrzeug zu ergänzen und die Daten aus TFahrzeug weiterzuverwenden versuchst du in den abgeleiteten Klassen deine Daten neu einzubauen. Wozu? Du hast die Leistung und die Bezeichnung doch schon, in der Basisklasse. Die brauchst du doch nicht neu zu deklarieren in den abgeleiteten Klassen.
Du hast dann noch einmal zusätzlich zwei weitere Leistungsdaten. Es reicht dann aber die zu ergänzen.
Liam - Mo 24.05.10 17:14
Stimmt eigentlich. Zusammenrechnen der beiden Leistungsdaten kann ja jeder selber machen ^^
Vielen vielen dank für eure Hilfe, ohne die ich warscheinlich verreckt wäre :)
Liam
jaenicke - Mo 24.05.10 17:33
So meinte ich das gar nicht...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| type TFahrzeug = class(TObject) private FBezeichnung: string; FLeistung: Integer; public constructor Create(M_Bezeichnung: string; M_Leistung: Integer); function getDaten: string; virtual; end;
implementation
constructor TFahrzeug.Create(M_Bezeichnung: string; M_Leistung: Integer); begin FBezeichnung := M_Bezeichnung; FLeistung := M_Leistung; end;
function TFahrzeug.getDaten: string; begin Result := FBezeichnung + ' ' + IntToStr(FLeistung) + 'kW'; end; |
So, und jetzt willst du zusätzlich noch ergänzen, dann mach das auch:
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: 34: 35: 36:
| unit Unit3; interface
uses SysUtils, Unit2;
type THybridfahrzeug = class(TFahrzeug) private FZusatzleistung: Integer; public constructor Create(M_Bezeichnung: string; M_Leistung, E_M_Leistung: Integer); function getDaten: string; override; Function getZusatzleistung: Integer; end;
implementation
constructor THybridfahrzeug.Create(M_Bezeichnung: string; M_Leistung, E_M_Leistung: Integer); begin inherited Create(M_Bezeichnung, M_Leistung); FZusatzleistung := E_M_Leistung; end;
function THybridfahrzeug.getZusatzleistung: Integer; begin Result := FZusatzleistung; end;
function THybridfahrzeug.getDaten: string; begin Result := inherited getDaten + ', davon Zusatzleistung: ' + IntToStr(Zusatzleistung) + 'kW'; end;
end. |
So benutzt zu die Leistung als Gesamtleistung für alle Fahrzeuge und hast nur zusätzlich einen Teil davon als Zusatzleistung separat betrachtet.
Liam - Mo 24.05.10 17:38
So hab ich das ja auch in etwa. Allerdings wird die die Leistung des Hauptmotors und die des Zusatzmotors seperat angegeben.
jaenicke - Mo 24.05.10 17:43
Richtig, aber hier musst du nix selbst zusammenzählen, du hast die Gesamtleistung so oder so. Und bei den Fahrzeugen, die das zusätzlich haben, hast du dann davon einen Teil als Zusatzenergie, aber so bleibt die Bedeutung der Leistung aus TFahrzeug erhalten.
Es ließe sich natürlich auch die Zusatzleistung direkt in TFahrzeug implementieren und einfach standardmäßig auf Null setzen.
Aber die Hauptsache ist ja, dass es bei dir klappt. ;-)
Liam - Mo 24.05.10 17:44
So, wies jetzt ist, ist es ja okey und es läuft so, wie es soll. Das ist ja das wichtigste ;)
Bei Bedarf kann ich ja mal die Quelltexte der 4 Units posten, falls es jemand haben möchte^^
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!