[gelöst:] Variable "vergisst" Inhalt

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

[gelöst:] Variable "vergisst" Inhalt

Beitrag von AlterMann »

Hallo

Entweder hab ich Schuppen auf den Augen oder es ist tatsächlich so.
Innerhalb einer Routine vergißt eine globale Variable (Record) Teile ihres Inhaltes. (Ich hab die Stellen mit Kommentaren markiert, die "writeln" dienen nur der Kontrolle)
Einige Felder sind da, andere wieder nicht.

Vielleicht hat jemand eine Idee:

Code: Alles auswählen

procedure TForm1.ToolButton8Click(Sender: TObject);//Einstellplan öffnen
 
 var ft : system.text;
     i,j : word;
 
begin
 if OpenDialog2.Execute then
  begin
 
   system.assign(ft,OpenDialog2.FileName);
   {$I-}
    system.reset(ft);
   {$I+}
    if ioresult <> 0 then
     begin
      ShowMessage('Konnte '+OpenDialog2.FileName+' nicht öffnen');
      exit;
     end;
    Memo1.Clear;
    readln(ft,AktESP.datens.version);
    readln(ft,AktESP.datens.proznu);
    readln(ft,AktESP.datens.nummer);
    writeln('y: ',AktESP.datens.nummer);//Hier weiß er es noch !!!!!!
    readln(ft,AktESP.datens.name);
    readln(ft,AktESP.datens.abstba);
    readln(ft,AktESP.datens.spanndr);
    readln(ft,AktESP.datens.abstreit);
    readln(ft,AktESP.datens.reitdruck);
    readln(ft,AktESP.datens.aussteller);
   for j := 1 to 10 do  readln(ft,AktESP.datens.bemerkung[j]);
    readln(ft,AktESP.datens.date);
    readln(ft,AktESP.datens.ablage);
    readln(ft,AktESP.datens.spannvorr);
    readln(ft,AktESP.datens.backen);
    readln(ft,AktESP.datens.spanndurm);
    readln(ft,AktESP.datens.stkzeit);
    readln(ft,AktESP.datens.rstzeit);
   for j := 1 to 32 do
    begin
      readln(ft,AktESP.tools[j].lrn);
      readln(ft,AktESP.tools[j].negpos);
      readln(ft,AktESP.tools[j].name);
      readln(ft,AktESP.tools[j].comment);
      readln(ft,AktESP.tools[j].identnr);
      readln(ft,AktESP.tools[j].place);
      readln(ft,AktESP.tools[j].number);
      readln(ft,AktESP.tools[j].material);
      readln(ft,AktESP.tools[j].xlong);
      readln(ft,AktESP.tools[j].zlong);
      readln(ft,AktESP.tools[j].cutpoint);
      readln(ft,AktESP.tools[j].radian);
    end;
    system.close(ft);
 
   ESPLoaded := true;
   Label30.Caption := OpenDialog2.FileName;
   Edit2.Text := AktESP.datens.proznu;
   writeln('xxx');
   writeln(AktESP.datens.nummer);//Da hat er es vergessen
   writeln('y: ',AktESP.datens.nummer);
   Edit3.Text := AktESP.datens.nummer;
   writeln(Edit3.Text);
   Edit4.Text := AktESP.datens.name;
   Edit5.Text := AktESP.datens.aussteller;
   Edit6.Text := AktESP.datens.date;
   Edit7.Text := AktESP.datens.ablage;
   ComboBox7.Text := AktESP.datens.spannvorr;
   ComboBox8.Text := AktESP.datens.backen;
   Edit10.Text := AktESP.datens.spanndurm;
   Edit11.Text := AktESP.datens.stkzeit;
   Edit12.Text := AktESP.datens.rstzeit;
   Edit14.Text:=AktESP.datens.abstba;
   Edit15.Text:=AktESP.datens.spanndr;
   Edit16.Text:=AktESP.datens.abstreit;
   Edit17.Text:=AktESP.datens.reitdruck;
   for i := 1 to 10 do
    if AktESP.datens.bemerkung[i] <> '                                                  '
     then Memo1.Lines.Add(AktESP.datens.bemerkung[i]);
   Werkzeuganzeigen(1);
   ESPChanged := false;
  end;
end;
So sieht die Typendeklaration aus:

Code: Alles auswählen

type
 
