Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - String nur 256 Zeichen


Luc1fer - Mi 06.07.11 08:11
Titel: String nur 256 Zeichen
Hi

mein Problem ist, ich will eine Reihe von Fehlermeldungen in einer Fehlrbox (ShowMessage, Messagebox,...) ausgeben, deswegen füg ich alle Meldungen in einem string zusammen mit Zeilenumbruch, um Sie später auszugeben, jedoch kann ein String nur 256 Zeichen lang sein.

Kann mir jemand einen Tipp geben, ob es über eine andere Komponente möglich ist, als eine String Variable?




Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
Procedure Fehlerliste_Ausgeben();
Var iIndex: Integer;
    sText: String;

  Begin
    Try
      If Not(bFehler_Anzeigen) Then Exit;
      If (lFehlerliste <> NilThen
        Begin
          sText:='';
          iIndex:=0;
          While iIndex < (lFehlerliste.Count) Do
            Begin
              If iIndex = 0 then
                sText := lFehlerliste[iIndex]
              Else
                sText := sText +#10#13+lFehlerliste[iIndex];

              Inc(iIndex);
            End;

          If Not(sText =''Then
            ShowMessage(sText);
            //Application.MessageBox(PChar(@sText),Pchar('Fehler'),48);

          FreeAndNil(lFehlerliste);
        End;
    Except
    End;
  End;


Ich danke euch schonmal

Viele Grüße


Gausi - Mi 06.07.11 08:21

Du könntest eine Stringliste verwenden, und diese dann in einem Memo oder ähnlichem anzeigen. Das wäre bei vielen Meldungen wahrscheinlich auch besser, da der Anwender darin scrollen kann, um wirklich alles zu lesen.

Aber ein String kann durchaus länger als 256 Zeichen sein. Diese Begrenzung gilt nur für den String aus alten Pascal-Zeiten, der jetzt ShortString heißt. Ein Delphi-String kann (fast) beliebig lang werden.


Luc1fer - Mi 06.07.11 08:35

Danke für deine schnelle Antwort.

Ersteinmal zum String, ich arbeite mit Delphi7, da falle ich also mit unter den älteren Versionen ^^'
Hab ich vergessen zuerwähnen, sorry.

Über die Memo Variante hab ich auch schon nach gedacht, jedoch programmier ich ein Zusatzmodul für eine bestehende Software und kann an den sichtbaren Komponenten auf dem Formular nichts verändern. Die Fehlermeldungen sollen also nur im Rahmen meines Moduls anzeigbar sein ohne Oberfläche.


Ich verbinde jetzt mit Memo die Komponente, die auf einem Formular gelagert ist.

Gruß


Tastaro - Mi 06.07.11 08:42

Delphi 7 verwendet nur dann short strings, wenn diese entsprechend deklariert oder der Compilerschalter aktiv ist.
Eine Deklaration wie:

Delphi-Quelltext
1:
2:
var
   sText: string;

beschert dir normalerweise einen String der seeeeeeeeeeeeeeehr lang sein darf.

Beste Grüße


Gausi - Mi 06.07.11 08:43

Mit alten Zeiten meinte ich sowas wie TurboPascal. Bei Delphi7 waren auch schon die langen Strings dabei. ;-)


Luc1fer - Mi 06.07.11 08:58

Ach so, naja, bin zu jung für diese "Alten Zeiten" :)

Aber dann verstehe ich nicht, warum er den String nach 255 Zeichen abbricht, wenn er sehr lang sein kann.

Ich hab es jetzt mal bisschen aufgesplitet und geschaut, was aus der Stringliste kommt (lFehlerliste), aber da kommt es richtig heraus, erst beim verlängern des Strings gibt's eine verkürzung.

Hat jemand eine idee?

Gruß


jaenicke - Mi 06.07.11 11:05

Du kannst mit CreateMessageDialog ein MessageBox-Formular erstellen, darauf das Label mit der Message durch ein Memo ersetzen und das Formular anzeigen.

Oder du erstellst gleich selbst ein neues Formular und zeigst das statt einer vorgegebenen MessageBox an.

Da muss doch an keiner Oberfläche etwas geändert werden und ein Fenster musst du so oder so anzeigen.

