Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array ohne typ, aber wie ? (https://www.delphipraxis.net/26936-array-ohne-typ-aber-wie.html)

mimi 1. Aug 2004 11:18


Array ohne typ, aber wie ?
 
Hallo,
ich habe mehre array unterschiedlichen typs und nun möchte ich gerne eine funktion haben die mit allen typen was anfangen kann in etwa so:

procedure DeleteArrayItem(Liste: array of) // aber das geht ja leider nicht :(

hat jemmand eine idee ???

meine derzeitige delete funktion sieht so aus:
Delphi-Quellcode:
procedure TBO.DeleteBall(Index:Integer);
var
  i:Integer;
begin
  if Length(ball) -1 >= 1 then begin
    for i:=Index to HIGH(BALL) do
      BALL[i]:=BALL[i+1];
    SetLength(BALL,Length(ball)-1 );
  end;
end;

mirage228 1. Aug 2004 11:19

Re: Array ohne typ, aber wie ?
 
Zitat:

Zitat von mimi
Hallo,
ich habe mehre array unterschiedlichen typs und nun möchte ich gerne eine funktion haben die mit allen typen was anfangen kann in etwa so:

procedure DeleteArrayItem(Liste: array of) // aber das geht ja leider nicht :(

hat jemmand eine idee ???

meine derzeitige delete funktion sieht so aus:
Delphi-Quellcode:
procedure TBO.DeleteBall(Index:Integer);
var
  i:Integer;
begin
  if Length(ball) -1 >= 1 then begin
    for i:=Index to HIGH(BALL) do
      BALL[i]:=BALL[i+1];
    SetLength(BALL,Length(ball)-1 );
  end;
end;

Hi,

versuch mal
Delphi-Quellcode:
array of const
mfG
mirage228

yankee 1. Aug 2004 11:34

Re: Array ohne typ, aber wie ?
 
schreib' in den Type Beriech:
TStringDynArray = array of string;
Und dann nimm Als Variablentyp TStringDynArray

Phoenix 1. Aug 2004 11:35

Re: Array ohne typ, aber wie ?
 
Schonmal den Typ Variant angeguckt?
Mit einem Array of Variant kannst Du so ziemlich alles machen.

mimi 1. Aug 2004 12:02

Re: Array ohne typ, aber wie ?
 
ist der typ dann egal ???

Hansa 1. Aug 2004 12:25

Re: Array ohne typ, aber wie ?
 
Wenn Du das gleich richtig machen willst 8) dann verwende verkettete dynamische Listen. Damit geht das garantiert. :P

Chewie 1. Aug 2004 13:06

Re: Array ohne typ, aber wie ?
 
Zitat:

Zitat von Hansa
Wenn Du das gleich richtig machen willst 8) dann verwende verkettete dynamische Listen. Damit geht das garantiert. :P

Bei Listen muss genauso ein Typ angegeben werden.

ripper8472 1. Aug 2004 15:02

Re: Array ohne typ, aber wie ?
 
"Array of Pointer", und die pointer dann auf dynamisch angelegte Variablen.
Ich hab zwar nicht direkt im Kopf, wie ich dynamisch Speicher anfordern kann, aber so würd ich's in C machen. Statt nem Array geht natürlich auch ne (verkettete) Listenklasse.
[edit] natürlich sind dann Typecasts unumgänglich

Union 1. Aug 2004 15:27

Re: Array ohne typ, aber wie ?
 
Zitat:

Zitat von mimi
Hallo,
ich habe mehre array unterschiedlichen typs und nun möchte ich gerne eine funktion haben die mit allen typen was anfangen kann in etwa so:

procedure DeleteArrayItem(Liste: array of) // aber das geht ja leider nicht :(

hat jemmand eine idee ???

meine derzeitige delete funktion sieht so aus:
Delphi-Quellcode:
procedure TBO.DeleteBall(Index:Integer);
var
  i:Integer;
begin
  if Length(ball) -1 >= 1 then begin
    for i:=Index to HIGH(BALL) do
      BALL[i]:=BALL[i+1];
    SetLength(BALL,Length(ball)-1 );
  end;
end;

Machs mit Varianten-Arrays

Delphi-Quellcode:
// Deklaration
var Ball : Array of Variant;

// Konstante Zuweisung
Ball := VarArrayOf([1, "Zwei", now]);

// Abfrage der Werte
if VarType(Ball[i]) = varString then...
Ansonsten sind das normale dynamische Arrays (SetLengtht usw.) Schau mal in der Hilfe unter dem Stichwort VarType nach, da bekommst Du alles aufgelistet.

mimi 22. Aug 2004 12:17

Re: Array ohne typ, aber wie ?
 
