AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ungültige Zeigeroperation

Ein Thema von Fallenzer · begonnen am 31. Dez 2019 · letzter Beitrag vom 1. Jan 2020
Antwort Antwort
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#1

AW: Ungültige Zeigeroperation

  Alt 31. Dez 2019, 21:10
..."Das ist gemein, weil auch Records mit T beginnen"...
=> das ist nicht gemein, sondern zielführend lehrreich!... denn es bedeutet: wenns mit T??? beginnt IMMER Hirn einschalten und bewußt NACHDENKEN!

Auf dem (Einstiegs)Level reicht völlig die Erkenntnis, das man anfangs wie auch künftig NUR "string" oder "integer" in Delphi einfach so nutzen kann
Jetzt schon auf Details und Besonderheiten von SETS,RECORDS,ARRAYS einzugehen, halte ich in Anbedracht des Source schlicht für verfrüht.




...2020...
HappyNewYear
  Mit Zitat antworten Zitat
Fallenzer

Registriert seit: 3. Aug 2019
Ort: Wernigerode, Sachsen-Anhalt, DE
29 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Ungültige Zeigeroperation

  Alt 1. Jan 2020, 09:12
Danke für eure Tipps...

Ich werde es mit TMemo versuchen...
Danilo Bleul (existiert seit 2005)
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.650 Beiträge
 
Delphi 12 Athens
 
#3

AW: Ungültige Zeigeroperation

  Alt 1. Jan 2020, 09:34
Vielleicht erklärst du uns mal, was du machen willst. Ob ein Memo besser ist, als die Stringlisten?

Was mir noch aufgefallen ist:

sl.Add('Einkauf-Nr.: ' + sk.strings[0]); Wenn nun sk leer ist, weil es die Liste nicht gibt? Du solltest erst einmal prüfen, ob es die zu ladende Datei gibt. Dann noch prüfen, ob es den Index[0] auch gibt.
Das oben erwähnte try except würde hier auch Infos geben, wie auch das Debuggen mittels Debugger.

sessio:=(Strtoint(sk.strings[0])+1); Hier nun die Frage, ob sk.strings[0] überhaupt eine Zahl ist. Ansonsten fliegt dir das Programm auch um die Ohren. Ein TryStrToInt wäre hier hilfreich.
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Fallenzer

Registriert seit: 3. Aug 2019
Ort: Wernigerode, Sachsen-Anhalt, DE
29 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Ungültige Zeigeroperation

  Alt 1. Jan 2020, 10:31
Ich habe doch alles geprüft... und sk.strings[0] ist eine Zahl, eine Integerzahl...

Nachdem ich das Programm beendet habe, habe ich nochmal die sämtlichen Textdateien kontrolliert: alles wurde entsprechend dem Code gemacht...

Nur bloß wenn ich auf den Button klicke, kommt der entsprechende Fehler zustande...

...und mit try..finally..end weiß ich auch nicht umzugehen...
Danilo Bleul (existiert seit 2005)
  Mit Zitat antworten Zitat
zeras

Registriert seit: 11. Mär 2007
Ort: Saalkreis
1.650 Beiträge
 
Delphi 12 Athens
 
#5

AW: Ungültige Zeigeroperation

  Alt 1. Jan 2020, 11:22
Dann debugge doch mal. Dann siehst du, wo das Programm den Fehler hat.
Dazu bei "Build-Konfiguration" auf Debug stellen, dann neu compilieren. Dann sieht du links im Quelltext neben der Zeilennummer blaue Punkte, wo man draufklicken kann. Dann wird der Punkt rot und wenn das Programm dann an die Stelle kommt, bleibt es stehen. Dann kannst du mit "F8" die aktuelle Zeile "abarbeiten" und siehst, wann der Fehler kommt.
So schwierig ist ja dein Programm derzeit noch nicht.

Denke auch bitte daran, dass ein eventuelles Leerzeichen beispielweise bei "sk.strings[0]" dir auch das Programm zum Absturz bringt.

Dateien auf Existenz prüft man u.a. mittels FileExists(datei);
Matthias
Es ist nie falsch das Richtige zu tun!
- Mark Twain
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.429 Beiträge
 
Delphi 12 Athens
 
#6

AW: Ungültige Zeigeroperation

  Alt 1. Jan 2020, 11:57
Hallöle...

Zitat:
Nachdem ich das Programm beendet habe, habe ich nochmal die sämtlichen Textdateien kontrolliert: alles wurde entsprechend dem Code gemacht...
...das halte ich für ein Gerücht.

Wie die anderen schon erwähnten, fehlen dir die wichtigsten Grundlagen. Um zu Helfen sind wir ja da.

Du solltest diesen Link komplett durcharbeiten:
Crashkurs: https://www.delphi-treff.de/tutorial...phi-crashkurs/

Weitere:
Tutorials: https://www.delphi-treff.de/tutorials/
Debugging lernen: https://www.delphipraxis.net/41047-t...ortgeschr.html