Nebenbei als Hinweis für spätere Leser des Threads:
Bei Delphi XE sind in ShowMessage bereits Scrollbalken implementiert für längere Texte. ;-)

// EDIT:
Ich habe es gerade mit Delphi 7 ausprobiert, wie eigentlich auch erwartet kann ich problemlos auch mehr als 256 Zeichen anzeigen (im Test ca. 2000 Zeichen). :nixweiss:
Kann es sein, dass da im Text irgendwo Steuerzeichen gelandet sind (außer Zeilenumbrüche)?


Delete - Mi 06.07.11 11:08

Was der Compiler meint ist, dass Stringliterale in der IDE nicht länger als 256 Zeichen sein dürfen.


jaenicke - Mi 06.07.11 11:14

Daran hatte ich auch gedacht, aber da es um den (längeren) String geht, der aus der Stringliste kommt, kann das hier ja nicht das Problem sein. :gruebel:


Luc1fer - Mi 06.07.11 11:35

Hi

wie hast du diesen langen String erzeugt? Bei mir bricht er eben nach der 256 Stelle ab und da kommt kein Steuerzeichen.

Bei dem Versuch bricht er auch ab
SText: String
a, iIndex:Integer


Delphi-Quelltext
1:
2:
3:
4:
For iIndex:=0 to 400 Do
  Stext:=Stext+IntToStr(iIndex);

a:=length(Stext);


Also in der stringliste sind in einer zeile keine 255 Zeichen, Sondern ich addiere die strings nur und setzte Zeilenumbrüche dazwischen, wie man es oben im Quelltext erkennt.

Ansonsten werd ich wohl ein eigenes Fehler Formular erschaffen müssen. Hab mich auch schon damit angefreundet nach überlegungen. ABer man will ja immer das, was nicht geht. :) Und dann noch wissen, warum es nicht geht.

Gruß


jaenicke - Mi 06.07.11 12:49

user profile iconLuc1fer hat folgendes geschrieben Zum zitierten Posting springen:
wie hast du diesen langen String erzeugt?
Ich habe den zum Testen schlicht direkt in den Quelltext geschrieben. ;-)


Luc1fer - Mi 06.07.11 13:23

hm... verstehe ich dann nicht, warum es bei mir nicht geht. Werd es dann eben anders machen.


Ich danke euch trotzdem für eure Zeit.

Edit: Ich füge es jetzt in einer Memobox zusammen und es funktioniert.


Gammatester - Mi 06.07.11 13:52

Welches Ergebnis erhältst Du, wenn Du einmal folgendes einbaust?

Delphi-Quelltext
1:
ShowMessage(IntToStr(sizeof(Stext)));                    

Wenn 256 und nicht 4 angezeigt wird, hast Du (zumindest in Deiner Unit) Shortstrings als Default-Stringtyp, entweder via Optionen oder irgendwo ist ein {$H-} im Quellcode vorhanden.


Luc1fer - Mi 06.07.11 14:08

Danke, ich erhalte "256". Dann werd ich mal schauen, wo ich so eine Umwandlung mache.

Ich danke euch, für eure Hilfe und die scheinbare Lösung.


jaenicke - Mi 06.07.11 14:20

Schreib einfach statt String für den Variablentyp AnsiString hin. ;-)

Oder du kürzt deinen Quelltext gleich auf ein Normalmaß...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure Fehlerliste_Ausgeben();
begin
  if bFehler_Anzeigen and Assigned(lFehlerliste) then
  begin
    if lFehlerliste.Text <> '' then
      ShowMessage(lFehlerliste.Text);
    FreeAndNil(lFehlerliste);
  end;
end;
Das macht dasselbe wie dein Code. ;-)

// EDIT:
Warum gibst du eigentlich das Fehlerlistenobjekt jedesmal frei? Das ist doch unnötig, leeren reicht... Dann kannst du es einmal am Anfang erstellen und am Ende freigeben und sparst dir die entsprechenden Prüfungen...


Luc1fer - Mi 06.07.11 14:38

:roll: :roll:

Ich wusste nicht, das Stringlisten so eine Funktion .Text besitzen. Hatte jetzt


Delphi-Quelltext
1:
2:
{$H+}
 sText: String


eingebaut und danach ging es auch. Naja, jetzt hab ich es gekürzt und neue Kenntnisse erworben.

Ich danke euch vielmals.