ich habs jetzt so gemacht:
Delphi-Quellcode:
procedure DeleteArrayItem(liste:array of Variant; Index:Integer);
var
  i:Integer;
begin
  if Length(liste) -1 >= 1 then begin
    for i:=Index to HIGH(liste) do
      liste[i]:=liste[i+1];
    SetLength(liste,Length(liste)-1 );
  end;
end;
aber egal wie ich es mache: schreibe ich z.b. array of const bekomme ich immer den gleichen fehler bei setLength:[Fehler] Tools.pas(87): Inkompatible Typen

woran liegt das ????? was mache ich falsch !

SirThornberry 22. Aug 2004 12:34

Re: Array ohne typ, aber wie ?
 
ich würde einfach verkettete Listen nehmen.
Delphi-Quellcode:
procedure DeleteArrayItem(liste:TList; Index:Integer);
begin
  if Liste.count -1 >= 1 then
  begin
    dispose(Liste.Items[Index]);
    Liste.Delete(Index);
  end;
end;

mimi 22. Aug 2004 12:51

Re: Array ohne typ, aber wie ?
 
ich wollte eigentlich nicht TList benutzen, sondern einfach nur ein array of

Jens Schumann 22. Aug 2004 13:07

Re: Array ohne typ, aber wie ?
 
Zitat:

Zitat von mimi
ich wollte eigentlich nicht TList benutzen, sondern einfach nur ein array of

Warum möchtest Du nicht TList verwenden? Gibt es dafür einen Grund?
TList ist genau das was Du brauchst.

mimi 22. Aug 2004 13:13

Re: Array ohne typ, aber wie ?
 
nein ein grund gibst dafür nicht !!!(auser das ich damit noch nie garbeitet habe )

ich möchte es halt nicht, es muss doch auch mit arras gehen..... nur wenn es wirklich nicht mit array geht werde ich auf eine TList zurückgreifen

Jens Schumann 22. Aug 2004 13:16

Re: Array ohne typ, aber wie ?
 
Zitat:

Zitat von mimi
nein ein grund gibst dafür nicht !!!(auser das ich damit noch nie garbeitet habe )

ich möchte es halt nicht, es muss doch auch mit arras gehen..... nur wenn es wirklich nicht mit array geht werde ich auf eine TList zurückgreifen

Da sollest gar nicht erst mit anfangen.

Ich empfehle Dir TList zu verwenden.

Array's verwende ich eigentlich gar nicht mehr.

dizzy 22. Aug 2004 14:56

Re: Array ohne typ, aber wie ?
 
Alternativ geht evtl. auch ein array of TObject, und dann die arrays bei der Übergabe casten. Habs bisher nur mit einem einzelnen TObject gemacht, aber möglicherweise geht's auch mit einem array :gruebel:

\\edit: Ist im Wesentlichen wie die Lösung mit dem array of Pointer, nur dass der Pointer hier typisiert ist...

Nothine 22. Aug 2004 21:09

Re: Array ohne typ, aber wie ?
 
Zitat:

Zitat von Jens Schumann
Zitat:

Zitat von mimi
nein ein grund gibst dafür nicht !!!(auser das ich damit noch nie garbeitet habe )

ich möchte es halt nicht, es muss doch auch mit arras gehen..... nur wenn es wirklich nicht mit array geht werde ich auf eine TList zurückgreifen

Da sollest gar nicht erst mit anfangen.

Ich empfehle Dir TList zu verwenden.

Array's verwende ich eigentlich gar nicht mehr.

zu letzterem deiner Sätze könnte man aber auch "da solltest gar nicht erst mit anfangen" sagen, schließlich ist es für mimi unerheblich was du zu pflegen tust oder auch nicht zu pflegen tust, denn es gibt (fast) immer mehrere Lösungsansätze.

@ripper8472:
Zitat:

function AllocMem(Size: Cardinal): Pointer;

Beschreibung
AllocMem weist einen Speicherbereich der angegebenen Größe auf dem Heap zu. Dabei wird jedes Byte des Blocks auf Null gesetzt. Mit FreeMem kann der Puffer wieder freigegeben werden.
@mimi: wozu möchtest du diese Routine denn schreiben? willst du nur ne virtuelle Prozedur damit du sie schlichtweg bei jedem array anwenden kannst oder hast du schon ne konkrete Vorstellung? wenn du nur 'ne virtuelle Routine erstellen willst würde ich auch mal TList empfehlen, einfach weil die entsprechenden Methoden dann nicht nochmal von dir neugeschrieben werden müssten, als Beispiel das zuweisen von Speicher, weswegen Delphi die Methode SetLength auch nicht auf array of Pointer anwenden kann, da ein Pointer eine variable Speichergröße hat.

