Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Item aus einem dynamischen String-Array löschen (https://www.delphipraxis.net/198002-item-aus-einem-dynamischen-string-array-loeschen.html)

DieDolly 25. Sep 2018 22:25

Item aus einem dynamischen String-Array löschen
 
Ich habe ein TArray<string> welches ich mit einer Explode-Funktion fülle. Dieser Explode-Funktion übergebe ich eine Zeichenkette ähnlich dieser "C;D;E;".
Ich würde gerne in der Lage sein Anhand eines Index ein Item aus dem Array zu löschen.

Wie bekommt man das am elegantesten hin?

Delete(array, 1, 1) funktioniert leider nicht, da mein Array ein property eines Records ist und der Compiler meckert, dass es ein Konstantenobjekt sei.

Uwe Raabe 25. Sep 2018 23:34

AW: Item aus einem dynamischen String-Array löschen
 
Zitat:

Zitat von DieDolly (Beitrag 1414175)
Delete(array, 1, 1) funktioniert leider nicht, da mein Array ein property eines Records ist und der Compiler meckert, dass es ein Konstantenobjekt sei.

Delete funktioniert mit einem TArray<string> schon. Dein Problem ist hier ein anderes. Wenn du mal etwas Code zeigst, kann man auch einen passenden Vorschlag machen.

hoika 26. Sep 2018 07:00

AW: Item aus einem dynamischen String-Array löschen
 
Hallo,
Zitat:

ein property eines Records
Der Zugriff erfolgt hier immer Read-Only.
Du brauchst eine Procedure im Record, der du den zu löschenden Index übergibst
und dann benutzt Du dort die interne Record-Variable.

DieDolly 26. Sep 2018 08:18

AW: Item aus einem dynamischen String-Array löschen
 
Zitat:

Du brauchst eine Procedure im Record, der du den zu löschenden Index übergibst
Das bekomme ich noch hin.

Teil der Lösung
https://www.delphipraxis.net/1380672-post20.html
Zitat:

Zitat von Zacherl (Beitrag 1380672)
Eine generische Lösung wäre beispielsweise:
Delphi-Quellcode:
class procedure TArrayHelper.Delete<T>(var A: TArray<T>; Index: Integer);
var
  I: Integer;
begin
  for I := Index to High(A) - 1 do
  begin
    A[I] := A[I + 1];
  end;
  SetLength(A, Length(A) - 1);
end;

class procedure TArrayHelper.Insert<T>(var A: TArray<T>; Index: Integer; const Item: T);
var
  I: Integer;
begin
  SetLength(A, Length(A) + 1);
  for I := High(A) - 1 downto Index do
  begin
    A[I + 1] := A[I];
  end;
  A[Index] := Item;
end;

Das steht jetzt in meiner Helper-Unit. Den Zugriff darauf starte ich aus einer Procedure meines Records.

Das steht bei mir aber nicht in einem class helper for TArray sondern in einem normalen Record in einer anderen Unit.
Warum? Weil ich dann nicht in jeder Unit System.Generics.Collections, einbinden muss (TArray ...)

Uwe Raabe 26. Sep 2018 09:06

AW: Item aus einem dynamischen String-Array löschen
 
Also dies funktioniert hier jedenfalls:
Delphi-Quellcode:
program Project425;

{$APPTYPE CONSOLE}

uses
  System.SysUtils;
var
  myArray: TArray<string>;
begin
  myArray := TArray<string>.Create('I''m', 'not', 'amused');
  Delete(myArray, 1, 1);
  Writeln(string.Join(' ', myArray));
  Readln;
end.
Wenn ich jetzt noch wüsste, was bei dir nicht funktioniert...

DieDolly 26. Sep 2018 09:09

AW: Item aus einem dynamischen String-Array löschen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1414178)
Zitat:

Zitat von DieDolly (Beitrag 1414175)
Delete(array, 1, 1) funktioniert leider nicht, da mein Array ein property eines Records ist und der Compiler meckert, dass es ein Konstantenobjekt sei.

Delete funktioniert mit einem TArray<string> schon. Dein Problem ist hier ein anderes. Wenn du mal etwas Code zeigst, kann man auch einen passenden Vorschlag machen.

Das Array was ich bearbeiten möchte steht in einem Record einer anderen Unit. Etwa so
Delphi-Quellcode:
type
 TFilterOptions = record
 
 private
  FFilterList: TArray<string>;
 public
  property FilterList: TArray<string> read FFilterList write FilterList;

  procedure LoadFilterList; // Prozedur die die Liste aus einer Datei lädt und in FilterList schreibt

  // NEU
  procedure FilterListDeleteFromArray(const Index: Integer);
 end;

implementation

uses ...

procedure TFilterOptions.FilterListDeleteFromArray(const Index: Integer);
begin
 TArrayHelper.Delete<string>(FFilterList, Index);
end;
Aus einer anderen Unit rufe ich dann auf
Delphi-Quellcode:
TFilterOptions.FilterListDeleteFromArray(1);
Ich habe gerade ein paar Tests durchgeführt und alles funktioniert. Ein netter Nebeneffekt ist, dass ich circa 100 Zeilen Code einsparen konnte (alter, schlechter Code wo ich ständig eine Ini-Datei lade).

Uwe Raabe 26. Sep 2018 09:49

AW: Item aus einem dynamischen String-Array löschen
 
Ich kann leider deine Delphi-Version nicht erkennen. Funktioniert dies bei dir nicht?

Delphi-Quellcode:
procedure TFilterOptions.FilterListDeleteFromArray(const Index: Integer);
begin
  Delete(FFilterList, Index, 1); // alternativ System.Delete(FFilterList, Index, 1)
end;

himitsu 26. Sep 2018 10:01

AW: Item aus einem dynamischen String-Array löschen
 
Die "string-like"-Array-Funktionen ala Insert/Delete/+ wurden erst vor Kurzem eingebaut.

DieDolly 26. Sep 2018 10:16

AW: Item aus einem dynamischen String-Array löschen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1414211)
Ich kann leider deine Delphi-Version nicht erkennen. Funktioniert dies bei dir nicht?

Delphi-Quellcode:
procedure TFilterOptions.FilterListDeleteFromArray(const Index: Integer);
begin
  Delete(FFilterList, Index, 1); // alternativ System.Delete(FFilterList, Index, 1)
end;

Doch das funktioniert. Ich benutze die Community Edition.

Sollte ich hier nun besser Delete() verwenden oder meinen eigenen Wrapper TArrayHelper.Delete<T>()?
Ich bin bisher so verfahren, dass ich meist meine eigenen Wrapper nutze, da ich dort den Aufruf manipulieren kann und so nur eine Änderung vornehmen muss statt an 100 Stellen.

Zitat:

Zitat von himitsu (Beitrag 1414215)
Die "string-like"-Array-Funktionen ala Insert/Delete/+ wurden erst vor Kurzem eingebaut.

Meinst du damit TFilterOptions.FilterList.Delete() ?

himitsu 26. Sep 2018 11:29

AW: Item aus einem dynamischen String-Array löschen
 
Neee, Delphi-Referenz durchsuchenSystem.Delete :zwinker:

Delphi-Quellcode:
ArrayOrString := ArrayOrString1 + ArrayOrString2;
Insert(Value, ArrayOrString, X);
Delete(ArrayOrString, X, Y);
Früher ging das nur mit Strings, weswegen dieses supercoole neue Feature in der What's New auch als "string-like" betitelt wurde.
http://docwiki.embarcadero.com/RADSt...Dynamic_Arrays


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr.
Seite 1 von 2  1 2      

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