Delphi-PRAXiS

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)

H.Bothur 6. Jun 2017 15:36

Delphi-Version: 10 Berlin

Variable ist plötzlich anders
 
Sorry - besser kann ich es bnicht beschreiben :-( Ich habe hier ein Stringgrid das einfach von oben nach unten durchgelaufen wird.
Wenn das Feld Kundennummer der übergebenen Kundennummer entspricht soll es, wenn zwei weitere Felder übereinstimmen die Daten ausgeben.
Im Prinzip sehr einfach ... aber plötzlich ist die KundenNummer nach der gesucht wird eine andere:

Delphi-Quellcode:
procedure TUKunden.FirstKundenSuchen(KundenNummer: String; var KName1, KName2, KStrasse, KLand, KPLZ, KOrt, KTelefax, KEmail, KVertreter, KRnEmail: String);
var
  i: Integer;
begin
  for i := 0 to UKunden.KundenSpeicherSG.RowCount -1 do
  begin
    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]
      begin
        KName1 := UKunden.KundenSpeicherSG.Cells[CKundenName1, i];
        KName2 := UKunden.KundenSpeicherSG.Cells[CKundenName2, i];
        KStrasse := UKunden.KundenSpeicherSG.Cells[CKundenStr, i];
        KLand := UKunden.KundenSpeicherSG.Cells[CKundenLand, i];
        KPLZ := UKunden.KundenSpeicherSG.Cells[CKundenPLZ, i];
        KOrt := UKunden.KundenSpeicherSG.Cells[CKundenOrt, i];
        KTelefax := UKunden.KundenSpeicherSG.Cells[CKundenTelefax, i];
        KEmail := UKunden.KundenSpeicherSG.Cells[CKundenEMail, i];
        KVertreter := UKunden.KundenSpeicherSG.Cells[CKundenVertreter, i];
        KRnEmail := UKunden.KundenSpeicherSG.Cells[CKundenRnEMail, i];
        exit;
      end;
    end;
  end;
  KName1 := 'Keine Daten gefunden ! '; (* Kann eigentlich nicht vorkommen :-D *)
end;
In der Routine ändere ich nicht den Inhalt von KundenNummer.
Es wird auch keine andere Routine aufgerufen.
Hinweise und Warnungen auf Laufzeitfehler sind eingeschaltet.

Hier in Debugger-Exceptions hatte ich schonmal "komische" Probleme mit dem Programm - nur wie finde ich den Fehler wenn ich keine Exception bekomme ?

Hans

EWeiss 6. Jun 2017 15:43

AW: Variable ist plötzlich anders
 
fehlen da nicht ein paar else ?

Delphi-Quellcode:
if (KundenNummer = UKunden.KundenSpeicherSG.Cells[CKundenNr, i]) then
  [COLOR="Red"]
end else
begin
.....

if (UKunden.KundenSpeicherSG.Cells[CKundenRNAnschrift, i] = (UKunden.KundenSpeicherSG.Cells[CKundenLfdNr, i])) then
[COLOR="Red"]
end else
begin
....

gruss

H.Bothur 6. Jun 2017 15:56

AW: Variable ist plötzlich anders
 
Moin,

eigentlich ja nicht .... denn entweder er findet Daten (dann greift das Exit) oder er findet nicht und dann läuft er die Schleife komplett durch. Ich hab das ganze nochmal etwas verkürzt:

Delphi-Quellcode:
procedure IchBinKomisch(KundenNummer: String; var Rueckgabewert: String);
var
  i: Integer;

begin
  for i := 0 to UKunden.KundenSpeicherSG.RowCount -1 do
  begin
    if (KundenNummer = StringGrid[1, i]) then
    begin
      if (StringGrid[2, i] = (StringGrid[3, i])) then
      begin
        Rueckgabewert := 'Gefunden';
        exit;
      end;
    end;
  end;
  Rueckgabewert := 'Keine Daten gefunden ! '; (* Kann eigentlich nicht vorkommen :-D *)