Anmerkungen zu deinem Quelltext:

1. Wichtig: Den Delphi StyleGuide benutzen. https://www.delphi-treff.de/object-pascal/styleguide/
2. Sprechende Namen verwenden. (keine Abkürzungen). In 2 Monaten weißt du nicht mehr was die Abkürzungen bedeuten. (Erfahrung)
3. Formatierung nach dem StyleGuide einhalten. Automatische Formatierung im Delphi ... Standard STRG + D
4. Vermeidung globaler Variablen ... sprich keine.
5. KISS https://de.wikipedia.org/wiki/KISS-Prinzip
6. DRY https://de.wikipedia.org/wiki/Don%E2...epeat_yourself
7. Delphi - Referenz als Hilfe verwenden https://www.delphipraxis.net/dp_reference.php
...als Suchmaschine in den Browser integrieren.
8. Bitte kein Denglisch Programmierung vorzugsweise Englisch.

Vorschlag:
...versuche mal den Code zeilenweise zu analysieren.
Delphi-Quellcode:
unit FormCash;

interface

uses
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  FormCashOpen, FormCashSave; // sprechende Namen ... was die Forms darstellen :-)

type
  TfoCash = class(TForm)
    btnCash: TButton;
    lstProducts: TListBox;
    procedure btnCashClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    FBonList, FCashList: TStringList;
    FSession: Integer;
    FSumTotal: Currency;
    FMoneyGive: Currency;
  public

  end;

var
  foCash: TfoCash;

implementation

{$R *.dfm}

procedure TfoCash.FormCreate(Sender: TObject);
begin
  FBonList := TStringList.Create;
  FCashList := TStringList.Create;
end;

procedure TfoCash.FormDestroy(Sender: TObject);
begin
  FBonList.Free;
  FCashList.Free;
end;

procedure TfoCash.btnCashClick(Sender: TObject);
begin
  try
    FBonList.LoadFromFile('.\Market\info.txt');
    try
      FCashList.LoadFromFile('.\Market\lastsession.txt');
    except
      // Fehlerbehandlung laden ergänzen
      Exit;
    end;
  except
    // Fehlerbehandlung laden ergänzen
    Exit;
  end;

  FSession := (StrToInt(FCashList[FCashList.Count - 1]) + 1); // neue Nummer (letzte Nummer aus der Liste + 1)

  FBonList.Add('');
  FBonList.Add('Einkauf-Nr.: ' + IntToStr(FSession));
  FBonList.Add('');
  FBonList.Add('Produkte:');
  FBonList.Add('');
  FBonList.AddStrings(lstProducts.Items);
  FBonList.Add('');
  FBonList.Add('Total: ' + FloatToStrF(FSumTotal, ffCurrency, 4, 2));
  FBonList.Add('Gegeben: ' + FloatToStrF(FMoneyGive, ffCurrency, 4, 2)); // Denglish geändert
  FBonList.Add('Rückgeld: ' + FloatToStrF(FMoneyGive - FSumTotal, ffCurrency, 4, 2)); // Denglish geändert
  FBonList.Add('');
  FBonList.Add('Vielen Dank für Ihren Einkauf.'); // !!! bedeuten "komm ja nicht wieder" :-)
  FBonList.Add('');

  try
    FBonList.SaveToFile('.\Market\Bon\' + IntToStr(FSession) + '.txt');
    try
      FCashList.Add(IntToStr(FSession));
      FCashList.SaveToFile('.\Market\lastsession.txt');
    except
      // Fehlerbehandlung speichern ergänzen
    end;
  except
    // Fehlerbehandlung speichern ergänzen
  end;
end;

end.

Geändert von haentschman ( 1. Jan 2020 um 12:04 Uhr)
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Ungültige Zeigeroperation

  Alt 1. Jan 2020, 14:54
Du hast da gleich mehrere Fehler in deinem Code:

1. Die Objekte SK und SL werden niergends erstellt. Sind also beim Zugriff der ersten ZK.xxxx oder ZL.xxx noch nil oder zeigen auf einen nungültigen Memoryberech, weil du da globale Variablen nuzzt. Damit ist eine AV die logische Folge.

2. Du gibst das im unteren Teil des Codes SK frei mit SK.Free. Also danach ist SK ungültig und zeigt auf einen ungülitgen Memorybereich. Eine Zeile später greifst du ber gleich wieder auf diese nun ungültige Objektinstanz zu, was dann zu dem Invalid Pointer führt.

3. Solltest du so Sachen in einem try/finally schützen.

Delphi-Quellcode:
sk := TStringlIst.Create;
sl := TStringlIst.Create;
try
  ... // deine Code, der mit sk arbeitet.
finally
  sk.free; // Am Schluss, wenn du sk/sl nicht mehr benötigst, sk/sl freigeben
  sl.Free;
end;

Geändert von Rolf Frei ( 1. Jan 2020 um 14:57 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 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