werkzeug = record
      lrn : string[1];
      negpos : string[3];
      name : string[20];
      comment : string[40];
      identnr : string[10];
      place : string[2];
      number : string[4];
      material : string[5];
      xlong : string[6];
      zlong : string[6];
      cutpoint : string[6];
      radian : string[6];
     end;
 
 daten =  record
   version : string[4];
   proznu : string[5];
   nummer : string[17];
   name : string[20];
   abstba : string[6];
   spanndr : string[6];
   abstreit : string[6];
   reitdruck : string[6];
   aussteller : string[15];
   bemerkung : array[1..10] of string[50];
   date : string[10];
   ablage : string[11];
   spannvorr : string[16];
   backen : string[20];
   spanndurm : string[4];
   stkzeit : string[6];
   rstzeit : string[4];
  end;
 
plattealt =  record
           datens : daten;
           tools  : array[1..32] of werkzeug;
          end;
Danke für's lesen
Christian
Zuletzt geändert von AlterMann am So 28. Mär 2010, 20:22, insgesamt 1-mal geändert.
Früher war alles besser. Und aus Holz!

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: Variable "vergisst" Inhalt

Beitrag von Teekeks »

Hmmm, also ich finde da erstmal keinen Fehler.

Aber noch so als Hinweis:
Typendeklarationen beginnt man Typischer weise mit einem T also aus daten wird TDaten.
Dann kannst du auch in deinem Array das so definieren: daten:TDaten;
Oder hatte das s da einen näheren Hintergrund?

Achso, und wozu das system immer? das brauchst du eigentlich nicht.

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Variable "vergisst" Inhalt

Beitrag von AlterMann »

Teekeks hat geschrieben:Hmmm, also ich finde da erstmal keinen Fehler.

Aber noch so als Hinweis:
Typendeklarationen beginnt man Typischer weise mit einem T also aus daten wird TDaten.
Dann kannst du auch in deinem Array das so definieren: daten:TDaten;
Oder hatte das s da einen näheren Hintergrund?
Die Typendeklaration stammt aus einem Programm welches ich vor gut 20 Jahren in BP geschrieben habe, und dient nur mehr dazu ebenso alte Daten einzulesen.
Sobald alle Daten konvertiert wurden, ist das Geschichte und fliegt aus dem Programm raus, drum passe ich die Form nimmer an.

Teekeks hat geschrieben:Achso, und wozu das system immer? das brauchst du eigentlich nicht.
Eine von den "alten" Funktionen (bin nicht sicher ob es eine Stringmanipulationsroutine (delete, etc ..) oder eine Dateihandlingsfunktion war, machte mir neulich faxen bis ich ein system. davorgesetzt hab. (Anscheinend gibts den Namen in Lazarus doppelt) Nun bin ich vorsichtig und setz das system immer davor. (Bugs produzier ich noch selber genug, da schließ ich solche lieber aus)) :mrgreen:

Zum eigentlichen Problem:
Kann es sein, daß aus irgendeinem Grund die Daten in einem Feld überschrieben werden, wenn ein anderes einen Wert zugewiesen bekommt?
Ich kompilier mit {$R+}.
Wenn ich im Einzelschritt durch die Routine fahre und AktESP.datens.nummer als Ausdruck überwache zeigt er mir die ganze Zeit den richtigen (eingelesenen) Wert an, trotzdem gibt er ihn beim zweiten writeln nicht mehr aus (Und dementsprechend ist auch Edit3 leer)

Grüße
Christian
Früher war alles besser. Und aus Holz!

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: Variable "vergisst" Inhalt

Beitrag von AlterMann »

Das wird immer mysteriöser.

Ich habe alle nachfolgenden "readln" auskommentiert, damit es nicht zu Überschreibungen (warum auch immer) kommen kann.
Änderte nichts, außer daß die Variable AktESP.datens.nummer (lt. Debugger) genau in dieser Zeile seinen Wert vergisst:

Code: Alles auswählen

Edit2.Text := AktESP.datens.proznu;
Jetzt habe ich die Reihenfolge der beiden Anweisungen vertauscht:

Code: Alles auswählen

Label30.Caption := OpenDialog2.FileName;
   Edit3.Text := AktESP.datens.nummer;
   Edit2.Text := AktESP.datens.proznu;
   writeln('xxx');
   writeln(AktESP.datens.nummer);
Und was passiert?
AktESP.datens.proznu vergißt jetzt seinen Wert und zwar genau da:

Code: Alles auswählen

Edit3.Text := AktESP.datens.nummer;
Ich versteh' die Welt nicht mehr ... :shock:
Früher war alles besser. Und aus Holz!

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Variable "vergisst" Inhalt

Beitrag von pluto »