end;
Wobei ... ioch glaube eigentlich nicht das es an dieser Routine liegt :-( Aber wo suchen ??

Hans

EWeiss 6. Jun 2017 15:57

AW: Variable ist plötzlich anders
 
ja sorry war Schwachsinn von mir..
Da hilft nur durchsteppen.. also breakpoint setzen und den index "i" prüfen.

gruss

bra 6. Jun 2017 16:09

AW: Variable ist plötzlich anders
 
Läuft das ganze in einem Thread oder gibt es noch eine globale/Klassen-Variable, die KundenNummer heisst?

H.Bothur 6. Jun 2017 16:16

AW: Variable ist plötzlich anders
 
Ganz normales Programm - und Kundennummer als Variable gibt es auch nur in dieser Routine. :-(

Hans

ConnorMcLeod 6. Jun 2017 16:35

AW: Variable ist plötzlich anders
 
Mach aus der Variablen "Kundennummer" ein Property mit Setter und mach einen BreakPoint in den Setter. Dann siehst Du sofort, wer wann was wo warum ändert ;-)

BTW: tut das Not, ein StringGrid als Datenspeicher zu mißbrauchen? Ein Array oder eine Liste wäre eine bessere Trennung von Daten und GUI ;-)

H.Bothur 6. Jun 2017 16:41

AW: Variable ist plötzlich anders
 
Moin,

Danke für die Tipps !!

Zu a) Sorry- kannst Du mir zeigen kurz beschreiben ich das mache ?? Leider kann ich damit nichts anfangen :-(
zu b) Ja - im Moment noch weil ich es so verstehe - eigentlich wollte ich ja wenn das hier läuft das ganze mal mit TTable umsetzen. Aber ich muss das hier erstmal zum laufen bekommen.

Hans

H.Bothur 6. Jun 2017 16:43

AW: Variable ist plötzlich anders
 
Sorry - schon was gefunden wo das beschrieben wird - ich versuche es mal !
Doch nicht :-( Kannst Du mir mal sagen wie ich das machen müsste ?

Danke !

Hans

stahli 6. Jun 2017 16:51

AW: Variable ist plötzlich anders
 
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).

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

himitsu 6. Jun 2017 17:30

AW: Variable ist plötzlich anders
 
Sicher, dass sich der Inhalt ändert, oder zeigt der Debugger nur nicht mehr das Richtige an?
Inhalt manuell irgendwo ausgeben (Logdatei, ShowMessage, ...)

Zitat:

Delphi-Quellcode:
(* Kann eigentlich nicht vorkommen :-D *)

Doch, wenn die Nummer nicht im Grid vorkommt.

Zitat:

Zitat von H.Bothur (Beitrag 1373590)
eigentlich wollte ich ja wenn das hier läuft das ganze mal mit TTable umsetzen.

Wenn es dann läuft, willst du dann erstmal alles erstmal wieder umbauen und kaputt machen?

Statt TTable kannst'e auch ein TClientDataSet (MemoryTable) verwenden, wenn noch keine Datenbank vorhanden ist.
Und schon kannst'e auch schön mit Locate im DataSet suchen lassen.

SneakyBagels 6. Jun 2017 17:32

AW: Variable ist plötzlich anders
 
Dann muss wohl irgendwas mit Kundenummer geschehen. Du sagtest, es gibt die variable nur einmal.
Benenne sie im Prozedurkopf trotzdem mal um und teste das.

Eine andere wahrscheinlich dumme Idee, nur zum testen:
deklariere mal eine lokale string-Variable und weise ihr VOR der for-Schleife "Kundennummer" zu. Du vergleichst dann auf diese neue string-Variable und nicht mehr auf Kundennummer.

himitsu 6. Jun 2017 18:54

AW: Variable ist plötzlich anders
 
Kundennummer ist ein Parameter der Methode,
also selbst wenn jemand zwischendurch außerhalb eine Variable ändert, die zu Beginn an diesen Parameter übergeben wurde, darf sich niemals der Wert dieses Parameters ändern, außer jemand ändert ihn innerhalb dieser Methode, was hier ja angeblich nicht gemacht wird.

Also ein Umkopieren in eine weitere lokale Variable sollte hier nichts bringen, vorallem da es sich am Ende um die selbe String-Referenz handelt.



Einzige Ausnahme für das NIEMALS: BufferOverflow oder Dergleichen. Danach sieht es in dem gezeigten Code aber auch nicht aus.


