AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Item aus einem dynamischen String-Array löschen

Ein Thema von DieDolly · begonnen am 25. Sep 2018 · letzter Beitrag vom 27. Sep 2018
Antwort Antwort
Seite 1 von 2  1 2   
DieDolly

Registriert seit: 22. Jun 2018
2.173 Beiträge
 
#1

Item aus einem dynamischen String-Array löschen

  Alt 25. Sep 2018, 23:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 26. Sep 2018, 00:34
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#3

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

  Alt 26. Sep 2018, 08:00
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.
Heiko
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.173 Beiträge
 
#4

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

  Alt 26. Sep 2018, 09:18
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
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 ...)

Geändert von DieDolly (26. Sep 2018 um 10:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 26. Sep 2018, 10:06
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...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.173 Beiträge
 
#6

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

  Alt 26. Sep 2018, 10:09
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
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).

Geändert von DieDolly (26. Sep 2018 um 10:25 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.934 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 26. Sep 2018, 10:49
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 26. Sep 2018, 11:01
Die "string-like"-Array-Funktionen ala Insert/Delete/+ wurden erst vor Kurzem eingebaut.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.173 Beiträge
 
#9

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

  Alt 26. Sep 2018, 11:16
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.

Die "string-like"-Array-Funktionen ala Insert/Delete/+ wurden erst vor Kurzem eingebaut.
Meinst du damit TFilterOptions.FilterList.Delete() ?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.014 Beiträge
 
Delphi 12 Athens
 
#10

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

  Alt 26. Sep 2018, 12:29
Neee, Delphi-Referenz durchsuchenSystem.Delete

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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (26. Sep 2018 um 12:32 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:20 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