![]() |
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:
In der Routine ändere ich nicht den Inhalt von KundenNummer.
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; Es wird auch keine andere Routine aufgerufen. Hinweise und Warnungen auf Laufzeitfehler sind eingeschaltet. Hier in ![]() Hans |
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 |
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:
Wobei ... ioch glaube eigentlich nicht das es an dieser Routine liegt :-( Aber wo suchen ??
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; Hans |
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 |
AW: Variable ist plötzlich anders
Läuft das ganze in einem Thread oder gibt es noch eine globale/Klassen-Variable, die KundenNummer heisst?
|
AW: Variable ist plötzlich anders
Ganz normales Programm - und Kundennummer als Variable gibt es auch nur in dieser Routine. :-(
Hans |
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 ;-) |
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 |
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 |
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). |
AW: Variable ist plötzlich anders
Delphi-Quellcode:
Vor dem eigentlichen Aufruf von
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;
Delphi-Quellcode:
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.
FirstKundenSuchen
HTH (hope that helps) |
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:
Für die Rückgabe kann man zwar "var"-Parameter verwenden, aber eigentlich sollten es hier "out"-Parameter sein.
FirstKundenSuchen(const KundenNummer: String{ ...})
. "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:
Deine Klasse heist "TUKunden" und hat direkten Zugriff auf alle internen Felder und Objekte.
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; 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. |
AW: Variable ist plötzlich anders
Zitat:
|
AW: Variable ist plötzlich anders
Zitat:
Hans |
AW: Variable ist plötzlich anders
Zitat:
Delphi-Quellcode:
[dcc32 Fehler] KundenUnit.pas(22): E2147 Eigenschaft 'Kundennummer' existiert nicht in Basisklasse :-(
property Kundennummer read FKundennummer write SetKundennummer;
Ich habe den Aufruf dann so geändert:
Delphi-Quellcode:
Ist jetzt zwar etwas krampfig - aber geht das dann so ??
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; Hans |
AW: Variable ist plötzlich anders
Delphi-Quellcode:
bzgl: <- hier wird nach Kundennummer 12652 gesucht
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] 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? |
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?
|
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.
|
AW: Variable ist plötzlich anders
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Hans *So - heute gibt es keine Rückmeldung mehr - sonst bekomme ich Ärger mit meiner Regierung :-D |
AW: Variable ist plötzlich anders
Zitat:
Hans |
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:
Zitat:
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. |
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. |
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) |
AW: Variable ist plötzlich anders
Zitat:
|
AW: Variable ist plötzlich anders
Zitat:
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. |
AW: Variable ist plötzlich anders
Zitat:
|
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:
Die beiden Routinen sind überhaupt nicht gleich, es besteht allerhöchstens eine oberflächliche Ähnlichkeit.
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 erste ist Teil einer Klassendefinition, die zweite ist "unabhängig". In der ersten sollten alle UKunden durch self ersetzt werden. Ebenso sollte
Delphi-Quellcode:
durch
procedure TUKunden.FirstKundenSuchen(KundenNummer: String; var....
Delphi-Quellcode:
ersetzt werden.
procedure TUKunden.FirstKundenSuchen(const KundenNummer: String; var....
in der zweiten wird die Laufvariable durch
Delphi-Quellcode:
begrenzt und auf
UKunden.KundenSpeicherSG.RowCount -1
Delphi-Quellcode:
zugegriffen. Das ist zumindest ungewöhnlich. Woher kommt "Stringgrid" ?
StringGrid[1, i]
Gruß K-H P.S. Sind die üblichen Prüfungen (Bereich etc.) aktiviert? |
AW: Variable ist plötzlich anders
Zitat:
Ich schreib morgen zu dem ganzen anderen Rest und teste mal die verschiedenen Tips aus ! Gruß und Gute Nacht Hans |
AW: Variable ist plötzlich anders
Zitat:
Delphi-Quellcode:
gar nicht schreiben ?
procedure IchTuWas(XYZ: String);
Wie dem auch sei - das habe ich entsprechend umgesetzt und alle Aufrufe entsprechend gemacht. |
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: ![]() |
AW: Variable ist plötzlich anders
So .. ganz viele Anworten auf einmal :-)
Zitat:
Zitat:
Delphi-Quellcode:
if KundenNummer = '12652' then
begin beep; end; Zitat:
Zitat:
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 |
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 |
AW: Variable ist plötzlich anders
Zitat:
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. |
AW: Variable ist plötzlich anders
Zitat:
Hans |
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 |
AW: Variable ist plötzlich anders
Zitat:
Zitat:
|
AW: Variable ist plötzlich anders
[QUOTE=SneakyBagels;1373658]
Zitat:
Ob das allerdings dann noch was bringt, ist eine andere Frage. Schließlich hast du eine (lokale) Deklaration und eine Zuweisung mehr. Zitat:
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 12:23 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