Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einfaches MVC Modell funktioniert nicht! (https://www.delphipraxis.net/93730-einfaches-mvc-modell-funktioniert-nicht.html)

mo_greene 10. Jun 2007 16:18


Einfaches MVC Modell funktioniert nicht!
 
Hallo,

habe einen BMI Rechner auf MVC Basis programmiert und auch beim zweiten unabhängigen Programmieren trat der gleiche Fehler auf :gruebel: ...das Programm kann compiliert werden, jedoch wenn Werte eingegeben wurden und das Programm den BMI berechnen soll, erscheint ein Fehler!

Vielleicht kann sich jemand das mal ansehen...wäre super nett!!

Delphi-Quellcode:
unit uView_Control;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, uModell;

type
  TForm1 = class(TForm)
    GroesseLblEdt: TLabeledEdit;
    GewichtLblEdt: TLabeledEdit;
    BMILblEdt: TLabeledEdit;
    BerechneBtn: TButton;
    procedure BerechneBtnClick(Sender: TObject);
    procedure Datenaktualisieren;
    procedure Maskeaktualisieren;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Modell: TModell;

implementation

{$R *.dfm}

procedure TForm1.BerechneBtnClick(Sender: TObject);
begin
  Datenaktualisieren;
  Maskeaktualisieren;
end;

procedure TForm1.Datenaktualisieren;
begin
  Modell.setGroesse(strtoint(GroesseLblEdt.Text));
  Modell.setGewicht(strtoint(GewichtLblEdt.Text));
end;

procedure TForm1.Maskeaktualisieren;
begin
  BMILblEdt.Text := floattostr(Modell.getBMI);
end;

end.
Delphi-Quellcode:
unit uModell;

interface

type
  TModell = class(TObject)
  private
    Groesse : Integer;
    Gewicht : Integer;
    BMI : Real;
  public
    procedure setGroesse (a:Integer);
    procedure setGewicht (a:Integer);
    function getBMI : Real;

end;

implementation

procedure TModell.setGroesse(a: Integer);
begin
  Groesse := a; // hier soll laut Delphi der Fehler liegen!
end;

procedure TModell.setGewicht(a: Integer);
begin
  Gewicht := a;
end;

function TModell.getBMI : Real;
begin
  BMI := Gewicht/((Groesse/100)*(Groesse/100));
  result := BMI;
end;
end.

Folgende Fehlermeldung erscheint:
Im Projekt BMI.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 0045055C in Modul 'BMI.exe'. Schreiben von Adresse 00000004'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.


Vielen Dank!!

Elvis 10. Jun 2007 16:28

Re: Einfaches MVC Modell funktioniert nicht!
 
Zitat:

Zitat von mo_greene
Hallo,
habe einen BMI Rechner auf MVC Basis programmiert...

Nein, hast du nicht.
Du hast die Hinweise in deinem anderen Thread nicht beachtet. (Weshalb dort irgendwann wohl keiner mehr antworten wollte ;) )
Du hast immer noch eine globale Variable da drin. Die wird niemals auf eine Instanz von TModell gesetzt, wodurch die AV kommt. Ganz zu schweigen davon, dass sie absolut falsch ist.
Wie im anderen Thread kann ich auch hier nur empfehlen Modell als öffentliche Eigenschaft deines Forms zu ändern.

Der Code, der dann das Form erzeugt und zeigen lässt, kann dann einfach das Modell besetzen.

mo_greene 10. Jun 2007 16:54

Re: Einfaches MVC Modell funktioniert nicht!
 
Vielen Dank für deine vielen Hinweise.

Ich bin jedoch noch ziemlicher Anfänger und wie du ersehen konntest, beschäftige ich mich noch mit den Grundlagen!
Könntest du mir sagen, wo ich im uView_Control das Modell richtig einbringen muss!
Wenn ich die globale Variabel rausnehme, da du gesagt hast, dass sie falsch ist, ist das Programm auf fehlerhaft.
Ich habe mich auch schon vorher gewundert, warum das Modell dort eine globale Variable ist, aber so habe ich das leider aus dem Unterricht mitgenommen!

