Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Memo - zeigt nur 2 Lines statt 12 Lines an... (https://www.delphipraxis.net/182308-memo-zeigt-nur-2-lines-statt-12-lines.html)

Codix32 16. Okt 2014 13:17

Memo - zeigt nur 2 Lines statt 12 Lines an...
 
Während die Listbox die 12 Items ausgibt, gibt das Memo nur die Lines 0 und 1 aus, warum?

Delphi-Quellcode:
uses DateUtils;
...
...
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
begin
 for i := 0 to 13 -1  do
 begin
   Memo1.lines.strings[i] := timetostr(IncSecond(now, 10+(i*8)))+'  '+'Test '+ inttostr(i);
   Listbox1.Items[i]:= timetostr(IncSecond(now, 10+(i*8)))+'  '+'Test '+ inttostr(i);
 end;
 end;

mkinzler 16. Okt 2014 13:18

AW: Memo - zeigt nur 2 Lines statt 12 Lines an...
 
Möglicherweise hat das Memo nur 2 Zeilen.

himitsu 16. Okt 2014 13:25

AW: Memo - zeigt nur 2 Lines statt 12 Lines an...
 
Eine "normale" TStringList und die Items der ListBox knallen (Exception), wenn man auf nicht existierende Items/Zeilen zugreift.
Beim TMemoStrings verschwindet das einfach im Nirvana.

So oder so, wer auf nichtexistierende Items zugreift, der ist selber Schuld.

Codix32 16. Okt 2014 13:45

AW: Memo - zeigt nur 2 Lines statt 12 Lines an...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von himitsu (Beitrag 1276214)
Eine "normale" TStringList und die Items der ListBox knallen (Exception), wenn man auf nicht existierende Items/Zeilen zugreift.
Beim TMemoStrings verschwindet das einfach im Nirvana.

So oder so, wer auf nichtexistierende Items zugreift, der ist selber Schuld.

Das verstehe ich nicht, ich erstelle doch die Lines oder etwa nicht?

Siehe Bild.

Uwe Raabe 16. Okt 2014 13:50

AW: Memo - zeigt nur 2 Lines statt 12 Lines an...
 
Zitat:

Zitat von Codix32 (Beitrag 1276219)
Das verstehe ich nicht, ich erstelle doch die Lines oder etwa nicht?

Nein, du beschreibst sie nur.

So könnte es gehen:

Delphi-Quellcode:
 Memo1.Lines.Clear; // alle Zeilen löschen
 for i := 0 to 13 -1 do
 begin
   // neue Zeile anhängen
   Memo1.lines.Add(timetostr(IncSecond(now, 10+(i*8)))+' '+'Test '+ inttostr(i));
 end;

mkinzler 16. Okt 2014 13:51

AW: Memo - zeigt nur 2 Lines statt 12 Lines an...
 
Zitat:

Das verstehe ich nicht, ich erstelle doch die Lines oder etwa nicht?
Nein Du ersetzt nur den Inhalt.

Christian Seehase 16. Okt 2014 13:56

AW: Memo - zeigt nur 2 Lines statt 12 Lines an...
 
Moin Himitsu,

Zitat:

Zitat von himitsu (Beitrag 1276214)
Eine "normale" TStringList und die Items der ListBox knallen (Exception), wenn man auf nicht existierende Items/Zeilen zugreift.

Das hätt' ich auch gedacht.
Jetzt habe ich es mal in D7 ausprobiert:
Neues Projekt.
TButton
TMemo
TListBox
auf das Formular.

Den Beispielcode drauf und den Button drücken: Gleiches Verhalten, keine Exception :gruebel: aber zwei Zeilen im Memo und 12 in der Listbox.

mkinzler 16. Okt 2014 14:01

AW: Memo - zeigt nur 2 Lines statt 12 Lines an...
 
Höchstwahrscheinlich unterdrückt der Setter das und erzeugt die Objekte in der ListBox, im Memo halt nicht.
Will man etwas hinzufügen, sollte man die Add... Methoden verwenden.

Codix32 16. Okt 2014 14:02

AW: Memo - zeigt nur 2 Lines statt 12 Lines an...
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1276222)
Zitat:

