![]() |
TStrings Speicher
Moin moin.
Ist das so richtig? Wenn ich in einem Form zwei ComboBoxen habe und in beiden Dropdownlisten den selben Inhalt haben möcht und dazu diese Zeile im Code Verwende
Delphi-Quellcode:
dass die Liste dann nur einmal im Speicher liegt?
ComboBox2.Items=ComboBox1.Items
|
Re: TStrings Speicher
Zitat:
|
Re: TStrings Speicher
Wie kann ich das dann anstellen, dass die Liste nur einmal im Speicher gehalten wird? Irgendwie nur einen Pointer zuweisen?
|
Re: TStrings Speicher
Hallo,
Zitat:
Gruß xaromz |
Re: TStrings Speicher
Zitat:
Was stört dich daran ein paar Zeilen Synchronisationscode zu schreiben? Du könntest Versuchen per Ownerdraw den Inhalt der einen ComboBox in der anderen zu zeichen, aber ob das einfacher ist? |
Re: TStrings Speicher
Das was mich stört ist die Speicherplatzverschwendung.
|
Re: TStrings Speicher
Also das was du da mehr an Speicher brauchst, ist im Vergleich zu deiner restlichen Anwendung wohl vernachlässigbar.
|
Re: TStrings Speicher
Du weist ja nicht wie groß meine Stringliste ist :wink: . Sie kann bei mir schon ein paar 1000 Einträge haben.
|
Re: TStrings Speicher
Hallo,
Zitat:
Gruß xaromz |
Re: TStrings Speicher
Naja, bei 1GB Arbeitsspeicher wird es wenig ins Gewicht fallen. Aber wenn alle Programme so programmiert sind ist das schon schlecht. Aber gut, ich will hier keine Grundsatzdiskusion anfangen. Ich werd es dann wohl so machen müssen.
Vielen Dank an alle :thumb: Martin |
Re: TStrings Speicher
Zitat:
|
Re: TStrings Speicher
Zitat:
|
Re: TStrings Speicher
Das ist schon richtig so. Es gibt ja auch die Möglichkeit im Editor-Feld was einzugeben quasi als Filter. Man muss ja nicht unbedingt scrollen :wink: . Ich will ja den Personen, die das bedienen sollen nur Tipparbeit ersparen
Ja ja, die guten alten C64 Zeiten, da musste man sich noch gedanken über die Programmierung machen :-D . |
Re: TStrings Speicher
Zitat:
|
Re: TStrings Speicher
Die Delphi-Strings haben einen Referenzzähler. Und bei "S1 := S2;" wird nichts kopiert, sondern einfach S1 auf Pointer(S2) gesetzt und der Referenzzähler um eins erhöht. Beim kopieren einer Stringliste passiert genau dasselbe. Man braucht also grob Count*SizeOf(TStringItem) = Count*8 Bytes für die Kopie. Und bei 8KB sollten doch wohl noch drinnen sein.
|
Re: TStrings Speicher
Zitat:
|
Re: TStrings Speicher
Dann müste ich also statt
Delphi-Quellcode:
den Code
ComboBox2.Items:=ComboBox1.Items;
Delphi-Quellcode:
in einen Schleife ausführen und für jeden String einzeln zuweisen und vorher ItemCount entsprechend setzen?
ComboBox2.Items[i]:=ComboBox1.Items[i];
Geht dann nicht aber auch dieses:
Delphi-Quellcode:
:gruebel:
ComboBox2.Items.Text:=ComboBox1.Items.Text;
|
Re: TStrings Speicher
Stimmt. Daran habe ich gar nicht gedacht, dass ComboBox.Items ja keine TStringList ist sondern eine TComboBoxStrings.
|
Re: TStrings Speicher
Zitat:
|
Re: TStrings Speicher
Zitat:
TCustomComboBoxStrings = class(TStrings); TComboBoxStrings = class(TCustomComboBoxStrings); Und TStrings speicher die Strings nicht selbst. TComboBoxStrings nutzt SendMessage um die Strings zu setzen bzw. zu lesen. |
Re: TStrings Speicher
In einer StringListe gibt es keine einzelnen Strings, die Stringinhalte werden aller der Reihe nach in einen gemainsamen Speicherbereich geschrieben und per SLineBreak getrennt, also da ist nichts mehr mit einem Referenzzähler und gemeinsamem Speicher, welche sich zwei Strings teilen ... beim Aufruf von ComboBox2.Items[i] wird intern ja auch erst ein String erzeigt, in welchen dann die entsprechenden Stringdaten reinkopiert werden ... und wenn man einen String an ComboBox2.Items[i] übergibt, dann wird dessen inhalt ebenfalls in den großen, gemeinsamen Speicherbereich der Stringlist kopiert ... wie gesagt, egal wie ihr die Strings übergebt es sind und bleiben zwei unabhängige Speicherblöcke und demnach können die Daten nur Doppelt vorhanden sein.
|
Re: TStrings Speicher
Zitat:
Bei TListBox und TComboBox wird aber keine TStringList benutzt sondern eine spezielle TListBoxStrings bzw. TComboBoxStrings. Und die überlässt die String-Verwaltung dem Windows Control. Hier greift die Referenzzählung natürlich nicht (außer man verwendet Unicode-Controls mit WideString). |
Re: TStrings Speicher
Zitat:
Und dort stehen die Strings alle in einer Reihe, da ist dann kein Platz merh, für die Refferenzzähler, Längenangaben und was sonst noch in so'nem LongString enthalten ist (neben dem reinem Text). |
Re: TStrings Speicher
Zitat:
Code:
PStringItem = ^TStringItem;
TStringItem = record FString: string; FObject: TObject; end; Zitat:
Code:
Einer von uns versteht das Konstrukt Array wohl im Moment nicht mehr. :mrgreen:
PStringItemList = ^TStringItemList;
TStringItemList = array[0..MaxListSize] of TStringItem; TStringList = class(TStrings) private FList: PStringItemList; |
Re: TStrings Speicher
Zitat:
|
Re: TStrings Speicher
hmm, und ich dachte TStringList hat die Stringbehandlung von TStrings geerbt und nichts eigenes verwendet :shock:
|
Re: TStrings Speicher
TStrings is eine anstrakte Klasse, die bis auf die nötigen Methodendeklarationen nichts wirkliches zu bieten hat.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz