Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 Uhr.
Seite 3 von 4     123 4      

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