mimi 16. Apr 2005 08:50

Re: Array ohne typ, aber wie ?
 
etwas spät, aber ich habe den Trehd aus den Augen verloren tut mir leid.
Das Problem habe ich immer noch.
ich wollte damit eine lösch procedure schreiben.
Sie soll einen eintrag aus einem Array löschen egal welche typ dieser Array hat...

malo 16. Apr 2005 08:54

Re: Array ohne typ, aber wie ?
 
Zitat:

Zitat von mimi
etwas spät, aber ich habe den Trehd aus den Augen verloren tut mir leid.
Das Problem habe ich immer noch.
ich wollte damit eine lösch procedure schreiben.
Sie soll einen eintrag aus einem Array löschen egal welche typ dieser Array hat...

:lol:

Wirklich passend... Schau mal hier ;)




hier gibt es übrigens eine fertige Lösch-Prozedur, du kannst die ja mal versuchen ;)

Nicodius 16. Apr 2005 09:09

Re: Array ohne typ, aber wie ?
 
override schon probiert?

mimi 16. Apr 2005 12:54

Re: Array ohne typ, aber wie ?
 
Zitat:

override schon probiert?
dann muss ich ja für jeden array typ eine einige funktion schreiben.

@malo
habe mir mal die zwei lings angeschaut:
in den einen wird gesagt das es nicht geht, aber wie macht es denn borland ?
z.b. bei SetLenght ? dort wird nur ein array erwartet aber der typ ist egal....
es gibt noch andere funktionen z.b. High,usw

Robert_G 16. Apr 2005 13:06

Re: Array ohne typ, aber wie ?
 
Zitat:

Zitat von mimi
Zitat:

override schon probiert?
dann muss ich ja für jeden array typ eine einige funktion schreiben.

Mit overrides lässt sich das sicherlich NICHT lösen.
Eine überschreibende Methode muss ja die gleiche signatur wie die überschriebene haben. Falls malo overload meinte, wären wir wieder beimAusgangsproblem. :mrgreen:

Zitat:

Zitat von mimi
...aber wie macht es denn borland ?
z.b. bei SetLenght ? dort wird nur ein array erwartet aber der typ ist egal....
es gibt noch andere funktionen z.b. High,usw

Schaue mal in die System.pas (falls du die Sources hast ;) ) dort findest du eine _LStrSetLength, _WStrSetLength, _DynArraySetLength, ... .
Das ganze wird gerne als Compiler magic bezeichnet. Denn der Compiler wählt die richtige Funktion aus und auch in der wird er ein paar nur mit Pointern um sich werfen. ;)

Ich glaube mit einem Array, der hinter einer TList-Ableitung versteckt ist sollte es problemlos funktionieren.
Es gibt IMHO sowieso nur wenige Situationen in denen "nackte" Arrays sinnvoll sind. ;)

malo 16. Apr 2005 13:07

Re: Array ohne typ, aber wie ?
 
Zitat:

Zitat von mimi
Zitat:

override schon probiert?
dann muss ich ja für jeden array typ eine einige funktion schreiben.

@malo
habe mir mal die zwei lings angeschaut:
in den einen wird gesagt das es nicht geht, aber wie macht es denn borland ?
z.b. bei SetLenght ? dort wird nur ein array erwartet aber der typ ist egal....
es gibt noch andere funktionen z.b. High,usw

Assembler ;)

Im 2. link ist ja eine Funktion gepostet worden. Setlength oder High werden wohl ähnlich aussehen. Ansonsten gibt es noch die Möglichkeit von überladenen Methoden ;)

mimi 16. Apr 2005 15:17

Re: Array ohne typ, aber wie ?
 
@malo
wenn ich z.b ein spiel schreibe, sind die array wo die objekte drin sind immer andres defniert, und ich möchte nunmal nicht immer bei jedem neuen array eine neue löschfunktion schreiben.
(überlande funk/proc));

@Robert_G
nein ich habe denn qullcode der System.pas nicht(habe D7PE)
und wie geht das mit Format ?
wenn du z.b. sagt:
Format('Test %s, %d,[str,int]);
dann wird ein string erwartet und ein integer. woher weiß der complier dann die richtige funktion ?
Borland kann doch nicht für jede möglickeit eine funktion definiert haben, oder etwa doch ?

Robert_G 16. Apr 2005 15:30

Re: Array ohne typ, aber wie ?
 
Bei Format wird's wohl ein array of const sein. ;)

Nicodius 18. Apr 2005 06:03

Re: Array ohne typ, aber wie ?
 
sry hab mir das ganze vl doch zu wenig durchgelesen :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:25 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