Seltsame Fehler hatte ich bei mir in solchen Fällen nur, wenn ich den Record nicht selbst Installisiert habe. Dann hatte ich auch solche "lustigen" Effekte.
MFG
Michael Springwald

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: [gelöst:] Variable "vergisst" Inhalt

Beitrag von AlterMann »

Die Schuppen waren nicht auf den Augen, sondern eher am Gehirn ... :D

Ich habe an anderer Stelle eine OnChange-Prozedur hinterlassen, die immer wenn sich der Inhalt eines Beteiligten TEdit ändert (der Einfachheit halber) alle TEdits in die zugehörigen Felder des Records schreibt ... :oops:
Wollte mir ein bißchen arbeit sparen indem ich nur eine OnChange-Routine schreibe ... :mrgreen:

Danke für die Antworten
Christian
Früher war alles besser. Und aus Holz!

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: [gelöst:] Variable "vergisst" Inhalt

Beitrag von lrlr »

so nebenbei:

in delphi gibt es "daten-haltepunkte" um so fehler schnell zu finden

gibts das in lazarus auch ??

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: [gelöst:] Variable "vergisst" Inhalt

Beitrag von pluto »

Was sind dann Daten-Halte-Punkte ? Meinst du damit den Debugger ? oder die Möglichkeit Variablen zu überwachen ?
MFG
Michael Springwald

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: [gelöst:] Variable "vergisst" Inhalt

Beitrag von Socke »

pluto hat geschrieben:Was sind dann Daten-Halte-Punkte ? Meinst du damit den Debugger ? oder die Möglichkeit Variablen zu überwachen ?
Ich habe auch keine Ahnung, aber ich denke, das Programm wird angehalten sobald eine Variable geändert wird. Aber ohne Call-Stack bringen viele Haltepunkt auch nichts.
AlterMann hat geschrieben:Ich habe an anderer Stelle eine OnChange-Prozedur hinterlassen, die immer wenn sich der Inhalt eines Beteiligten TEdit ändert (der Einfachheit halber) alle TEdits in die zugehörigen Felder des Records schreibt ... :oops:
Gegen sowas habe ich mir angewöhnt, Variablen immer dort zu deklarieren, wo sie auch gebraucht werden. Globale Variablen kann man mit Pascal zwar auch komplett vermeiden, ist aber nicht oberstes Credo und wird dementsprechend oft praktiziert. Bei Objekt-Variablen, die nur in bestimmten Methoden genutzt werden (und nicht für die Funktionalität der Klasse wichtig sind) gilt entsprechend das gleiche.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: [gelöst:] Variable "vergisst" Inhalt

Beitrag von lrlr »

> aber ich denke, das Programm wird angehalten sobald eine Variable geändert wird. Aber ohne Call-Stack bringen viele Haltepunkt auch
>nichts.

so ist es, und man hat dann (wenn angehalten wurde,) natürlich auch einen call-stack..

AlterMann
Beiträge: 238
Registriert: So 13. Dez 2009, 09:43
OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
CPU-Target: x86 64Bit
Wohnort: Niederösterreich

Re: [gelöst:] Variable "vergisst" Inhalt

Beitrag von AlterMann »

Socke hat geschrieben: Gegen sowas habe ich mir angewöhnt, Variablen immer dort zu deklarieren, wo sie auch gebraucht werden. Globale Variablen kann man mit Pascal zwar auch komplett vermeiden, ist aber nicht oberstes Credo und wird dementsprechend oft praktiziert. Bei Objekt-Variablen, die nur in bestimmten Methoden genutzt werden (und nicht für die Funktionalität der Klasse wichtig sind) gilt entsprechend das gleiche.
In diesem Fall ist es egal ob globale Variable oder Objektvariable, die Inhalte werden an den verschiedensten Stellen gebraucht, das hätte keinen Unterschied gemacht. Mein Problem war, daß ich nicht überlegte, daß ein OnChange-Ereignis abläuft, ich das aber im Debugger nicht sehe. Somit hat sich der Variablennhalt (in meiner Wahrnehmung) geändert, während der Debugger Instruktionen anzeigte die gar nicht auf diese Variablen schreibend zugreifen.
Früher war alles besser. Und aus Holz!

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: [gelöst:] Variable "vergisst" Inhalt

Beitrag von pluto »

Ja, gegenüber der einfachen DOS Programmierung ist dies "Event" Steuerung von den "Morden" GUI'S sehr gewöhnungsbedürftig. Ich lese immer wieder das in einem Auge blick recht viele Event ausgelöst wird. Alleine beim klicken mit der Maus, werden ca minds. drei Events ausgelöst beim Schreiben genau das gleiche.
MFG
Michael Springwald

Antworten