Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variable ist plötzlich anders (https://www.delphipraxis.net/192961-variable-ist-ploetzlich-anders.html)

ConnorMcLeod 6. Jun 2017 16:55

AW: Variable ist plötzlich anders
 
Delphi-Quellcode:
type
  TUKunden = class(TForm)
  .....
  private
    FKundennummer: string;
    procedure SetKundennummer(const AValue: string);
  public
    property Kundennummer read FKundennummer write SetKundennummer;
  end;

implementation

.....

procedure TUKunden.SetKundennummer(const AValue: string);
begin
  FKundenummer := AValue; // BREAKPOINT HIER SETZEN
end;
Vor dem eigentlichen Aufruf von
Delphi-Quellcode:
FirstKundenSuchen
dem property Kundennummer den zu suchenden Wert zuweisen und es dann als Parameter mitgeben. Sollte irgendein Event oder Thread die Kundennummer einstweilen verändern, dann stehst Du beim Breakpoint und kannst den Callstack untersuchen.

HTH (hope that helps)

Blup 6. Jun 2017 16:57

AW: Variable ist plötzlich anders
 
Wenn ein String-Paramerter innerhalb der Methode nicht verändert werden soll, vereinbart man den am besten als "const"-Paramter.
Delphi-Quellcode:
FirstKundenSuchen(const KundenNummer: String{ ...})
.
Für die Rückgabe kann man zwar "var"-Parameter verwenden, aber eigentlich sollten es hier "out"-Parameter sein.
"var" bedeuted die Parameter müssen auch vor dem Aufruf sinnvoll belegt sein, da die vorherigen Werte intern benötigt werden.
"out" den Parameter-Variablen muss vor dem Aufruf nichts zugewiesen werden.

Die ganzen Rückgabewerte gehören doch zusammen und bilden ein fachliches Object. Warum dann nicht auch eine Klasse benutzen oder zumindst einen Record?
Delphi-Quellcode:
type
  TKundeRec = record
    Nummer,
    Name1,
    Name2,
    Strasse,
    Land,
    PLZ,
    Ort,
    Telefax,
    Email,
    Vertreter,
    RnEmail: String
  end;

  procedure TUKunden.FirstKundenSuchen(const KundenNummer: String; out Kunde: TKundeRec);
  {oder}
  function TUKunden.FirstKundenSuchen(const KundenNummer: String): TKundeRec;
Deine Klasse heist "TUKunden" und hat direkten Zugriff auf alle internen Felder und Objekte.
Die Variable "UKunden" ist vermutlich eine globale Variable die dich innerhalb der Klasse überhaupt nicht interessiert.
Streich mal überall in der Methode "UKunden.", dann wird das etwas übersichlicher und eine Fehlerquelle ausgeschlossen.

Hast du die Optimierung für das Compilieren angeschalten? Das sollte man nicht wenn man debuggen will.
Das Programm läuft zwar normal, aber der Debugger zeigt dann nicht mehr richtig an.

Vieleicht hast du auch mehrere Variablen die Kundennummer heißen. Eine lokal in der Methode und eine weitere in der Klasse.

ConnorMcLeod 6. Jun 2017 17:01

AW: Variable ist plötzlich anders
 
Zitat:

Zitat von Blup (Beitrag 1373596)
Wenn ein String-Paramerter innerhalb der Methode nicht verändert werden soll, vereinbart man den am besten als "const"-Paramter.

Vollkommen richtig. Ich fände es nur interessant (und korrigierenswert), zu wissen, was passiert ;-)

H.Bothur 6. Jun 2017 17:02

AW: Variable ist plötzlich anders
 
Zitat:

Zitat von stahli (Beitrag 1373593)
Also nochmal gefragt: Du benutzt keinen TThread? (Das wäre ja auch noch ein normales Programm ;-) )

Benutzt Du sonst irgendwo Application.ProcessMessages? Das kann den Programmfluss ggf. auch etwas durcheinander bringen (obwohl vermutlich nicht direkt in der beschriebenen Weise).

Nöö TThread nutze ich nicht .. so wie ich programmiere könnte man das wahrscheinlich auch (bis auf das Grid) in TurboPascal 1.0 oder MS-Basic schreiben - sprich erwarte da von mir eigentlich nichts in Richtung Intelligenz !!

Hans

H.Bothur 6. Jun 2017 17:12

AW: Variable ist plötzlich anders
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1373595)
Delphi-Quellcode:
type
  TUKunden = class(TForm)
  .....
  private
    FKundennummer: string;
    procedure SetKundennummer(const AValue: string);
  public
    property Kundennummer read FKundennummer write SetKundennummer;
  end;

implementation

.....

procedure TUKunden.SetKundennummer(const AValue: string);
begin
  FKundenummer := AValue; // BREAKPOINT HIER SETZEN
end;
Vor dem eigentlichen Aufruf von
Delphi-Quellcode:
FirstKundenSuchen
dem property Kundennummer den zu suchenden Wert zuweisen und es dann als Parameter mitgeben. Sollte irgendein Event oder Thread die Kundennummer einstweilen verändern, dann stehst Du beim Breakpoint und kannst den Callstack untersuchen.

HTH (hope that helps)

Danke - leider noch nicht - wenn ich das so mache dann bekomme ich hier:
Delphi-Quellcode:
    property Kundennummer read FKundennummer write SetKundennummer;
