Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

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 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 02:36 Uhr.
Seite 4 von 4   « Erste     234   

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