Autor Beitrag
Luc1fer
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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?



ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
var
   sText: string;

beschert dir normalerweise einen String der seeeeeeeeeeeeeeehr lang sein darf.

Beste Grüße
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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)?


Zuletzt bearbeitet von jaenicke am Mi 06.07.11 11:13, insgesamt 2-mal bearbeitet
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: Mi 06.07.11 13:52 
Welches Ergebnis erhältst Du, wenn Du einmal folgendes einbaust?
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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ß...
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 06.07.11 14:38 
:roll: :roll:

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

ausblenden 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.