Bei anderen Programmen hat es mit Modell als globale Variable funktioniert. Da musste ich aber das Modell beim Erstellen der Form erstellen lassen.

Vielen Dank!

r2c2 10. Jun 2007 17:01

Re: Einfaches MVC Modell funktioniert nicht!
 
http://www.dsdt.info/grundlagen/spra...struktoren.php

mfg

Christian

mo_greene 10. Jun 2007 17:02

Re: Einfaches MVC Modell funktioniert nicht!
 
ok vielen dank, also liegt es daran, dass ich Modell erzeugen lassen muss...

Elvis 10. Jun 2007 17:06

Re: Einfaches MVC Modell funktioniert nicht!
 
Zitat:

Zitat von mo_greene
Vielen Dank für deine vielen Hinweise.

Ich bin jedoch noch ziemlicher Anfänger und wie du ersehen konntest, beschäftige ich mich noch mit den Grundlagen!
Könntest du mir sagen, wo ich im uView_Control das Modell richtig einbringen muss!

Ich habe mich vllt spitz ausgedrückt, habe es aber nicht böse gemeint. Also nächstes Mal ein paar "!" weniger, hmm? ;)
Zitat:

Wenn ich die globale Variabel rausnehme, da du gesagt hast, dass sie falsch ist, ist das Programm auf fehlerhaft.
Jupp, es fehlt ja pötzlich der Bezeichner Modell, den du in den Methoden deines Forms benutzt.
Deshalb sagte ich, dass du es als öffentliche Eigenschaft lösen kannst:
Delphi-Quellcode:
TForm1 = class(TForm)
  ...
  private
    fModell : TModell;
  protected
    procedure SetModell(const aValue : TModell);
  public
    ...
    property Modell : TModell
      read fModell
      write SetModell;
  end;
Was passiert da? Nun du hast jetzt eine öffentliche Eigenschaft, die beim Lesen das Feld fModell direkt zurückgibt.
Beim Schreiben wird allerdings die Methode SetModell aufgerufen.
Der Grund ist der, dass du wahrscheinlich die Ansicht aktualisieren wilst, wenn jemand ein Modell reingeworfen hat, richtig?
Und genau das kannst du in SetModell machen.
Du musst mindestens das Feld besetzen...
Delphi-Quellcode:
procedure TForm1.SetModell(const aValue : TModell);
begin
  fModell := aValue;
end;
...Kannst aber natürlich auch die Ansicht aktualisieren...
Delphi-Quellcode:
procedure TForm1.SetModell(const aValue : TModell);
begin
  if fModell = aValue then Exit; // hat sich ja nix geändert....

  fModell := aValue;
  MaskeAktualisieren();
end;
Wer immer die Ansicht erzeugt und anzeigt, kann jetzt einfach so die Daten zuweisen:
Delphi-Quellcode:
var
  ansicht : TForm1;
begin
  ansicht := TForm1.Create(nil);
  ansicht.Modell := deinModell;
  ansicht.ShowModal();
  ....

Zitat:

Ich habe mich auch schon vorher gewundert, warum das Modell dort eine globale Variable ist, aber so habe ich das leider aus dem Unterricht mitgenommen!
Au weia!
Kann ich mir gar nicht vorstellen, dass euer Lehrer euch das Trennen von Daten, Logik und Ansicht beibringen will, aber zugeich solche Totsünden (globale Variablen) begeht... :shock:

mo_greene 10. Jun 2007 17:10

Re: Einfaches MVC Modell funktioniert nicht!
 
Okay vielen Dank nochmals für deine Mühe! :spin2:
Ich werde das jetzt mal durchgehen was du hier gepostet hast! :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz