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 <> Nil) Then 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); 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:
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
Luc1fer hat folgendes geschrieben : |
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
eingebaut und danach ging es auch. Naja, jetzt hab ich es gekürzt und neue Kenntnisse erworben.
Ich danke euch vielmals.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!