Änderung innerhalb der Methode könnte man auch mal so ausschließen:
Delphi-Quellcode:
procedure TUKunden.FirstKundenSuchen(const KundenNummer: String; var KName1, ...

Wenn das nichts bringt, dann bleiben nur 2 mögliche Problemstellen.
* der Compiler zeigt etwas Falsches an und das Programm arbeitet dennoch korrekt (prüfen siehe mein vorheriger Post)
* du hast ein massives Speicherproblem und jemand (du) überschreibt irgendwo willkürlich deinen RAM. (aber schon komisch, dass dabei rein zufällig ein "korrekter" String mit einer schönen "Nummer" als Text entsteht)

SneakyBagels 6. Jun 2017 18:55

AW: Variable ist plötzlich anders
 
Zitat:

* der Compiler zeigt etwas falsches an und das Programm arbeitet dennoch korrekt (prüfen siehe mein vorheriger Post)
Ich schlage ganz plump einfach mal vor den Inhalt von "Kundennummer" mit einer Showmessage anzuzeigen.

himitsu 6. Jun 2017 19:06

AW: Variable ist plötzlich anders
 
Zitat:

Zitat von SneakyBagels (Beitrag 1373610)
Zitat:

* der Compiler zeigt etwas falsches an und das Programm arbeitet dennoch korrekt (prüfen siehe mein vorheriger Post)
Ich schlage ganz plump einfach mal vor den Inhalt von "Kundennummer" mit einer Showmessage anzuzeigen.

Hatte ich auch schonmal im ersten Post vorgeschlagen.

Aber gerade aufgrund des Types hätte ich eher erwartet, dass er dann garnichts, bzw. eine Fehlermeldung anzeigt, als rein zufällig einen "anderen" String, den er scheinbar problemlos auslesen konnte.

SneakyBagels 6. Jun 2017 20:23

AW: Variable ist plötzlich anders
 
Zitat:

Hatte ich auch schonmal im ersten Post vorgeschlagen.
Manchmal sind eben die dümmsten Vorgehensweisen die besten. Aber irgendwie habe ich den Eindruck, dass dieser Thread hier wieder ein sich selbst am Leben erhaltender Thread wird.

p80286 6. Jun 2017 20:27

AW: Variable ist plötzlich anders
 
Delphi-Quellcode:
procedure TUKunden.FirstKundenSuchen(KundenNummer: String; var KName1, KName2, KStrasse, KLand, KPLZ, KOrt, KTelefax, KEmail, KVertreter, KRnEmail: String);
var
   i: Integer;
begin
   for i := 0 to UKunden.KundenSpeicherSG.RowCount -1 do
   begin
     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]
       begin
         KName1 := UKunden.KundenSpeicherSG.Cells[CKundenName1, i];
         KName2 := UKunden.KundenSpeicherSG.Cells[CKundenName2, i];
         KStrasse := UKunden.KundenSpeicherSG.Cells[CKundenStr, i];
         KLand := UKunden.KundenSpeicherSG.Cells[CKundenLand, i];
         KPLZ := UKunden.KundenSpeicherSG.Cells[CKundenPLZ, i];
         KOrt := UKunden.KundenSpeicherSG.Cells[CKundenOrt, i];
         KTelefax := UKunden.KundenSpeicherSG.Cells[CKundenTelefax, i];
         KEmail := UKunden.KundenSpeicherSG.Cells[CKundenEMail, i];
         KVertreter := UKunden.KundenSpeicherSG.Cells[CKundenVertreter, i];
         KRnEmail := UKunden.KundenSpeicherSG.Cells[CKundenRnEMail, i];
         exit;
       end;
     end;
   end;
   KName1 := 'Keine Daten gefunden ! '; (* Kann eigentlich nicht vorkommen :-D *)
end;
Delphi-Quellcode:
procedure IchBinKomisch(KundenNummer: String; var Rueckgabewert: String);
var
   i: Integer;

begin
   for i := 0 to UKunden.KundenSpeicherSG.RowCount -1 do
   begin
     if (KundenNummer = StringGrid[1, i]) then
     begin
       if (StringGrid[2, i] = (StringGrid[3, i])) then
       begin
         Rueckgabewert := 'Gefunden';
         exit;
       end;
     end;
   end;
   Rueckgabewert := 'Keine Daten gefunden ! '; (* Kann eigentlich nicht vorkommen :-D *)
