AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Warum wird eine falsche Variable in einem Objekt bearbeitet

Warum wird eine falsche Variable in einem Objekt bearbeitet

Ein Thema von Ykcim · begonnen am 17. Mär 2014 · letzter Beitrag vom 18. Mär 2014
Antwort Antwort
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

AW: Warum wird eins falsche Variable in einem Objekt bearbeitet

  Alt 17. Mär 2014, 18:21
Du kannst Felder und Methoden in Klassen in gleichen Bereichen zusammenfassen. Wozu verwendest du zig public - und strict private -Klauseln?
Sehe ich gelegentlich auch bei anderen Leuten und mache ich persönlich z.b. auch so, um bestimmte Methoden zu gruppieren. Wenn man es nicht übertreibt erhöht das meiner Meinung nach die Übersichtlichkeit. Ist aber vermutlich Geschmackssache
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Warum wird eins falsche Variable in einem Objekt bearbeitet

  Alt 17. Mär 2014, 18:40
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.374 Beiträge
 
Delphi 12 Athens
 
#3

AW: Warum wird eins falsche Variable in einem Objekt bearbeitet

  Alt 17. Mär 2014, 18:56
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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
michaelthuma
(Gast)

n/a Beiträge
 
#4

AW: Warum wird eins falsche Variable in einem Objekt bearbeitet

  Alt 17. Mär 2014, 19:46
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?
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#5

AW: Warum wird eins falsche Variable in einem Objekt bearbeitet

  Alt 18. Mär 2014, 07:36
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:
Warum verwendest du EINE Stringvariable, um mehrere Werte zu speichern?
Ich speichere mehrere Werte in einem String, weil es an dieser in meinen Augen Stelle Sinn macht. Der String wird nämlich später in einem SQL-Statement verwendet.
Zitat:
) 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)
Wie das funktioniert weiß ich leider nicht. Ich kenne bislang nur diesen Weg...

@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;
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#6

AW: Warum wird eins falsche Variable in einem Objekt bearbeitet

  Alt 18. Mär 2014, 07:53
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:
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;
[/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (18. Mär 2014 um 08:16 Uhr)
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#7

AW: Warum wird eins falsche Variable in einem Objekt bearbeitet

  Alt 18. Mär 2014, 08:40
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
Patrick
  Mit Zitat antworten Zitat
TiGü
Online

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Warum wird eins falsche Variable in einem Objekt bearbeitet

  Alt 18. Mär 2014, 08:50
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 ?!
Und wieder gilt:
http://youtu.be/nn2FB1P_Mn8?t=10s
  Mit Zitat antworten Zitat
michaelthuma
(Gast)

n/a Beiträge
 
#9

AW: Warum wird eins falsche Variable in einem Objekt bearbeitet

  Alt 18. Mär 2014, 10:22
Recht so.

Schwer zu beurteilen. Vermutlich wurde nicht alles neu übersetzt oder die IDE war verwirrt. Aber dass Delphi wirklich vorsetzlich in das falsche Feld schreibt ohne Type Cast... wäre erstaunlich. Aber geben tut es alles.

Was hat sich geändert? Vermutlich ist die Energie nach dem erste Kaffee eine positivere.

Egal ... nach ein paar Minuten wirds lustig ... David Icke On Information Processing ... ist mir auch schon so gegangen beim Debuggen oder nachher

Hallo Zusammen,
bitte fragt mich, was heute anders ist, ...
Jetzt funktioniert es jedenfalls wie gewünscht und auch programmiert...

Geändert von michaelthuma (18. Mär 2014 um 10:53 Uhr)
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Warum wird eins falsche Variable in einem Objekt bearbeitet

  Alt 18. Mär 2014, 14:57
Zitat:
) 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)
Wie das funktioniert weiß ich leider nicht. Ich kenne bislang nur diesen Weg...
Indem du es einfach nur so schreibst

Delphi-Quellcode:
private
  FMyProperty: integer;
public
  property MyProperty: integer read FMyProperty write FMyProperty (default 0);
Das default 0 ist bewusst umklammert und soll heißen, dass du den Default-Wert nicht setzen musst. Der Unterschied zu dieser und der deinen Methode ist, dass hier nicht noch der umständliche Weg über die Getter bzw. Setter Procedure genommen wird, sondern du einfach direkt in dein Feld hinein schreibst. Im Grunde machen deine Getter und Setter nichts anderes, als den übergebenen Wert in dein Feld zu schreiben.

Das heißt:
Delphi-Quellcode:
property User_Abteilung_ID : integer
  read GetUser_Abteilung_ID
  write SetUser_Abteilung_ID;
wird zu:
Delphi-Quellcode:
...
property User_Abteilung_ID : integer read FUser_Abteilung_ID write FUser_Abteilung_ID;
...
Nur dort wo die Werte überprüft werden müssen, die in deine(n) Felder geschrieben/gespeichert werden sollen, dort brauchst du Setter bzw. auch Getter Methoden (wenn diese, möglicherweise abhängig von anderen Werten, noch umgewandelt werden sollen).
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:38 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