Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynam. Array Speichern,bzw. Laden (https://www.delphipraxis.net/64985-dynam-array-speichern-bzw-laden.html)

Hallo_Thomas 10. Mär 2006 19:48

Re: Dynam. Array Speichern,bzw. Laden
 
@Grishnak

Hab hier ebenfalls eine Zugriffsverletzung

Delphi-Quellcode:
    if Execute then
    begin
     len:=Length(MyListe);
     FS.WriteBuffer(len, SizeOf(len));
     TRY
      for i:=0 to len-1 do
      FS.WriteBuffer(MyListe[i], SizeOf(Byte));
     finally

marabu 10. Mär 2006 20:13

Re: Dynam. Array Speichern,bzw. Laden
 
Hallo Thomas,

dein Programm musst du selbst anpassen, aber hier zwei Routinen, die ein dynamisches Byte-Array aus einer Datei laden und in eine Datei speichern. Vielleicht hilft es dir zu verstehen:

Delphi-Quellcode:
uses
  Types;

procedure ArrayLoad(var bda: TByteDynArray; fn: TFileName);
begin
  with TFileStream.Create(fn, fmOpenRead + fmShareDenyWrite) do
  begin
    SetLength(bda, Size);
    ReadBuffer(bda[0], Length(bda));
    Free;
  end;
end;

procedure ArraySave(bda: TByteDynArray; fn: TFileName);
begin
  with TFileStream.Create(fn, fmCreate) do
  begin
    WriteBuffer(bda[0], Length(bda));
    Free;
  end;
end;
Freundliche Grüße vom marabu

Hallo_Thomas 10. Mär 2006 21:08

Re: Dynam. Array Speichern,bzw. Laden
 
@marabu

Perfekt, sogar Read funkt ausgezeichnet

Hallo_Thomas 10. Mär 2006 23:16

Re: Dynam. Array Speichern,bzw. Laden
 
Ich weis zwar, das es fast ein neues Thema ist, aber ich willsr aufgrund meiner Speicher-Laden Problematik hier reinschreiben.

Ga ich die Array auch mah kürzen muss, wollte ich .Free verwenden. Doch irgendwie will TByteDynArray das ni. Wie bekomme ich das hin
Delphi-Quellcode:
MyArray:TByteDynArray;
MyArray[Index].Free;

Muetze1 10. Mär 2006 23:25

Re: Dynam. Array Speichern,bzw. Laden
 
Das bekommst du genauso hin, wie du es vergrösserst: Mit SetLength(). Damit einfach die neue Grösse setzen. Siehe die Lade-Routine.

Hallo_Thomas 11. Mär 2006 00:00

Re: Dynam. Array Speichern,bzw. Laden
 
Ich hab den Code genommen, das Free musste ich raus nehmen

Delphi-Quellcode:
procedure TForm1.ArrayDelete(MyArray:TByteDynArray;Index: Integer);
var
  i : Integer;
begin
  //MyArray[Index].Free;
  for i := Index to length(MyArray) - 2 do MyArray[i] := MyArray[i + 1];
  setlength(MyArray, length(MyArray) - 1);
end;
Mit Free Fehlermeldung: Record, Objekt oder Klassentyp erforderlich

marabu 11. Mär 2006 06:47

Re: Dynam. Array Speichern,bzw. Laden
 
Hallo Thomas,

hier ein paar Verbesserungsvorschläge zu deiner Prozedur:
  • Was passiert, wenn beim Aufruf ein unsinniger Wert als index übergeben wird?
  • Da die Prozeduren zur Manipulation von Arrays keinen Bezug zur VCL haben, würde ich sie auch nicht als Methoden der Form deklarieren.
  • Die Zahl der zu löschenden Einträge würde ich zum Parameter machen.

Delphi-Quellcode:
// uses Types

procedure ArrayDelete(var bda: TByteDynArray; const index: Cardinal; size: Cardinal = 1);
var
  iTail: Integer;
begin
  if (size = 0) or (index >= Length(bda)) then
    Exit;
  if size > (Length(bda) - index) then
    size := Length(bda) - index;
  iTail := index + size;
  if (iTail < Length(bda)) then
    Move(bda[iTail], bda[index], Length(bda) - iTail);
  SetLength(bda, Length(bda) - size);
end;
Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:35 Uhr.
Seite 2 von 2     12   

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