![]() |
Ungültige Zeigeroperation
Hallo und guten Tag,
bei einer Prozedur ist folgender Fehler aufgetreten: UNGÜLTIGE ZEIGEROPERATION
Delphi-Quellcode:
Ich würde mich auf eure Hilfe freuen. Vielen Dank
var
Form4: TForm4; sl,sk:tstringlist; sessio: integer; implementation uses Unit1, unit3; {$R *.dfm} {...} procedure TForm4.Button1Click(Sender: TObject); begin sl.LoadFromFile('.\Market\info.txt'); sk.Loadfromfile('.\Market\lastsession.txt'); sl.Add(''); sl.Add('Einkauf-Nr.: ' + sk.strings[0]); sl.add(''); sl.Add('Produkte:'); sl.add(''); sl.Addstrings(Form1.Listbox2.Items); sl.add(''); sl.add('Total: ' + Floattostrf(priz, ffcurrency, 4, 2)); sl.Add('Give: ' + Floattostrf(money, ffcurrency, 4, 2)); sl.Add('Back: ' + Floattostrf(money-priz, ffcurrency, 4, 2)); sl.Add(''); sl.Add('Vielen Dank f�r Ihren Einkauf!!!'); sl.Add(''); sessio:=(Strtoint(sk.strings[0])+1); sk.free; sk.add(inttostr(sessio)); sl.SaveToFile('.\Market\Bon\' + sk.strings[0] + '.txt'); sk.savetofile('.\Market\lastsession.txt'); sl.Free; sk.free; end; |
AW: Ungültige Zeigeroperation
wie wäre es mit
Delphi-Quellcode:
SL := tStringList.Create;
SK := tStringList.Create; |
AW: Ungültige Zeigeroperation
weil heut Silvester: (und die Antwort zuvor mit deinen Zeilen leider immer noch nicht funktioniert)
Tip 1: erzeuge selbst keine globalen Variablen (sl,sk:tstringlist; sessio: integer;) Tip 2: gehe ALLE mitgelieferten VCL-Beispiele von Delphi durch und suche dir da etwas, was deiner "GUI" und deiner "Funktion" am nächsten kommt Tip 3: - lerne den Unterschied in der Benutzung zwischen stets dynamischen Objekten (...:T???) und staiischen Typen(...:integer) - denke sehr intensiv über das von dir wohl derzeit zufällig hingeschriebene ".Free" nach, und erkenne was alles fehlt und wo das fehlende hingehört Tip 4: es gibt sowas wie Debugger, womit du einzen Zeile für Zeile abarbeiten kannst... dann weißt du erstens wo ein erstmalig Fehler auftritt(heißt nicht, dass das/dort die Ursache ist) |
AW: Ungültige Zeigeroperation
Zitat:
Wie mensch72 sagt, sollte man auf globale Variablen verzichten. Noch ein Zusatz: try..finally..end. Zitat:
|
AW: Ungültige Zeigeroperation
..."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 |
AW: Ungültige Zeigeroperation
Danke für eure Tipps...
Ich werde es mit TMemo versuchen... |
AW: Ungültige Zeigeroperation
Vielleicht erklärst du uns mal, was du machen willst. Ob ein Memo besser ist, als die Stringlisten?
Was mir noch aufgefallen ist:
Delphi-Quellcode:
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.
sl.Add('Einkauf-Nr.: ' + sk.strings[0]);
Das oben erwähnte try except würde hier auch Infos geben, wie auch das Debuggen mittels Debugger.
Delphi-Quellcode:
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.
sessio:=(Strtoint(sk.strings[0])+1);
|
AW: Ungültige Zeigeroperation
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... |
AW: Ungültige Zeigeroperation
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); |
AW: Ungültige Zeigeroperation
Hallöle...8-)
Zitat:
Wie die anderen schon erwähnten, fehlen dir die wichtigsten Grundlagen. Um zu Helfen sind wir ja da. :thumb: Du solltest diesen Link komplett durcharbeiten: Crashkurs: ![]() Weitere: Tutorials: ![]() Debugging lernen: ![]() Anmerkungen zu deinem Quelltext: 1. Wichtig: Den Delphi StyleGuide benutzen. ![]() 2. Sprechende Namen verwenden. (keine Abkürzungen). In 2 Monaten weißt du nicht mehr was die Abkürzungen bedeuten. :wink: (Erfahrung) 3. Formatierung nach dem StyleGuide einhalten. Automatische Formatierung im Delphi ... Standard STRG + D 4. Vermeidung globaler Variablen ... sprich keine. :wink: 5. KISS ![]() 6. DRY ![]() 7. Delphi - Referenz als Hilfe verwenden ![]() ...als Suchmaschine in den Browser integrieren. :thumb: 8. Bitte kein Denglisch :wink: Programmierung vorzugsweise Englisch. Vorschlag: ...versuche mal den Code zeilenweise zu analysieren. :wink:
Delphi-Quellcode:
:wink:
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. |
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