end;
Die beiden Routinen sind überhaupt nicht gleich, es besteht allerhöchstens eine oberflächliche Ähnlichkeit.
Die erste ist Teil einer Klassendefinition, die zweite ist "unabhängig".
In der ersten sollten alle UKunden durch self ersetzt werden.
Ebenso sollte
Delphi-Quellcode:
procedure TUKunden.FirstKundenSuchen(KundenNummer: String; var....
durch
Delphi-Quellcode:
procedure TUKunden.FirstKundenSuchen(const KundenNummer: String; var....
ersetzt werden.
in der zweiten wird die Laufvariable durch
Delphi-Quellcode:
UKunden.KundenSpeicherSG.RowCount -1
begrenzt und auf
Delphi-Quellcode:
StringGrid[1, i]
zugegriffen. Das ist zumindest ungewöhnlich. Woher kommt "Stringgrid" ?

Gruß
K-H

P.S.
Sind die üblichen Prüfungen (Bereich etc.) aktiviert?

H.Bothur 6. Jun 2017 20:46

AW: Variable ist plötzlich anders
 
Zitat:

Zitat von SneakyBagels (Beitrag 1373616)
Zitat:

Hatte ich auch schonmal im ersten Post vorgeschlagen.
Manchmal sind eben die dümmsten Vorgehensweisen die besten. Aber irgendwie habe ich den Eindruck, dass dieser Thread hier wieder ein sich selbst am Leben erhaltender Thread wird.

Sorry - wird es nicht - ich bin ja selber an der Lösung interessiert !! Aber manchmal fordert die bessere Hälfte auch ihr Recht - und das war heute unser Dorfgrieche :-D

Ich schreib morgen zu dem ganzen anderen Rest und teste mal die verschiedenen Tips aus !

Gruß und Gute Nacht
Hans

H.Bothur 7. Jun 2017 08:02

AW: Variable ist plötzlich anders
 
Zitat:

Zitat von Blup (Beitrag 1373596)
Wenn ein String-Parameter innerhalb der Methode nicht verändert werden soll, vereinbart man den am besten als "const"-Paramter. ... Für die Rückgabe kann man zwar "var"-Parameter verwenden, aber eigentlich sollten es hier "out"-Parameter sein.

Blöde gefragt - demzufolge sollte man immer entweder const, out oder var in den Methodenkopf schreiben ? Und "schlichte"
Delphi-Quellcode:
procedure IchTuWas(XYZ: String);
gar nicht schreiben ?

Wie dem auch sei - das habe ich entsprechend umgesetzt und alle Aufrufe entsprechend gemacht.

Jasocul 7. Jun 2017 08:28

AW: Variable ist plötzlich anders
 
Mit der Angabe von Const kann der Parameter auch innerhalb der Procedure/Function nicht verändert werden. Außerdem kann der Compiler besser optimieren.

Etwas ausführlicher:
Delphi-Hilfe

H.Bothur 7. Jun 2017 08:58

AW: Variable ist plötzlich anders
 
So .. ganz viele Anworten auf einmal :-)

Zitat:

Zitat von stahli (Beitrag 1373593)
Benutzt Du sonst irgendwo Application.ProcessMessages?

Nee ... nutze ich nicht.

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 und wenn ich entsprechende Stop-Punkte setze. Das mache ich dann immer so:

Delphi-Quellcode:
if KundenNummer = '12652' then
begin
  beep;
end;
Zitat:

Zitat von himitsu (Beitrag 1373605)
Sicher, dass sich der Inhalt ändert, oder zeigt der Debugger nur nicht mehr das Richtige an?
Inhalt manuell irgendwo ausgeben (Logdatei, ShowMessage, ...)

Hab ich gemacht - steht aber leider auch der falsche Wert :-(

Zitat:

Zitat von himitsu (Beitrag 1373609)
Einzige Ausnahme für das NIEMALS: BufferOverflow oder Dergleichen. Danach sieht es in dem gezeigten Code aber auch nicht aus.
du hast ein massives Speicherproblem und jemand (du) überschreibt irgendwo willkürlich deinen RAM. (aber schon komisch, dass dabei rein zufällig ein "korrekter" String mit einer schönen "Nummer" als Text entsteht)

Ich gehe ja auch davon aus ... wobei ich nicht weiß wieso. :-( Aber ich gebe Dir recht das ich das auch komisch finde und immer noch glaube das ich da unwillkürlich einen Overflow generiere der nur keine Exception auslöst. ... ODER ... ich mache schon vorher massiven Murks - was ja auch nicht unwahrscheinlich ist.

Was ich auch noch nicht verstehe ... und vielleicht ergibt das ja den BufferOverflow ... eigentlich dürfte diese Zeile hier gar nicht funktionieren sondern müsste - wenn ich mich nicht täusche - eine Exception auslösen:

Delphi-Quellcode:
MahnForm.OPTabelleSG.Cells[CKundenNummer, MahnForm.OPTabelleSG.RowCount] := Copy(EinleseZeile, 1, Position -1);

Ich kann doch gar nicht in Cells.[1, Grid.RowCount] schreiben ... es müsste eigentlich doch Cells.[1, Grid.RowCount -1] heißen, oder ? Aber warum wird dann keine Exception ausgelöst ??

Hans

H.Bothur 7. Jun 2017 08:59

AW: Variable ist plötzlich anders
 
Ich werde jetzt drei Sachen umsetzen:

1) wo möglich const- und out-Parameter nutzen
2) Die eine Schleife von RowCount auf RowCount -1 setzen
3) Versuchen die TKunden. usw. rausnehmen.

