Stress mit Record aber warum?
Hi Leute ha irgend einen banalen Fehler, kann ihn aber ned finden :oops: Ich will was in ein Record speicher un bekomme immer ein EA
Hier mein Code.... soll ein Test sein, eigentlich will ich nen Rückgabewert drin speichern, aber selbst mit "test" funzt es ned:
Delphi-Quellcode:
Würde mich über Hilfe freuen :)
type
THistoryData = record FileName: string; OldSize, NewSize: int64; end; var HistoryData: Array of THistoryData; . . . HistoryData[i].Filename := 'test'; |
Re: Stress mit Record aber warum?
hast du des array groß genug?
(arrays fangen beim index 0 an) |
Re: Stress mit Record aber warum?
ja dadran liegts nicht habs auch mal nur von 0-1 und von 1-2 zählen lassen, bringt alles nix :(
|
Re: Stress mit Record aber warum?
:hi:
Welche Größe hat denn 'i'? Ist dort überhaupt ein Wert gespeichert, sprich <>nil? |
Re: Stress mit Record aber warum?
Hast du mit SetLength denn überhaupt Speicher reserviert.
|
Re: Stress mit Record aber warum?
Zitat:
Zitat:
|
Re: Stress mit Record aber warum?
Zitat:
Dynamische Arrays Zitat:
|
Re: Stress mit Record aber warum?
die länge ist variabel. allerdings musst immer noch speicher reservieren. und mit setlength sagst du wie viel.
|
Re: Stress mit Record aber warum?
Zitat:
Die Indizierung beginnt bei dynamischen Arrays überigens bei 0. |
Re: Stress mit Record aber warum?
ich hab jetzt vor der for-Schleife folgendes stehen:
Delphi-Quellcode:
Jetzt bekomme ich die Meldung: "Im Projekt ... ist eine Exception der Klasse EInvalidPointer ... 'Ungültige Zeigeroperation' aufgetreten.!
setLength(HistoryData,20);
Un nu? |
Re: Stress mit Record aber warum?
Zitat:
greifst du irgendwo auf einen ungültigen bereich zu? alles was keinen index zwischen 0 und 19 hat weist ins nirvana und schmeißt nen fehler. |
Re: Stress mit Record aber warum?
Wie gesagt, ich mache nur das was oben steht. Wenn ich dann die Zeile auskommentiere, in der ich 'test' ins Array schreiben will, ist alles in Butter. :freak:
|
Re: Stress mit Record aber warum?
Hast du überprüft, ob i auch wirklich nur Werte zwischen 0 und 19 annehmen kann?
|
Re: Stress mit Record aber warum?
Delphi-Quellcode:
type
THistoryData = record FileName: string; // oder größe gleich reservieren mit filename: string[50] OldSize, NewSize: int64; end; var HistoryData: array of THistoryData; i: Integer; s: string; begin SetLength(HistoryData, 20); for i := 0 to Length(HistoryData) -1 do HistoryData[i].FileName := Format('Filename #%d', [i]); for i := 0 to Length(HistoryData) -1 do s := s + HistoryData[i].FileName + #13#10; ShowMessage(s); |
Re: Stress mit Record aber warum?
Nicht
Delphi-Quellcode:
sondern
for i := 0 to Length(HistoryData) -1
Delphi-Quellcode:
for i := low(HistoryData) to High(HistoryData)
|
Re: Stress mit Record aber warum?
Alternativ kannst Du acu anstelle des Array eine TList nehmen.
Die hat Methoden zum hinzufügen und löschen von Elementen. Und auch eine Eigenschaft die die Größe der Liste beinhaltet. Der Vollständigkeit halber ergänzt:
Delphi-Quellcode:
erstellen von Einträgen:
type
TForm1 = class(TForm) .... private { Private-Deklarationen } type PHistory = ^THistory THistoryData = record FileName: string; OldSize, NewSize: int64; end; HistoryData : PHistory; HistoryList : TList; public { Public-Deklarationen } end;
Delphi-Quellcode:
Ausgabe von Einträgen:
new(HistoryData);
HistoryData^.FileName:='...'; HistoryList.add(HistoryData);
Delphi-Quellcode:
Löschen der Liste:
for i:=0 to HistoryList.count -1 do
begin HistoryData:=HistoryList.items[i] ShowMessage(HistoryData^.FileName); end;
Delphi-Quellcode:
Grüße
While HistoryList.count > 0 do
begin HistoryData:= HistoryList.items[0]; Dispose(HistoryData); HistoryList.delete(0); end; HistoryList.free; Klaus |
Re: Stress mit Record aber warum?
Zitat:
|
Re: Stress mit Record aber warum?
Das Beispiel von ErazerZ mit Jellys Änderungen funktioniert bei mir ohne Probleme (mal die komplette Unit):
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } type THistoryData = record FileName: string; OldSize, NewSize: int64; end; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var HistoryData: array of THistoryData; i: Integer; s: string; begin SetLength(HistoryData, 20); // Array füllen for i := Low(HistoryData) to High(HistoryData) do HistoryData[i].FileName := 'Hallo'; // Array ausgeben for i := Low(HistoryData) to High(HistoryData) do s := s + HistoryData[i].FileName + #13#10; ShowMessage(s); end; end. |
Re: Stress mit Record aber warum?
Thema erledigt. Danke Leute, dass ihr euch so viel Zeit für meine Unfähigkeit genommen habt :wall: :wiejetzt:
Hab obendrüber in ner Schleife "begin ... end" vergessen, dadurch ist dort was schief gelaufen und hat mir irgendwie alles möglich im Programm versäbelt :idea: DANKE NOCHMAL AN ALLE!!! :cheers: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:57 Uhr. |
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