| Autor |
Beitrag |
Liam
Hält's aus hier
Beiträge: 8
WinXP, WinVista Home Premium
Turbo Delphi für Win32
|
Verfasst: So 23.05.10 20:57
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?
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. |
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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 8554
Erhaltene Danke: 480
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: So 23.05.10 21:42
Hallo und  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');
_________________ We are, we were and will not be.
|
|
Black200607
      
Beiträge: 50
Win XP
Pascal(Free Pascal/Lazarus), Java, Php, Python
|
Verfasst: So 23.05.10 22:30
Hallo und guten Abend,
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 
|
|
Liam 
Hält's aus hier
Beiträge: 8
WinXP, WinVista Home Premium
Turbo Delphi für Win32
|
Verfasst: 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
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. |
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. |
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. |
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
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
WinXP, WinVista Home Premium
Turbo Delphi für Win32
|
Verfasst: 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
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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?
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 
Hält's aus hier
Beiträge: 8
WinXP, WinVista Home Premium
Turbo Delphi für Win32
|
Verfasst: 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
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 24.05.10 15:31
|
|
Liam 
Hält's aus hier
Beiträge: 8
WinXP, WinVista Home Premium
Turbo Delphi für Win32
|
Verfasst: 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
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
WinXP, WinVista Home Premium
Turbo Delphi für Win32
|
Verfasst: 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
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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: 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 
Hält's aus hier
Beiträge: 8
WinXP, WinVista Home Premium
Turbo Delphi für Win32
|
Verfasst: 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
      
Beiträge: 19339
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
WinXP, WinVista Home Premium
Turbo Delphi für Win32
|
Verfasst: 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^^
|
|
|