Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi OOP - Neuling braucht ein bisschen Hilfe (https://www.delphipraxis.net/151521-oop-neuling-braucht-ein-bisschen-hilfe.html)

Liam 21. Mai 2010 09:14


OOP - Neuling braucht ein bisschen Hilfe
 
Hiho,

ich hab noch nicht lange OOP und ich brüte grade über einer Aufgabe und komme nicht weiter. Ich hab eine Radiogroup mit 4 EInträgen (wovon ich jewals immer den Titel wieder ausgeben will, z.B. Verbrennungsmotor)

Allerdings kommen (im Moment) 2 Fehlermeldungen: Nicht genügent wirkliche Parameter und Inkompatible Typen. Wie geb ich den Klassennahmn in der Memo aus? Und Hier muss auch noch eine Unit dazu, wo Alternativfahrzeuge (Elektro, Wasserstoff) definiert werden (soweit bin ich aber noch nicht).

Delphi-Quellcode:

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;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Auto: TFahrzeug;
  M_Leistung: string;
  M_Bezeichnung: boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if RadioGroup1.itemindex=0 then
Auto:= TFahrzeug.create(Edit1.text, Radiogroup1.itemindex=0);
{If RadioGroup1.itemindex=1 then
Auto := TAlternativfahrzeug.create(Edit1.text, Edit3.text);}
If Radiogroup1.itemindex=2 then
Auto:= THybridfahrzeug.create (Edit1.text, Edit2.text);
{If RadioGroup1.ItemIndex=3 then
Auto := TAlternativfahrzeug.create (Edit1.text, Edit3.text);}

//memo1.lines.add:=M_Leistung;

end;

end.
Delphi-Quellcode:
unit Unit2;
//Fahrzeug allgemein
interface
uses sysutils;
Type TFahrzeug = class (TObject)
  private
  public
   constructor create (M_Bezeichnung: string; M_Leistung: string);
   function getleistung: string;
   //function getMotorBezeichnung: string;
   //function getreichweite: integer; virtual; abstract;
end;
var Bezeichnung: string;
Leistung: string;
M_Leistung, M_Bezeichnung: string;


implementation

constructor TFahrzeug.create (M_Bezeichnung: string; M_Leistung: string);
begin
M_Bezeichnung :=Bezeichnung ;
M_Leistung :=Leistung ;
end;

function TFahrzeug.getleistung: string;
begin
   result := M_Leistung ;
end;

end.
Delphi-Quellcode:
unit Unit3;
//Fahrzeug Hybrid
interface
uses sysutils, unit2;
Type THybridfahrzeug = class (TFahrzeug)
  private
  public
   constructor create (M_Bezeichnung: string; M_Leistung, E_M_Leistung: string);
   //function getleistung: string; virtual;
   //function getMotorBezeichnung: string;
   //function getreichweite: string; virtual; abstract;
end;
var Bezeichnung: string;
Leistung, Zusatzleistung:string;
M_Leistung: string;


implementation

constructor THybridfahrzeug.create (M_Bezeichnung: string; M_Leistung,E_M_Leistung: string);
begin
inherited create (Bezeichnung, Leistung);
E_M_Leistung := Zusatzleistung;
end;



end.
MfG & Danke schonmal im Vorraus
Liam

AnyKey 21. Mai 2010 09:24

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Ich würde mal behaupten du solltest dir in deine RadioGroup auch ein paar RadioButtons einbauen und dann prüfen welches gesetzt ist in etwa so:

Delphi-Quellcode:
if RadioButton1.Checked then
begin
  // tue was
end;
das sollte dich erst mal weiter bringen.

Aso an den Text aus den RadioButtons kommst du dann so ran:

Delphi-Quellcode:
RadioButton1.Caption

dominikkv 21. Mai 2010 09:35

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Hallo Liam,

Herzlich Willkommen in der DP! :party:

Delphi-Quellcode:
Auto:= TFahrzeug.create(Edit1.text, Radiogroup1.itemindex=0);
Der Fehler werden wohl hier kommen. Radiogroup1.itemindex=0 ist ein Boolean! TFahrzeug.create erwartet aber einen String als 2ten Parameter.

Ich würde weiterhin
a) Die Komponenten auf der Form (Edit1, Edit2 etc) richtig benennen
b) Konsequent einrücken
c) Anstatt if ItemIndex=1 if ItemIndex=2 if ItemIndex=3 etc ein Case-Construct nehmen

@AnyKey: Bitte nicht auf = True prüfen!

Liam 21. Mai 2010 20:07

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Danke für eure Hilfe ihr beiden. Ich hab die If-Anweisungen mal in eine Case gepackt, und jetzt hab ich auch kein Problem mehr mit inkompatiblen Typen. Allerdings kommt jetzt folgende Meldung:

"Konstantenausruck erwartet"