[dcc32 Fehler] KundenUnit.pas(22): E2147 Eigenschaft 'Kundennummer' existiert nicht in Basisklasse :-(

Ich habe den Aufruf dann so geändert:
Delphi-Quellcode:
procedure TUKunden.FirstKundenSuchen(KundenNummer: String; var KName1, KName2, KStrasse, KLand, KPLZ, KOrt, KTelefax, KEmail, KVertreter, KRnEmail: String);
begin
  FKundenNummer := KundenNummer
  1Suche(KundenNummer: String; var KName1, KName2, KStrasse, KLand, KPLZ, KOrt, KTelefax, KEmail, KVertreter, KRnEmail: String);
end;
Ist jetzt zwar etwas krampfig - aber geht das dann so ??

Hans

SneakyBagels 6. Jun 2017 17:17

AW: Variable ist plötzlich anders
 
Delphi-Quellcode:
 if (KundenNummer = UKunden.KundenSpeicherSG.Cells[CKundenNr, i]) then [COLOR="Red"]// <- hier wird nach Kundennummer 12652 gesucht[/COLOR]
    begin
      if (UKunden.KundenSpeicherSG.Cells[CKundenRNAnschrift, i] = (UKunden.KundenSpeicherSG.Cells[CKundenLfdNr, i])) then [COLOR="Red"]// -< und hier ist der Inhalt von KundenNummer plötzlich 14109[/COLOR]
bzgl: <- hier wird nach Kundennummer 12652 gesucht
das verstehe ich ja noch, da du "Kundennummer" vergleichst

bzgl: -< und hier ist der Inhalt von KundenNummer plötzlich
das verstehe ich nicht. Wie kann "Kundenummer" in einer Zeile plötzlich einen anderen Wert haben, wenn du "Kundennummer" gar nicht vergleichst?

bra 6. Jun 2017 17:22

AW: Variable ist plötzlich anders
 
Kann es sein, dass in der Basisklasse "KundenNummer" einen Getter hat, der den Inhalt verändert oder ist Kundennummer selbst eine procedure? Was passiert, wenn du in einer Routine einfach ein paarmal hintereinander "KundenNummer" abfragst, ohne noch was anderes zwischendrin zu machen, ändert sich dann der Rückgabewert auch?

SneakyBagels 6. Jun 2017 17:24

AW: Variable ist plötzlich anders
 
Oder zum Test "Kundenummer" im Prozedurkopf einfach mal nach "AKundenNummer123" oder irgendeinen Quatsch umbenennen der definitiv nirgendwo anders existiert.

H.Bothur 6. Jun 2017 17:26

AW: Variable ist plötzlich anders
 
Zitat:

Zitat von Blup (Beitrag 1373596)
Wenn ein String-Paramerter innerhalb der Methode nicht verändert werden soll, vereinbart man den am besten als "const"-Paramter.
Delphi-Quellcode:
FirstKundenSuchen(const KundenNummer: String{ ...})
Für die Rückgabe kann man zwar "var"-Parameter verwenden, aber eigentlich sollten es hier "out"-Parameter sein.
"var" bedeuted die Parameter müssen auch vor dem Aufruf sinnvoll belegt sein, da die vorherigen Werte intern benötigt werden.
"out" den Parameter-Variablen muss vor dem Aufruf nichts zugewiesen werden.

Oh ... wieder was gelernt ... das kannte ich noch nicht. bringt aber leider keine Änderung (und immer noch keine Exception)

Zitat:

Zitat von Blup (Beitrag 1373596)
Die ganzen Rückgabewerte gehören doch zusammen und bilden ein fachliches Object. Warum dann nicht auch eine Klasse benutzen oder zumindst einen Record?

Record bekomme ich hin - Klasse nicht weil ich (trotz mehrerer Anläufe) das Konzept von OOP nicht verstanden habe - und das was ich kann eigentlich für das bisschen was ich mache reicht.

Zitat:

Zitat von Blup (Beitrag 1373596)
Deine Klasse heist "TUKunden" und hat direkten Zugriff auf alle internen Felder und Objekte.
Die Variable "UKunden" ist vermutlich eine globale Variable die dich innerhalb der Klasse überhaupt nicht interessiert.
Streich mal überall in der Methode "UKunden.", dann wird das etwas übersichlicher und eine Fehlerquelle ausgeschlossen.

OK - das mache ich mal - mal sehen was passiert. Da melde ich mich - allerdings hatte ich ab und zu das Thema das bei bestimmten Sachen das geschrieben werden MUSS :-(

Zitat:

Zitat von Blup (Beitrag 1373596)
Hast du die Optimierung für das Compilieren angeschalten? Das sollte man nicht wenn man debuggen will.
Das Programm läuft zwar normal, aber der Debugger zeigt dann nicht mehr richtig an.

Nein, habe ich nicht - jedenfalls nicht bewusst. Und debuggen kann ich ja !

Zitat:

Zitat von Blup (Beitrag 1373596)
Vieleicht hast du auch mehrere Variablen die Kundennummer heißen. Eine lokal in der Methode und eine weitere in der Klasse.

Nein - es gibt wirklich nur einmal diese Variable :-(

Hans

*So - heute gibt es keine Rückmeldung mehr - sonst bekomme ich Ärger mit meiner Regierung :-D

H.Bothur 6. Jun 2017 17:27

AW: Variable ist plötzlich anders
 
Zitat:

Zitat von SneakyBagels (Beitrag 1373600)
bzgl: -< und hier ist der Inhalt von KundenNummer plötzlich
das verstehe ich nicht. Wie kann "Kundenummer" in einer Zeile plötzlich einen anderen Wert haben, wenn du "Kundennummer" gar nicht vergleichst?

Das sehe ich im Debugger

Hans


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 Uhr.
Seite 2 von 4     12 34      

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