Zitat von Codix32 (Beitrag 1276219)
Das verstehe ich nicht, ich erstelle doch die Lines oder etwa nicht?

Nein, du beschreibst sie nur.

So könnte es gehen:

Delphi-Quellcode:
 Memo1.Lines.Clear; // alle Zeilen löschen
 for i := 0 to 13 -1 do
 begin
   // neue Zeile anhängen
   Memo1.lines.Add(timetostr(IncSecond(now, 10+(i*8)))+' '+'Test '+ inttostr(i));
 end;

Danke Uwe Raabe, jetzt geht es.
Dann müßte es wohl bei der Listbox auch besser 'Listbox1.items.add' heißen, obwohl man dort 'Items[i]
nicht nur einlesen, sondern auch schreiben kann.

Codix32 16. Okt 2014 14:02

AW: Memo - zeigt nur 2 Lines statt 12 Lines an...
 
Zitat:

Zitat von mkinzler (Beitrag 1276226)
Höchstwahrscheinlich unterdrückt der Setter das und erzeugt die Objekte in der ListBox, im Memo halt nicht.
Will man etwas hinzufügen, sollte man die Add... Methoden verwenden.

Danke mkinzler

hathor 16. Okt 2014 14:15

AW: Memo - zeigt nur 2 Lines statt 12 Lines an...
 
Man könnte grundsätzlich gleich in der procedure xxxx.Create folgende Zeile aufnehmen:

for i := 0 to 999 do Memo1.Lines.Add('');

Dann funktioniert der Code in #1 problemlos.

Alternative:
Man hängt an jedes String-Ende #13#10 an, dann geht es auch:
Delphi-Quellcode:
procedure TForm2.Button6Click(Sender: TObject);
var i : Integer;
begin
Memo1.Clear;
for i := 0 to 1002 do Memo1.lines.strings[i] := INTTOSTR(i)+#13#10;
end;

himitsu 16. Okt 2014 14:49

AW: Memo - zeigt nur 2 Lines statt 12 Lines an...
 
Zitat:

Zitat von Christian Seehase (Beitrag 1276224)
Das hätt' ich auch gedacht.

Vielleicht haben die das irgendwann umgebaut?

Bei TStringList wird ein EStringListError "Listenindex überschreitet das Maximum (%d)" ausgelöst.

Beim TMemoStrings (das im TMemo.Lines) wurde einfach die Fehlerprüfung vergessen, bzw. man hat vergessen die Exception einzubauen und verwirft den Fehler ganz böswillig.
Delphi-Quellcode:
function TMemoStrings.Get(Index: Integer): string;
var
  Text: array[0..4095] of Char;
begin
  Word((@Text)^) := Length(Text);
  SetString(Result, Text, SendMessage(Memo.Handle, EM_GETLINE, Index, Longint(@Text)));
end;
Bei Google suchenEM_GETLINE > The return value is zero if the line number specified by the wParam parameter is greater than the number of lines in the edit control.
Delphi-Quellcode:
procedure TMemoStrings.Put(Index: Integer; const S: string);
var
  SelStart: Integer;
begin
  SelStart := SendMessage(Memo.Handle, EM_LINEINDEX, Index, 0);
  if SelStart >= 0 then begin
    SendMessage(Memo.Handle, EM_SETSEL, SelStart, SelStart + SendMessage(Memo.Handle, EM_LINELENGTH, SelStart, 0));
    SendTextMessage(Memo.Handle, EM_REPLACESEL, 0, S);
  end
  {else raise exception .... wurde vergessen}
end;
Bei Google suchenEM_LINEINDEX > it is –1 if the specified line number is greater than the number of lines in the edit control.

Bei praktisch jedem einzelnen SendMessage/SendTextMessage wurde vergessen das Result zu prüfen. :wall:
(außer bei dem einen SendMessage(LINEINDEX))



Es kann natürlich auch sein, daß man es auch bei anderen Komponenten vergessen oder wieder ausgebaut hat. :stupid:
Hab nicht nachgesehn, aber ich hoffe die machen nicht beim FMX mit diesem Mist so weiter.


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