![]() |
Warum wird eine falsche Variable in einem Objekt bearbeitet
Hallo Zusammen,
ich habe das Objekt TUser mit vielen Varaiblen und die entsprechenden Geter und Seter dazu. Alles klappte auch sehr gut, bis ich heute eine weitere Variable hinzugefügt habe. Wenn ich in User_Norm_Mandanten etwas reinschreiben will, dann verändert die Software die Variable User_Rollen (die wird gar nicht in der Procedure verwendet). Hier ein Teil der Klasse TUser - es geht um die beiden letzten Variablen User_Rollen und User_Norm_Mandanten
Delphi-Quellcode:
type
TUser = class(TUnternehmen) strict protected FUser_ID:Integer; FUser_Name:string; FUser_Vorname:string; FUser_Adresse_ID:Integer; FUser_Abteilung_ID:Integer; FUser_Telefon: string; FUser_Fax: string; FUser_Mobil: string; FUser_Mail: string; FUser_Passwort: string; FLogFile_ID: integer; FUser_Rechte: string; FUser_Default_Folder: string; FUser_LogIn: string; FUser_Rollen: string; FUser_Norm_Mandanten: string; strict private function GetUser_Abteilung_ID : integer; procedure SetUser_Abteilung_ID(val : integer); public property User_Abteilung_ID : integer read GetUser_Abteilung_ID write SetUser_Abteilung_ID; strict private function GetUser_Fax : string; procedure SetUser_Fax(val : string); public property User_Fax : string read GetUser_Fax write SetUser_Fax; strict private function GetUser_ID : Integer; procedure SetUser_ID(val : Integer); public property User_ID : Integer read GetUser_ID write SetUser_ID; strict private function GetUser_Mail : string; procedure SetUser_Mail(val : string); public property User_Mail : string read GetUser_Mail write SetUser_Mail; strict private function GetUser_Mobil : string; procedure SetUser_Mobil(val : string); public property User_Mobil : string read GetUser_Mobil write SetUser_Mobil; strict private function GetUser_Vorname : string; procedure SetUser_Vorname(val : string); public property User_Vorname : string read GetUser_Vorname write SetUser_Vorname; strict private function GetUser_Name : string; procedure SetUser_Name(val : string); public property User_Name : string read GetUser_Name write SetUser_Name; strict private function GetUser_Passwort : string; procedure SetUser_Passwort(val : string); public property User_Passwort : string read GetUser_Passwort write SetUser_Passwort; strict private function GetUser_Telefon : string; procedure SetUser_Telefon(val : string); public property User_Telefon : string read GetUser_Telefon write SetUser_Telefon; strict private function GetLogFile_ID : integer; procedure SetLogFile_ID(val : integer); public property LogFile_ID : integer read GetLogFile_ID write SetLogFile_ID; strict private function GetUser_Rechte : string; procedure SetUser_Rechte(val : string); public property User_Rechte : string read GetUser_Rechte write SetUser_Rechte; strict private function GetUser_Default_Folder : string; procedure SetUser_Default_Folder(val : string); public property User_Default_Folder : string read GetUser_Default_Folder write SetUser_Default_Folder; strict private function GetUser_LogIn : string; procedure SetUser_LogIn(val : string); public property User_LogIn : string read GetUser_LogIn write SetUser_LogIn; strict private function GetUser_Adresse_ID : integer; procedure SetUser_Adresse_ID(val : integer); public property User_Adresse_ID : integer read GetUser_Adresse_ID write SetUser_Adresse_ID; strict private function GetUser_Rollen : string; procedure SetUser_Rollen(val : string); public property User_Rollen : string read GetUser_Rollen write SetUser_Rollen; strict private function GetUser_Norm_Mandanten : string; procedure SetUser_Norm_Mandanten(val : string); public property User_Norm_Mandanten : string read GetUser_Norm_Mandanten write SetUser_Norm_Mandanten; {!Intelligente Funktionen und Proceduren} Private function Load_User_Rollen(User_ID: integer): string; procedure Load_User_Rechte( User_ID:integer); function User_Insert: integer; function User_Update(User_ID: integer): integer; Public procedure Load_User( User_ID:integer); procedure Clear_User; function Load_User_ID (LogIn: string): integer; function User_Speichern (User_ID: integer): integer; end; var User: TUser; //Daten des angemeldeten Benutzers User_Management: TUser; //Um einen Benutzer zu verändern User_Neu: TUser; //Geänderte User-Daten implementation uses LogInUnit, TEinstellungenUnit; function TUser.GetUser_Abteilung_ID: integer; begin Result:= FUser_Abteilung_ID; end; procedure TUser.SetUser_Abteilung_ID(val : integer); begin FUser_Abteilung_ID:= val; end; function TUser.GetUser_Adresse_ID: integer; begin Result:= FUser_Adresse_ID; end; procedure TUser.SetUser_Adresse_ID(val : integer); begin FUser_Adresse_ID:= val; end; function TUser.GetUser_Fax: string; begin Result:= FUser_Fax; end; procedure TUser.SetUser_Fax(val : string); begin FUser_Fax:= val; end; function TUser.GetUser_ID: Integer; begin Result:= FUser_ID; end; procedure TUser.SetUser_ID(val : Integer); begin FUser_ID:= val; end; function TUser.GetUser_Mail: string; begin Result:= FUser_Mail; end; procedure TUser.SetUser_Mail(val : string); begin FUser_Mail:= val; end; function TUser.GetUser_Mobil: string; begin Result:= FUser_Mobil; end; procedure TUser.SetUser_Mobil(val : string); begin FUser_Mobil:= val; end; function TUser.GetUser_Vorname: string; begin Result:= FUser_Vorname; end; procedure TUser.SetUser_Vorname(val : string); begin FUser_Vorname:= val; end; function TUser.GetUser_Name: string; begin Result:= FUser_Name; end; procedure TUser.SetUser_Name(val : string); begin FUser_Name:= val; end; function TUser.GetUser_Passwort: string; begin Result:=FUser_Passwort; end; procedure TUser.SetUser_Passwort(val : string); begin FUser_Passwort:= val; end; function TUser.GetUser_Telefon: string; begin Result:= FUser_Telefon; end; procedure TUser.SetUser_Telefon(val : string); begin FUser_Telefon:= val; end; function TUser.GetLogFile_ID: integer; begin Result:= FLogFile_ID; end; procedure TUser.SetLogFile_ID(val : integer); begin FLogFile_ID:= val; end; function TUser.GetUser_Rechte: string; begin Result:= FUser_Rechte; end; procedure TUser.SetUser_Rechte(val : string); begin FUser_Rechte:= val; end; function TUser.GetUser_Default_Folder: string; begin Result:= FUser_Default_Folder; end; procedure TUser.SetUser_Default_Folder(val : string); begin FUser_Default_Folder:= val; end; function TUser.GetUser_LogIn: string; begin Result:= FUser_LogIn; end; procedure TUser.SetUser_LogIn(val : string); begin FUser_LogIn:= val; end; function TUser.GetUser_Rollen: string; begin Result:= FUser_Rollen; end; procedure TUser.SetUser_Rollen(val : string); begin FUser_Rollen:= val; end; function TUser.GetUser_Norm_Mandanten: string; begin Result:= FUser_Norm_Mandanten; end; procedure TUser.SetUser_Norm_Mandanten(val : string); begin FUser_Norm_Mandanten:= val; end; Wenn die nachfolgende Programmzeile ausgeführt wird, dann wird nicht User_Norm_Mandanten verändert, sondern User_Rollen.
Delphi-Quellcode:
User_Neu.User_Norm_Mandanten:=User_Neu.User_Norm_Mandanten+Grid_Norm_Mandanten.Cells[0,I]+',';
Ich weiß wirklich nicht, warum das passiert. Hier die ganze Procedure
Delphi-Quellcode:
Sieht jemand meinen Fehler?
procedure TFrameUser.GlowDelete_MandantClick(Sender: TObject);
var I: integer; begin if (Grid_Norm_Mandanten.Cells[0,Grid_Norm_Mandanten.Row]='') or (Grid_Norm_Mandanten.Cells[0,Grid_Norm_Mandanten.Row]=IntToStr(User_Neu.User_Unternehmen_ID)) then Exit; if Grid_Norm_Mandanten.Row>0 then begin User_Neu.User_Norm_Mandanten:=''; if Grid_Mandanten.Cells[0,Grid_Mandanten.RowCount-1]<>'' then Grid_Mandanten.AddRow; Grid_Mandanten.Cells[0,Grid_Mandanten.RowCount-1]:=Grid_Norm_Mandanten.Cells[0,Grid_Norm_Mandanten.Row]; Grid_Mandanten.Cells[1,Grid_Mandanten.RowCount-1]:=Grid_Norm_Mandanten.Cells[1,Grid_Norm_Mandanten.Row]; Grid_Mandanten.Sort(0,sdAscending); Grid_Norm_Mandanten.ClearRows(Grid_Norm_Mandanten.Row,1); if Grid_Norm_Mandanten.RowCount>2 then Grid_Norm_Mandanten.RemoveRows(Grid_Norm_Mandanten.Row,1); for I := 1 to Grid_Norm_Mandanten.RowCount -1 do begin User_Neu.User_Norm_Mandanten:=User_Neu.User_Norm_Mandanten+Grid_Norm_Mandanten.Cells[0,I]+','; end; User_Neu.User_Norm_Mandanten:=Copy(User_Neu.User_Norm_Mandanten,1,Length(User_neu.User_Norm_Mandanten)-1); GlowSpeichern.Enabled:=true; GlowAbbruch.Enabled:=true; end; end; Vielen Dank Patrick |
AW: Warum wird eins falsche Variable in einem Objekt bearbeitet
Dein Code ist leider sehr unübersichtlich und unvollständig (User_Rollen fehlt zB). Daher kann ich persönlich da erstmal keinen Fehler erkennen.
Räume doch deinen Code erstmal ordentlich auf und programmiere "ordentlich", wahrscheinlich löst sich das Problem dann von selbst oder du erkennst den Fehler. 1) Du kannst Felder und Methoden in Klassen in gleichen Bereichen zusammenfassen. Wozu verwendest du zig
Delphi-Quellcode:
- und
public
Delphi-Quellcode:
-Klauseln?
strict private
Delphi-Quellcode:
2) Du brauchst für Properties, die du direkt liest und schreibst und wo sonst nichts weiter passiert keine extra Getter und Setter. (siehe published-Bereich oben)
type
TMyClass = class private FStringVar: String; FIntegerVar: Integer; function PrivateFunction: String; procedure PrivateMethod(AVar: Integer); protected function ProtectedFunction: Boolean; procedure ProtectedMethod(AVar: Boolean); public procedure PublicMethod; function PublicFunction: Pointer; published property StringProperty: String read FStringVar write FStringVar; property IntegerProperty: String read FIntegerVar write FIntegerVar; end; 3) Wozu verwendest du
Delphi-Quellcode:
für Getter und Setter?
strict private
4) Warum verwendest du EINE Stringvariable, um mehrere Werte zu speichern?
Delphi-Quellcode:
Verwende doch eine
User_Neu.User_Norm_Mandanten:=User_Neu.User_Norm_Mandanten+Grid_Norm_Mandanten.Cells[0,I]+','
![]() |
AW: Warum wird eins falsche Variable in einem Objekt bearbeitet
3) Ja, wenn man die Getter/Setter in einem Private-Block zusammenfast, dann wird es bestimmt übersichtlicher.
1) Im Grunde ist es natürlich Besser hier die Getter/Setter wegzulassen und vom Property direkt auf das Feld zu verweisen, da in den Gettern und Settern j eigentlich garnichts gemacht wird, außer die Feldzuweisungen. Aber grundsätzlich sollte es dennoch keine Probleme geben und die Zugriffe im falschen Feld landen. (außer man verschreibt sich in den Gettern/Settern) 2) STRICT PRIVATE ist das eigentliche PRIVATE Auf diese Weise kommt man nicht auf die blöde Idee und verwendet innerhalb der Unit (in den anderen Klassen) ausversen diese Methoden, anstatt über das Property zu gehen. |
AW: Warum wird eins falsche Variable in einem Objekt bearbeitet
Zitat:
|
AW: Warum wird eins falsche Variable in einem Objekt bearbeitet
Die zusätzliche Strukturierung, um mehr Übersichtlichkeit zu erhalten, ist sicher sinnvoll. In dem Fall ist es aber übertrieben, vorallem in dieser Kombination mit den Gettern und Settern.
|
AW: Warum wird eins falsche Variable in einem Objekt bearbeitet
Ich lege auch schonmal "mehrere" Gruppen von Private&Public-Blöcken an, bei größeren Komponenten, um die Funktionen zu gruppieren.
Aber doch nicht für jeden Wert einzeln ... gruppierte Grüppchen halt :zwinker: |
AW: Warum wird eins falsche Variable in einem Objekt bearbeitet
Wie schaut denn TUnternehmen aus? In dem Code finde ich mal keinen Grund.
Frage. Werden die Werte wirklich so geschrieben oder allein in der Debugger Anzeige? |
AW: Warum wird eins falsche Variable in einem Objekt bearbeitet
Hui hui hui, jetzt bekomme ich aber gerade mein Fett weg ;-)
Ich generiere die Properties, Getter und Setter über die Modellierung, daher wurde sie entsprechend aufgesetzt... @ michaelthuma TUnternehmen wird in anderen Proceduren und Funktionen der Klassen TUser verwendet. Meinst Du mit Werten den Variablen-Namen? Wenn ja, dann lautet die Antwort "Ja", das sind die echten Namen. @nuclearping Ich habe den Code jetzt etwas anders formatiert und hoffe, dass er so besser zu lesen ist. User_Rollen ist meines Erachtens vorhanden (die vorletzte Variable). Zitat:
Zitat:
@ALL Vielen Dank für die Anregungen, lerne gerne dazu!!! Sieht jemand denn vielleicht auch die Ursache für den Fehler? Vielen Dank Patrick
Delphi-Quellcode:
type
TUser = class(TUnternehmen) strict protected FUser_ID:Integer; FUser_Name:string; FUser_Vorname:string; FUser_Adresse_ID:Integer; FUser_Abteilung_ID:Integer; FUser_Telefon: string; FUser_Fax: string; FUser_Mobil: string; FUser_Mail: string; FUser_Passwort: string; FLogFile_ID: integer; FUser_Rechte: string; FUser_Default_Folder: string; FUser_LogIn: string; FUser_Rollen: string; FUser_Norm_Mandanten: string; strict private function GetUser_Abteilung_ID : integer; procedure SetUser_Abteilung_ID(val : integer); function GetUser_Fax : string; procedure SetUser_Fax(val : string); function GetUser_ID : Integer; procedure SetUser_ID(val : Integer); function GetUser_Mail : string; procedure SetUser_Mail(val : string); function GetUser_Mobil : string; procedure SetUser_Mobil(val : string); function GetUser_Vorname : string; procedure SetUser_Vorname(val : string); function GetUser_Name : string; procedure SetUser_Name(val : string); function GetUser_Passwort : string; procedure SetUser_Passwort(val : string); function GetUser_Telefon : string; procedure SetUser_Telefon(val : string); function GetLogFile_ID : integer; procedure SetLogFile_ID(val : integer); function GetUser_Rechte : string; procedure SetUser_Rechte(val : string); function GetUser_Default_Folder : string; procedure SetUser_Default_Folder(val : string); function GetUser_LogIn : string; procedure SetUser_LogIn(val : string); function GetUser_Adresse_ID : integer; procedure SetUser_Adresse_ID(val : integer); function GetUser_Rollen : string; procedure SetUser_Rollen(val : string); function GetUser_Norm_Mandanten : string; procedure SetUser_Norm_Mandanten(val : string); public property User_Abteilung_ID : integer read GetUser_Abteilung_ID write SetUser_Abteilung_ID; property User_Fax : string read GetUser_Fax write SetUser_Fax; property User_ID : Integer read GetUser_ID write SetUser_ID; property User_Mail : string read GetUser_Mail write SetUser_Mail; property User_Mobil : string read GetUser_Mobil write SetUser_Mobil; property User_Vorname : string read GetUser_Vorname write SetUser_Vorname; property User_Name : string read GetUser_Name write SetUser_Name; property User_Passwort : string read GetUser_Passwort write SetUser_Passwort; property User_Telefon : string read GetUser_Telefon write SetUser_Telefon; property LogFile_ID : integer read GetLogFile_ID write SetLogFile_ID; property User_Rechte : string read GetUser_Rechte write SetUser_Rechte; property User_Default_Folder : string read GetUser_Default_Folder write SetUser_Default_Folder; property User_LogIn : string read GetUser_LogIn write SetUser_LogIn; property User_Adresse_ID : integer read GetUser_Adresse_ID write SetUser_Adresse_ID; property User_Rollen : string read GetUser_Rollen write SetUser_Rollen; property User_Norm_Mandanten : string read GetUser_Norm_Mandanten write SetUser_Norm_Mandanten; {!Intelligente Funktionen und Proceduren} Private function Load_User_Rollen(User_ID: integer): string; procedure Load_User_Rechte( User_ID:integer); function User_Insert: integer; function User_Update(User_ID: integer): integer; Public procedure Load_User( User_ID:integer); procedure Clear_User; function Load_User_ID (LogIn: string): integer; function User_Speichern (User_ID: integer): integer; end; var User: TUser; //Daten des angemeldeten Benutzers User_Management: TUser; //Um einen Benutzer zu verändern User_Neu: TUser; //Geänderte User-Daten implementation uses LogInUnit, TEinstellungenUnit; function TUser.GetUser_Abteilung_ID: integer; begin Result:= FUser_Abteilung_ID; end; procedure TUser.SetUser_Abteilung_ID(val : integer); begin FUser_Abteilung_ID:= val; end; function TUser.GetUser_Adresse_ID: integer; begin Result:= FUser_Adresse_ID; end; procedure TUser.SetUser_Adresse_ID(val : integer); begin FUser_Adresse_ID:= val; end; function TUser.GetUser_Fax: string; begin Result:= FUser_Fax; end; procedure TUser.SetUser_Fax(val : string); begin FUser_Fax:= val; end; function TUser.GetUser_ID: Integer; begin Result:= FUser_ID; end; procedure TUser.SetUser_ID(val : Integer); begin FUser_ID:= val; end; function TUser.GetUser_Mail: string; begin Result:= FUser_Mail; end; procedure TUser.SetUser_Mail(val : string); begin FUser_Mail:= val; end; function TUser.GetUser_Mobil: string; begin Result:= FUser_Mobil; end; procedure TUser.SetUser_Mobil(val : string); begin FUser_Mobil:= val; end; function TUser.GetUser_Vorname: string; begin Result:= FUser_Vorname; end; procedure TUser.SetUser_Vorname(val : string); begin FUser_Vorname:= val; end; function TUser.GetUser_Name: string; begin Result:= FUser_Name; end; procedure TUser.SetUser_Name(val : string); begin FUser_Name:= val; end; function TUser.GetUser_Passwort: string; begin Result:=FUser_Passwort; end; procedure TUser.SetUser_Passwort(val : string); begin FUser_Passwort:= val; end; function TUser.GetUser_Telefon: string; begin Result:= FUser_Telefon; end; procedure TUser.SetUser_Telefon(val : string); begin FUser_Telefon:= val; end; function TUser.GetLogFile_ID: integer; begin Result:= FLogFile_ID; end; procedure TUser.SetLogFile_ID(val : integer); begin FLogFile_ID:= val; end; function TUser.GetUser_Rechte: string; begin Result:= FUser_Rechte; end; procedure TUser.SetUser_Rechte(val : string); begin FUser_Rechte:= val; end; function TUser.GetUser_Default_Folder: string; begin Result:= FUser_Default_Folder; end; procedure TUser.SetUser_Default_Folder(val : string); begin FUser_Default_Folder:= val; end; function TUser.GetUser_LogIn: string; begin Result:= FUser_LogIn; end; procedure TUser.SetUser_LogIn(val : string); begin FUser_LogIn:= val; end; function TUser.GetUser_Rollen: string; begin Result:= FUser_Rollen; end; procedure TUser.SetUser_Rollen(val : string); begin FUser_Rollen:= val; end; function TUser.GetUser_Norm_Mandanten: string; begin Result:= FUser_Norm_Mandanten; end; procedure TUser.SetUser_Norm_Mandanten(val : string); begin FUser_Norm_Mandanten:= val; end;
Delphi-Quellcode:
procedure TFrameUser.GlowDelete_MandantClick(Sender: TObject);
var I: integer; begin if (Grid_Norm_Mandanten.Cells[0,Grid_Norm_Mandanten.Row]='') or (Grid_Norm_Mandanten.Cells[0,Grid_Norm_Mandanten.Row]=IntToStr(User_Neu.User_Unternehmen_ID)) then Exit; if Grid_Norm_Mandanten.Row>0 then begin User_Neu.User_Norm_Mandanten:=''; if Grid_Mandanten.Cells[0,Grid_Mandanten.RowCount-1]<>'' then Grid_Mandanten.AddRow; Grid_Mandanten.Cells[0,Grid_Mandanten.RowCount-1]:=Grid_Norm_Mandanten.Cells[0,Grid_Norm_Mandanten.Row]; Grid_Mandanten.Cells[1,Grid_Mandanten.RowCount-1]:=Grid_Norm_Mandanten.Cells[1,Grid_Norm_Mandanten.Row]; Grid_Mandanten.Sort(0,sdAscending); Grid_Norm_Mandanten.ClearRows(Grid_Norm_Mandanten.Row,1); if Grid_Norm_Mandanten.RowCount>2 then Grid_Norm_Mandanten.RemoveRows(Grid_Norm_Mandanten.Row,1); for I := 1 to Grid_Norm_Mandanten.RowCount -1 do begin User_Neu.User_Norm_Mandanten:=User_Neu.User_Norm_Mandanten+Grid_Norm_Mandanten.Cells[0,I]+','; end; User_Neu.User_Norm_Mandanten:=Copy(User_Neu.User_Norm_Mandanten,1,Length(User_neu.User_Norm_Mandanten)-1); GlowSpeichern.Enabled:=true; GlowAbbruch.Enabled:=true; end; end; |
AW: Warum wird eins falsche Variable in einem Objekt bearbeitet
Was passiert denn, wenn Du das Feld FUser_Norm_Mandanten als TStrings oder gleich TStringlist deklarierst? Du bräuchtest dann noch eine Add-Methode, der Getter würde die aufbereitete Liste zurückgeben. Und die Liste müsste natürlich im Konstruktor angelegt und im Destruktor wieder freigegeben werden.
[edit] Das klang vielleicht etwas verwirrend, daher hier eine Schmalspurversion des Ganzen:
Delphi-Quellcode:
[/edit]
type
TUser = class strict private FMandanten: TStringlist; function GetMandanten: string; public constructor Create; destructor Destroy; override; procedure AddMandant(const NewMandant: string); property Mandanten: string read GetMandanten; end; ... procedure TUser.AddMandant(const NewMandant: string); begin FMandanten.Add(NewMandant); end; constructor TUser.Create; begin inherited Create; FMandanten := TStringlist.Create; end; destructor TUser.Destroy; begin FMandanten.Free; inherited; end; function TUser.GetMandanten: string; begin Result := FMandanten.CommaText; end; |
AW: Warum wird eins falsche Variable in einem Objekt bearbeitet
Hallo Zusammen,
bitte fragt mich, was heute anders ist, aber als ich es gerade wieder versucht habe, hat alles entsprechend funktioniert. Es war noch ein kleiner anderer Fehler drin, der aber damit nichts zu tun hatte. Ich habe das Dingen compilierte, und die Procedure genau beobachtet und er hat sofort auf die richtigen Variablen zugegriffen. Jetzt im Nachhinein fällt mir ein, dass ich gestern, als ich Delphi beendete, die Message bekam, das Delphi nicht richtig ausgeführt würde und das System hakte kurz. Vielleicht war es wirklich ein Fehler im Delphi ?! Delphi 2009 Enterprise Jetzt funktioniert es jedenfalls wie gewünscht und auch programmiert... Vielen Dank für die Unterstützung Patrick |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:37 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