von Listbox nach RichEdit
-
ich habe folgendes genutzt. funktiooniert aber nicht.
g =ListBox1->Items->Strings.StringOfChar();
RichEdit1->Lines->Add(g);
-
strings[] ist ein array und gibt die einzelnen zeilen zurück
-
entweder ne schleife durchlaufen lassen und die einzelnen zeilen von Strings[] von hand kopieren, oder es einfach mit
RichEdit1->Clear(); RichEdit1->Text = ListBox1->Items->Text;machen

mfg
BigNeal
-
danke, das hat mir weiter geholfen.
-
Wobei ich diese Version für effektiver halte:
RichEdit1->Lines->Assign(ListBox1->Items);
-
wie war das mit dem lern-effekt

-
tuxman schrieb:
wie war das mit dem lern-effekt

Dafür ist's heute zu heiß...

-
// M1 RichEdit1->Text = ListBox1->Items->Text;ist mit Abstand effizienter als
// M2 RichEdit1->Lines->Assign(ListBox1->Items);da dort direkt das Text-Property beschrieben wird und nicht der Umweg ueber die Get/Set-Funktionen des TStrings-Objektes laeuft.
1000 Elemente aus Listbox in RichEdit (getestet auf AMD Athlon XP 2800+) :
M1: ~ 5.2 ms
M2: ~92.5 ms
-
Ich bin geradezu entsetzt. Da ist die Assign-Implementierung doch viel schlampiger, als ich gedacht habe...
Von der Performance her entspricht die Verwendung von Assign einem Schleifendurchlauf und hinzufügen per Add(). Das kann ja wohl nicht wahr sein.
Ich hatte eigentlich erwartet, dass das per Stream realisiert werden würde.Ich hab es mal so getestet:
ListBox1->Items->Clear(); ListBox1->Items->BeginUpdate(); for (int i = 0; i < 10000; i++) ListBox1->Items->Add(AnsiString(i)); ListBox1->Items->EndUpdate(); DWORD start, ende; RichEdit1->Lines->Clear(); start = GetTickCount(); RichEdit1->Lines->BeginUpdate(); RichEdit1->Text = ListBox1->Items->Text; RichEdit1->Lines->EndUpdate(); ende = GetTickCount(); Label1->Caption = AnsiString(ende - start); RichEdit1->Lines->Clear(); start = GetTickCount(); RichEdit1->Lines->BeginUpdate(); RichEdit1->Lines->Assign(ListBox1->Items); RichEdit1->Lines->EndUpdate(); ende = GetTickCount(); Label2->Caption = AnsiString(ende - start); RichEdit1->Lines->Clear(); start = GetTickCount(); RichEdit1->Lines->BeginUpdate(); for (int i = 0 ; i < ListBox1->Items->Count; i++) RichEdit1->Lines->Add(ListBox1->Items->Strings[i]); RichEdit1->Lines->EndUpdate(); ende = GetTickCount(); Label3->Caption = AnsiString(ende - start); RichEdit1->Lines->Clear(); start = GetTickCount(); TMemoryStream* mystream = new TMemoryStream(); RichEdit1->Lines->BeginUpdate(); ListBox1->Items->SaveToStream(mystream); mystream->Position = 0; RichEdit1->Lines->LoadFromStream(mystream); RichEdit1->Lines->EndUpdate(); delete mystream; ende = GetTickCount(); Label4->Caption = AnsiString(ende - start);Die Ergebnisse:
Direkte Textzuweisung: 63 ms (62, 63)
Assign: 4485 ms (4578, 4593)
Schleife: 4437 ms (4563, 4547)
Stream: 62 ms (47, 63)
(in Klammern zweiter und dritter Durchlauf)Womit also festzustellen ist, dass es keinen Unterschied bei Assign und Schleife und keinen Unterschied zwischen direkter Textzuweisung und Stream gibt. Demnächst werde ich sowas testen, bevor ich mich aus dem Fenster lehne...
Getested auf Athlon XP 3200+
-

krass der unterschied.habe fast identische ergebnisse wie Joe_M