Autor |
Beitrag |
Luc1fer
Hält's aus hier
Beiträge: 10
|
Verfasst: Mi 06.07.11 08:11
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
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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.
_________________ We are, we were and will not be.
|
|
Luc1fer 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 414
Erhaltene Danke: 23
|
Verfasst: 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
beschert dir normalerweise einen String der seeeeeeeeeeeeeeehr lang sein darf.
Beste Grüße
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 06.07.11 08:43
Mit alten Zeiten meinte ich sowas wie TurboPascal. Bei Delphi7 waren auch schon die langen Strings dabei. 
_________________ We are, we were and will not be.
|
|
Luc1fer 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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).
Kann es sein, dass da im Text irgendwo Steuerzeichen gelandet sind (außer Zeilenumbrüche)?
Zuletzt bearbeitet von jaenicke am Mi 06.07.11 11:13, insgesamt 2-mal bearbeitet
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. 
|
|
Luc1fer 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 06.07.11 12:49
|
|
Luc1fer 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 328
Erhaltene Danke: 101
|
Verfasst: 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 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mi 06.07.11 14:38
Ich wusste nicht, das Stringlisten so eine Funktion .Text besitzen. Hatte jetzt
Delphi-Quelltext
eingebaut und danach ging es auch. Naja, jetzt hab ich es gekürzt und neue Kenntnisse erworben.
Ich danke euch vielmals.
|
|