Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Array in ShowMessage ausgeben? (https://www.delphipraxis.net/178801-array-showmessage-ausgeben.html)

AlexII 28. Jan 2014 13:51

Array in ShowMessage ausgeben?
 
Hallo,

mir gelingt es nicht ein Array in einer ShowMessage auszugeben, hier der Code:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  a : Array[1..8] of Integer;
  i : Integer;
begin
  for i:=1 to 8 do
    a[i]:= Random(9);
    ShowMessage(IntToStr(a[]));
end;
Was mache ich falsch?

DeddyH 28. Jan 2014 13:52

AW: Array in ShowMessage ausgeben?
 
Wie soll es denn sein, eine Message je Element oder alle Elemente in einer Message?

AlexII 28. Jan 2014 13:54

AW: Array in ShowMessage ausgeben?
 
Alle Elemente der Reihe nach zeigen, also z.B. so "24354501"

baumina 28. Jan 2014 13:57

AW: Array in ShowMessage ausgeben?
 
Mach dir eine Hilfsvariable, so z.B.:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
   a : Array[1..8] of Integer;
   i : Integer;
   s : String;

begin
   s := '';
   for i:=1 to 8 do
   begin
     a[i]:= Random(9);
     s := s + IntToStr(a[i]);
   end;
   ShowMessage(S);
end;

DeddyH 28. Jan 2014 13:58

AW: Array in ShowMessage ausgeben?
 
So?
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  a : Array[1..8] of Integer;
  i : Integer;
  s: string;
begin
  s := '';
  for i:=1 to 8 do
    begin
      a[i]:= Random(9);
      s := s + IntToStr(a[i]);
    end;
  ShowMessage(s);
end;
Oder als eigene Funktion:
Delphi-Quellcode:
function IntArrayToStr(const Ints: array of integer): string;
var
  i: integer;
begin
  Result := '';
  for i := Low(Ints) to High(Ints) do
    Result := Result + IntToStr(Ints[i]);
end;

AlexII 28. Jan 2014 14:03

AW: Array in ShowMessage ausgeben?
 
Ah.. jah... ok, ich dachte es geht irgendwie mit einer Schreibweise von a.
Danke ecuh!

Der schöne Günther 28. Jan 2014 16:09

AW: Array in ShowMessage ausgeben?
 
Hintergedanken an Java und sein
Delphi-Quellcode:
ToString()
? ;-)

Ich würde es in Delphi mit einer Helperklasse machen, ich liebe die Dinger.

Delphi-Quellcode:
interface
   TIntegerArrayHelper = record helper for TArray<Integer>
      function ToString(): String;
   end;

implementation
   function TIntegerArrayHelper.ToString(): String;
   var
      elementNo: Integer;
   begin
      Result := EmptyStr;

      for elementNo := Low(self) to High(self) do
         Result := Result + self[elementNo].ToString();
   end;
Mit einem so festgeschriebenen Array wie
Delphi-Quellcode:
Array[X..Y] of someType
klappt das natürlich nicht. Die Helperklasse hier würde nur für jedes dynamische Integer-Array greifen. Alternativ (z.B. wenn es denn immer 8 Integer sind) kann (und sollte) man sich einen eigenen Typen-Alias definieren (und dann kann man wieder eine spezielle Helperklasse dafür bauen)

himitsu 28. Jan 2014 17:02

AW: Array in ShowMessage ausgeben?
 
Du kannst auch gern die Generics etwas ausnutzen.
Delphi-Quellcode:
function TIntegerArrayHelper.ToString: String;
var
  Element: Integer;
begin
  Result := Default(String);
  for Element in Self do
    Result := Result + Element.ToString;