Ich melde mich was dann passiert.

Hans

Jasocul 7. Jun 2017 09:12

AW: Variable ist plötzlich anders
 
Zitat:

Zitat von H.Bothur (Beitrag 1373646)
Ich kann doch gar nicht in Cells.[1, Grid.RowCount] schreiben ... es müsste eigentlich doch Cells.[1, Grid.RowCount -1] heißen, oder ? Aber warum wird dann keine Exception ausgelöst ??

An des Phänomen kann ich mich erinnern. Das geht tatsächlich ohne Exception!
Habe gerade mal eine Mini-Test-Anwendung gebastelt. Es war völlig unproblematisch "außerhalb" des StringGrids Einträge zu machen. Werden natürlich nicht angezeigt.

H.Bothur 7. Jun 2017 09:24

AW: Variable ist plötzlich anders
 
Zitat:

Zitat von Jasocul (Beitrag 1373650)
Zitat:

Zitat von H.Bothur (Beitrag 1373646)
Ich kann doch gar nicht in Cells.[1, Grid.RowCount] schreiben ... es müsste eigentlich doch Cells.[1, Grid.RowCount -1] heißen, oder ? Aber warum wird dann keine Exception ausgelöst ??

An des Phänomen kann ich mich erinnern. Das geht tatsächlich ohne Exception!
Habe gerade mal eine Mini-Test-Anwendung gebastelt. Es war völlig unproblematisch "außerhalb" des StringGrids Einträge zu machen. Werden natürlich nicht angezeigt.

Komisch - gibt es denn den Speicherbereich dann schon oder wird das "wild" irgendwohin geschrieben ??

Hans

H.Bothur 7. Jun 2017 09:25

AW: Variable ist plötzlich anders
 
Aktueller Status: es scheint zu funktionieren ... wir testen das mal weiter und ich melde mich dann noch mal !

Hans

SneakyBagels 7. Jun 2017 09:39

AW: Variable ist plötzlich anders
 
Zitat:

demzufolge sollte man immer entweder const, out oder var in den Methodenkopf schreiben ? Und "schlichte"
Beim Unterbinden von Änderungen innerhalb der Prozedur/Funktion nur const. var und out sind für was anderes.

Zitat:

Mit der Angabe von Const kann der Parameter auch innerhalb der Procedure/Function nicht verändert werden. Außerdem kann der Compiler besser optimieren.
Optimiert der Compiler noch immer so gut, wenn man im Prozedurkopf const verwendet und innerhalb der Prozedur eine neue string-Variable, die man ändern kann?

Jasocul 7. Jun 2017 09:54

AW: Variable ist plötzlich anders
 
[QUOTE=SneakyBagels;1373658]
Zitat:

Zitat:

Mit der Angabe von Const kann der Parameter auch innerhalb der Procedure/Function nicht verändert werden. Außerdem kann der Compiler besser optimieren.
Optimiert der Compiler noch immer so gut, wenn man im Prozedurkopf const verwendet und innerhalb der Prozedur eine neue string-Variable, die man ändern kann?
Natürlich. Die Optimierung bezieht sich ja nur auf den Parameter.
Ob das allerdings dann noch was bringt, ist eine andere Frage. Schließlich hast du eine (lokale) Deklaration und eine Zuweisung mehr.

Zitat:

Zitat von Jasocul (Beitrag 1373650)
Zitat:

Zitat von H.Bothur (Beitrag 1373646)
Ich kann doch gar nicht in Cells.[1, Grid.RowCount] schreiben ... es müsste eigentlich doch Cells.[1, Grid.RowCount -1] heißen, oder ? Aber warum wird dann keine Exception ausgelöst ??

An des Phänomen kann ich mich erinnern. Das geht tatsächlich ohne Exception!
Habe gerade mal eine Mini-Test-Anwendung gebastelt. Es war völlig unproblematisch "außerhalb" des StringGrids Einträge zu machen. Werden natürlich nicht angezeigt.

Das habe ich nie überprüft. Mir ist damals nur aufgefallen, dass ich RowCount einfach hochsetzen konnte und dann die Daten sichtbar wurden. Das habe ich gerade auch noch mal in meiner Test-Anwendung gemacht und einfach und die 9999te Zeile was eingetragen und 10000 Zeilen hinzugefügt. Die Daten waren dann sichtbar.
Mir fehlt aber die Zeit, um jetzt genau zu prüfen, was das TStringGrid macht. Das Ganze kann auch Zufall sein, da ich zwischen diesen Vorgängen keinen neuen Speicher für andere Dinge "verbrauche".


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 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