![]() |
Delphi-Version: XE3
access violation
Hey,
ich versuche gerade von einer Unit einer Methode von einer anderen Unit einen Wert zu übergeben, also:
Delphi-Quellcode:
und
unit Controller;
interface uses Logic; type CalcController = class(TObject) private m_AddZahl: TBerechnung; public procedure Notify(p_Action: String; p_Param: String); end; implementation procedure CalcController.Notify(p_Action: String; p_Param: String); begin if (p_Action = 'Zahl') then begin m_AddZahl.AddZahl(p_Param); end end; end.
Delphi-Quellcode:
Aber da kommt bei der Zeile 'm_AddZahl.AddZahl(p_Param);' diese Fehlermeldung 'access violation' :/
unit Logic;
interface uses System.Classes, System.SysUtils; type TBerechnung = class private { Private-Deklarationen } public { Public-Deklarationen } procedure AddZahl(p_Parameter: String); end; implementation procedure TBerechnung.AddZahl(p_Parameter: String); var eingabeZahl: String; begin eingabeZahl := eingabeZahl + p_Parameter; end; end. Weiß jemand wo ich da den Fehler habe? :) Vielen Dank im Voraus Grüße ford42 :) |
AW: access violation
Du musst das Objekt zuerst instanziieren bevor du es benutzt.
Delphi-Quellcode:
Nur ist es aber auch wichtig, dass du das Objekt m_AddZahl auch wieder mit
unit Controller;
interface uses Logic; type CalcController = class(TObject) private m_AddZahl: TBerechnung; public procedure Notify(p_Action: String; p_Param: String); end; implementation procedure CalcController.Notify(p_Action: String; p_Param: String); begin if (p_Action = 'Zahl') then begin m_AddZahl := TBerechnung.Create; // <----- das hier dabei schreiben m_AddZahl.AddZahl(p_Param); end end; end.
Delphi-Quellcode:
freigibst wenn du es nicht mehr benötigst.
m_AddZahl.Free;
|
AW: access violation
Danke,
aber jetzt kommt die Fehlermeldung bereits bei 'm_AddZahl := TBerechnung.Create; // <----- das hier dabei schreiben'. :/ |
AW: access violation
Ganz sicher? Bist du mal mit dem Debugger durchgegangen und hast das kontrolliert? Mach das mal zuerst noch. Wenn du nicht weiterkommst, dann häng das komplette Projekt mal hier an.
PS: Welche Delphi Version verwendest du? Das kannst du in deinem Profil hinterlegen. |
AW: access violation
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, ich habe Break-Points gesetzt und als der Fehler kam, war der blaue Pfeil auch bei der Zeile. :/
EDIT: Sry, hab nun alles gepackt |
AW: access violation
Bitte das komplette Projekt, wenn möglich als ZIP-Datei, anhängen. Hier fehlen sowohl die Projektdatei (*.dpr) also auch die Form-Datei (Gui.dfm).
Edit: OK, die DPR hast du noch nachgeschossen, aber die DFM fehlt trotzdem noch. |
AW: access violation
Zitat:
Delphi-Quellcode:
zu? Ich vermute, du instanzierst diesen hier auch nicht?
CalcController
Und btw:
|
AW: access violation
Zitat:
@ford42: Du kannst auch den Sender auswerten, der bei einem OnClick() Event übergeben wird. So werden aus deinen 14 (oder wie viele es auch immer sind) Prozeduren die du mit dieser Art des Programmierens benötigst eigentlich nur noch 2. Eine die deinen Controller mit 'Zahl' aufruft und eine mit 'Rechenzeichen'. |
AW: access violation
Danke,
hier nun die neue gui:
Delphi-Quellcode:
So meintet ihr es oder? :)
unit Gui;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Controller; type TFrmCalculator = class(TForm) Lb_Gleichung: TLabel; Lb_Ergebnis: TLabel; Bt_Gleich: TButton; Bt_C: TButton; Bt_Sechs: TButton; Bt_Rueck: TButton; Bt_Drei: TButton; Bt_Neun: TButton; Bt_Null: TButton; Bt_Eins: TButton; Bt_Durch: TButton; Bt_Komma: TButton; Bt_Sieben: TButton; Bt_Vier: TButton; Bt_Mal: TButton; Bt_Zwei: TButton; Bt_Fuenf: TButton; Bt_Acht: TButton; Bt_Plus: TButton; Bt_Minus: TButton; procedure Zahl(Sender: TObject); procedure Rechnoperator(Sender: TObject); procedure Ereignis(Sender: TObject); private { Private-Deklarationen } m_ControllerAdd: CalcController; public { Public-Deklarationen } end; var FrmCalculator: TFrmCalculator; implementation {$R *.dfm} //Uses procedure TFrmCalculator.Zahl(Sender: TObject); var zahl: String; begin zahl := TButton(Sender).Caption; m_ControllerAdd := CalcController.Create; m_ControllerAdd.Notify('Zahl', zahl); Lb_Gleichung.Caption := Lb_Gleichung.Caption + zahl; m_ControllerAdd.Free; end; procedure TFrmCalculator.Ereignis(Sender: TObject); var ereignis: String; begin m_ControllerAdd := CalcController.Create; ereignis := TButton(Sender).Caption; m_ControllerAdd.Notify('Ereignis', ereignis); m_ControllerAdd.Free; end; procedure TFrmCalculator.Rechnoperator(Sender: TObject); var rechenoperator: String; begin m_ControllerAdd := CalcController.Create; rechenoperator := TButton(Sender).Caption; m_ControllerAdd.Notify('Rechenoperator', rechenoperator); Lb_Gleichung.Caption := Lb_Gleichung.Caption + rechenoperator; m_ControllerAdd.Free; end; end. |
AW: access violation
Edit: Naja, den Beitrag bearbeiten während ich meinen schreibe (kannst du zwar nicht wissen) ist nicht so klug, da meine Hinweise jetzt falsch verstanden werden könnten.
Also das was hier jetzt in deiner Haupt Pas-Datei steht sieht schonmal soweit richtig aus. Das was noch fehlt, ist die Instanziierung des m_ControllerAdd Feldes. Um dies noch zu erledigen, solltest du dir einen EventHandler für das FormCreate und das FormDestroy Ereignis erstellen und dann folgendes noch eintragen. Bitte beachte auch noch den Hinweis von nuclearping und benenne deine Klassen noch um und stelle ein T vor den Namen. Typen werden in Delphi laut Konvention immer mit einem T gekennzeichnet. Also sollte aus deiner CalcController Klasse ein TCalcController werden.
Delphi-Quellcode:
procedure TFrmCalculator.FormCreate(Sender: TObject);
begin m_ControllerAdd := CalcController.Create; end;
Delphi-Quellcode:
procedure TFrmCalculator.FormDestroy(Sender: TObject);
begin m_ControllerAdd.Free; end; In deiner Controller.pas solltest du dir in der CalcController (später TCalcController) Klasse noch einen
Delphi-Quellcode:
und einen
constructor
Delphi-Quellcode:
im Public Abschnitt anlegen. Im Constructor solltest du folgendes reinschreiben:
destructor
Delphi-Quellcode:
Im Destructor folgendes:
constructor CalcController.Create;
begin m_AddZahl := TBerechnung.Create; end;
Delphi-Quellcode:
Aus deiner Notify Procedure kannst du dann die Erzeugung des Objektes wieder entfernen, da dies ja dann im Constructor schon gemacht wird.
destructor CalcController.Destroy;
begin m_AddZahl.Free; end;
Delphi-Quellcode:
Wenn du das alles gemacht hast, dann sollte dein Programm eigentlich funktionieren.
procedure CalcController.Notify(p_Action: String; p_Param: String);
begin if (p_Action = 'Zahl') then begin m_AddZahl := TBerechnung.Create; // <---- Das hier wieder entfernen, da im Constructor bereits erledigt m_AddZahl.AddZahl(p_Param); //m_AddZahl.Free; end else if (p_Action = 'Ergebnis') then begin end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:35 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