Delphi-Quellcode:
var
  Form1: TForm1;
  Auto: TFahrzeug;
  M_Leistung: string;
  M_Bezeichnung: string;
  Bezeichnerwahl: boolean;


procedure TForm1.AnlegenClick(Sender: TObject);
 begin
  case Bezeichnerwahl of
   Radiogroup1.itemindex=0 :
    begin
     M_Bezeichnung:= 'Verbrennungsmotor';
    end;
   Radiogroup1.itemindex=1 :
    begin
     M_Bezeichnung:= 'Elektromotor';
    end;
   Radiogroup1.itemindex=2 :
    begin
     M_Bezeichnung:= 'Hybridantrieb';
    end;
   Radiogroup1.itemindex=3 :
    begin
     M_Bezeichnung:= 'Wasserstoffantrieb';
    end;
  end;
Da ich nicht mehr wusste, wie man eine Case-Anweisung schreibt, hab ich mal im Internet geschaut und unter anderem folgendes gefunden:

Delphi-Quellcode:
var Note: Integer;
    Wertung: String;

CASE Note OF
  1 : Wertung := 'Sehr gut';
  2 : Wertung := 'Gut';
  3 : Wertung := 'Befriedigend';
  4 : Wertung := 'Ausreichend';
  5 : Wertung := 'Mangelhaft';
  6 : Wertung := 'Ungenügend';
  ELSE Wertung := 'Diesen Notenwert gibt es nicht.';
END;  //von CASE
Bei diesem Beispiel ist es ja auch nicht anders geschrieben als wie bei mir.

Namenloser 21. Mai 2010 20:19

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Zitat:

Zitat von Liam
Bei diesem Beispiel ist es ja auch nicht anders geschrieben als wie bei mir.

Öhm... doch. Schau doch mal genau hin. Deine Syntax bim Case-Statement ist eine völlig andere.

Wolfgang Mix 21. Mai 2010 20:23

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Statt
Delphi-Quellcode:
case Bezeichnerwahl of
   Radiogroup1.itemindex=0 :
    begin
versuche einmal
Delphi-Quellcode:
case Bezeichnerwahl of
   Radiogroup1.itemindex=StrToInt('0') :
    begin
Gruss

Wolfgang

himitsu 21. Mai 2010 20:24

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Zitat:

Zitat von NamenLozer
Öhm... doch. Schau doch mal genau hin. Deine Syntax bim Case-Statement ist eine völlig andere.

So als Tipp: "Note" entspricht deinem "Radiogroup1.itemindex"

Liam 21. Mai 2010 20:36

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Zitat:

Zitat von Wolfgang Mix
Statt
Delphi-Quellcode:
case Bezeichnerwahl of
   Radiogroup1.itemindex=0 :
    begin
versuche einmal
Delphi-Quellcode:
case Bezeichnerwahl of
   Radiogroup1.itemindex=StrToInt('0') :
    begin
Gruss

Wolfgang


Leider funtkioniert das auch nicht. Selber fehler.

soulies 21. Mai 2010 20:47

Re: OOP - Neuling braucht ein bisschen Hilfe
 
hoi,

mal als Bsp.

Delphi-Quellcode:
case Boolean of
  True: ...
  False:...
end;

oder

case Zahl of
  0:
  1:
  2:
end;
in deiner Case anweisung hast du zwar eine Boolean Var verwendet (Bezeichnerwahl) aber das ist nicht das was du
eigentlich prüfen willst (--> ItemIndex).

Die einzelnen Zustände (True/False ; 0/1/2 ; etc) kannst du dann direkt hinschreiben.

cya

Klaus01 21. Mai 2010 20:49

Re: OOP - Neuling braucht ein bisschen Hilfe
 
.. wenn alle Tips nicht helfen:

Delphi-Quellcode:
procedure TForm1.AnlegenClick(Sender: TObject);
begin
  case RadioGroup1.itemIndex of
   0 :
    begin
     M_Bezeichnung:= 'Verbrennungsmotor';
    end;
   1 :
    begin
     M_Bezeichnung:= 'Elektromotor';
    end;
   2 :
    begin
     M_Bezeichnung:= 'Hybridantrieb';
    end;
   3 :
    begin
     M_Bezeichnung:= 'Wasserstoffantrieb';
    end;
  end;
denn es ist der ItemIndex der sich ändert wenn
du einen RadioButton der RadioGroup anklickst.

OT:
was hat das mit OOP zu tun

Grüße
Klaus

Liam 21. Mai 2010 21:02

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Mit OOP hat das glaub ich nicht wirklich was zu tun. Aber das Programm läuft schonmal, was positiv ist. Nun muss ich die anderen Units so basteln, dass das eingegebene auch angezeigt wird. Hierbei nochmal eine Frage: Wie zeig ich die Klassenbezeichnung im Memo an?

Klaus01 21. Mai 2010 21:12

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Delphi-Referenz durchsuchenTMemo.lines -> Delphi-Referenz durchsuchenTStrings.add

oder einmal deine Deplhi Hilfe bemühen.

Grüße
Klaus

Liam 23. Mai 2010 15:13

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Ich hab wieder ein Problemchen, diesmal bei der Datenausgabe.
Ich hab in der Case-Anweisung die Motorbezeichnung gesetzt, jetzt will ich die auch ausgeben. Allerdings geht es nicht. Ich steh grad irgentwie voll aufm Schlauch :wall:

Delphi-Quellcode:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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';
     Memo1.lines.Add(M_Bezeichnung);
    end;
   1 :
    begin
     M_Bezeichnung:= 'Elektromotor';
    end;
   2 :
    begin
     M_Bezeichnung:= 'Hybridantrieb';
    end;
   3 :
    begin
     M_Bezeichnung:= 'Wasserstoffantrieb';
    end;
  end;
  end;

end.
Delphi-Quellcode:
unit Unit2;
//Fahrzeug allgemein
interface
uses sysutils;
Type TFahrzeug = class (TObject)
  private
  public
   constructor create (M_Bezeichnung: string; M_Leistung: string);
   function getleistung: string;
   function getMotorBezeichnung: string; virtual;
   //function getreichweite: integer; virtual; abstract;
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 ;
  M_Leistung :=Leistung ;
 end;

function TFahrzeug.getleistung: string;
 begin
  result := Leistung ;
 end;


 function TFahrzeug.getMotorBezeichnung: string;
 begin
   result:= Bezeichnung;
 end;



end.

mkinzler 23. Mai 2010 15:19

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Delphi-Quellcode:
  case Radiogroup1.itemindex of
   0:
    begin
     Bezeichnung := 'Verbrennungsmotor';
    end;
   1 :
    begin
     M_Bezeichnung:= 'Elektromotor';
    end;
   2 :
    begin
     M_Bezeichnung:= 'Hybridantrieb';
    end;
   3 :
    begin
     M_Bezeichnung:= 'Wasserstoffantrieb';
    end;
    else
    begin
     M_Bezeichnung:= ';
    end;
    if M_Bezeichnung <> '' then        
        Memo1.lines.Add(M_Bezeichnung);
  end;

Liam 23. Mai 2010 19:03

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Ich habs jetzt mal mit dieser Variante versucht:

Delphi-Quellcode:
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;
Delphi-Quellcode:
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;
Hier hab ich jetzt wieder das anfangsproblem. Inkompatible Typen und nicht genügend wirkliche Parameter bei der Zeile Memo1.lines.Add := Auto.getDaten;

Und ich hab grad echt ein Brett vorm Kopf (wohl eher ne Bohle)

Klaus01 23. Mai 2010 20:19

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Guten Abend,

Zitat:

Zitat von DelphiHilfe
Lists the radio buttons in the radio group.

Class
TCustomRadioGroup

Syntax


property Items: TStrings read FItems write SetItems;


Description
Items holds a TStrings object that lists the captions of the radio buttons in the group. In TCustomRadioGroup descendants, where this property is published, radio buttons can be added or removed by editing the Items list from the Object Inspector.

Was Du vermutlich suchst ist das:
Zitat:

Zitat von DelphiHilfe
Indicates which radio button in the group is currently selected.

Class
TCustomRadioGroup

Syntax


property ItemIndex: Integer read FItemIndex write SetItemIndex;


Description
ItemIndex holds the index of the selected radio button in the Items list. (The first button is 0.) The value of ItemIndex changes at runtime as the user selects radio buttons. If you want one of the buttons to appear selected when the application starts, assign that button to ItemIndex at design time; otherwise, leave ItemIndex set to the default value of -1, which means that no button is selected.

[edit] bzw. eine Kombination aus beiden.
Delphi-Quellcode:
begin
  case Radiogroup1.itemindex of
   0:
    begin
     Bezeichnung := 'Verbrennungsmotor';
     Auto:=TFahrzeug.create(Radiogroup1.Items[RadioGroup1.ItemIndex], Ed_L_H.Text); // oder auch
     // Auto:=TFahrzeug.create(Bezeichnung, Ed_L_H.Text); // oder auch
     //Auto:=TFahrzeug.create(Radiogroup1.Items[0], Ed_L_H.Text);

     Memo1.lines.Add := Auto.getDaten;
    end;
.. und gewöhn Dich mal an die Regel "eine Frage pro Thread"

Grüße
Klaus

Liam 23. Mai 2010 23:13

Re: OOP - Neuling braucht ein bisschen Hilfe
 
Vielen vielen Dank :thumb:
diese Variante hat mir geholfen:
Auto:=TFahrzeug.create(Radiogroup1.Items[0], Ed_L_H.Text);
Jetzt läuft alles. Die Ausgaben der Klasse und in ein Memo statt Edit bekomm ich auch noch irgentwie hin :)

Lg
Liam


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