end;
Im Prinzip ist diese Funktion schon für alles Arrays gewappnet, solange die Elemente ein ToString besitzen.
Objekte haben Dieses, aber das ist noch recht selten "richtig" implementiert, bzw. es wurde oftmals vergessen es entsprechend zu überschreiben.
Delphi-Quellcode:
function TIntegerArrayHelper.ToString(Separator: Char=#0): String;
var
  Element: Integer;
begin
  Result := '';
  for Element in Self do
    if (Result <> '') and (Separator <> #0) then
      Result := Result + Separator + Element.ToString
    else
      Result := Result + Element.ToString;
end;

// bzw.

function TIntegerArrayHelper.ToString(Separator: Char=#0): String;
var
  Element: Integer;
begin
  Result := '';
  for Element in Self do
    Result := Result + Element.ToString + Separator;
  Delete(Result, High(Result), 1);
end;

Der schöne Günther 28. Jan 2014 17:45

AW: Array in ShowMessage ausgeben?
 
Das ein "for .. in" auf record-Typen funktioniert hätte ich nicht gedacht. Aber wo sind denn da Generics?

Und ja, die Elemente-Ausgabe noch mit einem Separator zu trennen hätte ich auch noch eingebaut. Als Verbesserungsvorschlag: Den Separator als String und nicht Char! Ich habe schon oft geweint weil ich irgendwo als Trennung zwei oder mehr Zeichen haben wollte und irgendeine blöde Methode dachte, mich mit einem einzigen Char abspeisen zu können.

himitsu 28. Jan 2014 17:52

AW: Array in ShowMessage ausgeben?
 
Die sind intern versteckt.
z.B. viele Standard-Enumeratoren werden automatisch über einen generischen Basistyp erzeugt und das Default(Typ) ist auch von da.

Für Arrays wird intern ein Enumator generisch erzeugt, sobald man das Array mit For-In verwendet.


Als Char war der halt "einfacher", borallem beim letzen Beispiel.
Aber da den Seperator an den String-Anfang und man muß auch nichts mehr berechnen. (Delete mit Low und Length)

Der schöne Günther 28. Jan 2014 18:01

AW: Array in ShowMessage ausgeben?
 
Die
Delphi-Quellcode:
GetEnumerator
-Geschichte ist einer der spannenderen Sachen, die ich mir noch aufgehoben habe. Deshalb kann ich dazu nichts mehr sagen :oops:
Das interessante ist ja, dass etwas überhaupt kein IEnumerable<T>-Interface unterstützen muss, um mit for..in drüberrutschen zu können. Was ist hier los? Duck-Typing? Irgendwann schaue ich da mal unter die Haube. Aber wir schweifen ab 8-)

himitsu 28. Jan 2014 18:15

AW: Array in ShowMessage ausgeben?
 
Bei einigen Typen, wie eben den Arrays, wird der Enumerator direkt vom Compiler erzeugt.
Da wird dann einfach für
Delphi-Quellcode:
array of T
,
Delphi-Quellcode:
array[x..x] of T
, bzw.
Delphi-Quellcode:
TArray<T>
ein passender
Delphi-Quellcode:
TEnumerable<T>
erzeugt.

Bis vor Kurzem konnte man auch noch keine Record-Helper an einfache Typen (wie z.B. Arrays, Integer, String) hängen.
Nur Record-Helper für Records und Class-Helper für Klassen. (an Interfaces geht dann nun wohl auch endlich? )

Somit blieb, bei diesen Default-Enumeratoren für Arrays, nur der Weg über die Compiler-Magic.

Der schöne Günther 28. Jan 2014 18:21

AW: Array in ShowMessage ausgeben?
 
Zitat:

Zitat von himitsu (Beitrag 1245742)
(an Interfaces geht dann nun wohl auch endlich?)

Als ob :(
Kann aber sein dass es gute Gründe dafür gibt, nie darüber nachgedacht.
XE3 hat meine ich die Möglichkeit für Record Helper für eingebaute Typen wie Integer eingeführt, XE4 dann auch Standard-Implementationen vorgegeben.

AlexII 29. Jan 2014 09:00

AW: Array in ShowMessage ausgeben?
 
Zitat:

Zitat von baumina (Beitrag 1245677)
Mach dir eine Hilfsvariable, so z.B.:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
   a : Array[1..8] of Integer;
   i : Integer;
   s : String;

begin
   s := '';
   for i:=1 to 8 do
   begin
     a[i]:= Random(9);
     s := s + IntToStr(a[i]);
   end;
   ShowMessage(S);
end;


Hm... hier braucht man doch auch kein Array... wozu? Geht doch auch ohne!

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
   i : Integer;
   s : String;
begin
   s := '';
   for i:=1 to 8 do
   begin
     s := s + IntToStr(Random(9));
   end;
   ShowMessage(S);
end;

baumina 29. Jan 2014 09:10

AW: Array in ShowMessage ausgeben?
 
Zitat:

Zitat von AlexII (Beitrag 1245809)
Hm... hier braucht man doch auch kein Array... wozu? Geht doch auch ohne!

Stimmt, man braucht das Array nicht, aber deine Frage war "Array in ShowMessage ausgeben?", hätte ich wohl nicht wörtlich nehmen dürfen, mein Fehler.

AlexII 29. Jan 2014 09:16

AW: Array in ShowMessage ausgeben?
 
Zitat:

Zitat von baumina (Beitrag 1245810)
Zitat:

Zitat von AlexII (Beitrag 1245809)
Hm... hier braucht man doch auch kein Array... wozu? Geht doch auch ohne!

Stimmt, man braucht das Array nicht, aber deine Frage war "Array in ShowMessage ausgeben?", hätte ich wohl nicht wörtlich nehmen dürfen, mein Fehler.

Ne ne... ist gut so, deine Antwort ist auch richtig, danke! :thumb:
ich habe nur weiter überlegt und sah das mein Ansatz mit Array überflüssig ist.

Stevie 29. Jan 2014 12:58

AW: Array in ShowMessage ausgeben?
 
Zitat:

Zitat von himitsu (Beitrag 1245742)
Bei einigen Typen, wie eben den Arrays, wird der Enumerator direkt vom Compiler erzeugt.
Da wird dann einfach für
Delphi-Quellcode:
array of T
,
Delphi-Quellcode:
array[x..x] of T
, bzw.
Delphi-Quellcode:
TArray<T>
ein passender
Delphi-Quellcode:
TEnumerable<T>
erzeugt.

Hö? Ist das nicht nach wie vor Compiler Magic bei arrays? :gruebel:

himitsu 29. Jan 2014 14:07

AW: Array in ShowMessage ausgeben?
 
Gute Frage :gruebel:

Kann natürlich sein, daß die das immernoch als Compilermagic implementiert haben.
Obwohl, vom optimalen code her, wäre es wahrscheinlich, daß es immernoch wie eine While-Schleife ist.

Sagen wir es einfach mal so: Für uns sieht es wie ein Enumerator aus (so isses verständlicher) und was intern gemacht wird, ignorieren wir.

waterboy 10. Jan 2023 22:27

AW: Array in ShowMessage ausgeben?
 
Zitat:

Zitat von DeddyH (Beitrag 1245678)
So?
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  a : Array[1..8] of Integer;
  i : Integer;
  s: string;
begin
  s := '';
  for i:=1 to 8 do
    begin
      a[i]:= Random(9);
      s := s + IntToStr(a[i]);
    end;
  ShowMessage(s);
end;
Oder als eigene Funktion:
Delphi-Quellcode:
function IntArrayToStr(const Ints: array of integer): string;
var
  i: integer;
begin
  Result := '';
  for i := Low(Ints) to High(Ints) do
    Result := Result + IntToStr(Ints[i]);
end;


Das ist wirklich genial und genau nach sowas habe ich gesucht. Vielen Dank.

in VBA und Python kann man die Arrays direkt ausgeben. Das fehlt mir in Delphi.

Viele Grüße

rainer

Dennis07 14. Jan 2023 17:08

AW: Array in ShowMessage ausgeben?
 
Wieso nicht einfach mit
Delphi-Quellcode:
String.Join(...)
?

Delphi-Quellcode:
ShowMessage(String.Join(String.Empty, MyStringArray))
Alternativ kannst du natürlich hier auch einen anderen Separator wie zB.
Delphi-Quellcode:
sLineBreak
oder
Delphi-Quellcode:
','
verwenden.

Zitat:

Zitat von Stevie (Beitrag 1245853)
Hö? Ist das nicht nach wie vor Compiler Magic bei arrays? :gruebel:

Ja. Wenn du dir den CPU-Stack anzeigen lässt, dann wirst du sehen, dass hier bei dynamischen Arrays nur eine Indexvariable benutzt wird. Es gäbe für den Compiler ja auch keinen Grund, hier irgendeine Klasse zu erzeugen.


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