| Autor |
Beitrag |
MephistoFFF
      
Beiträge: 60
Win 7
|
Verfasst: Fr 30.01.09 15:25
Hallo!
Folgende Tatsache: Ich lasse in einem TMemo Dateien einlesen ( memo.lines.loadfromfile ). Der Dateiname ist abhängig vom Item, was gerade in einer Listbox ausgewählt ist ( listbox.itemindex ). Die Listbox ist alphabetisch sortiert ( schon von vornherein ). Ich kann mit dem Programm der Listbox Einträge hinzufügen. Diese werden ja aber ( logischerweise ) an das Ende der Listbox gesetzt und ist damit nicht mehr alphabetisch sortiert. Wenn ich Listbox.sorted auf true setze und dann einen neuen eintrag hinzufüge, stimmen die dateinamen nicht mehr mit dem itemindex überein.
Kann ich also die Listbox sortieren lasse, ohne alle Dateien umzubennen?
mfG
Zuletzt bearbeitet von MephistoFFF am Fr 30.01.09 15:31, insgesamt 1-mal bearbeitet
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 30.01.09 15:28
Ich verstehe das mit den Dateinamen nicht so ganz, wo ist das Problem, über Listbox1.Items[Listbox1.ItemIndex] auf die aktuell ausgewählte Datei zuzugreifen? 
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
MephistoFFF 
      
Beiträge: 60
Win 7
|
Verfasst: Fr 30.01.09 15:32
JayEff hat folgendes geschrieben : | Ich verstehe das mit den Dateinamen nicht so ganz, wo ist das Problem, über Listbox1.Items[Listbox1.ItemIndex] auf die aktuell ausgewählte Datei zuzugreifen?  |
Die Dateiname sind FORTLAUFENDE-NUMMER.txt und werden mit dem Programm mitgeliefert ( beginnend bei 0.txt, weil das erste item in der listbox ja auch die 0 als index hat )
mfG
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 30.01.09 15:36
Ah, ich verstehe. Die Einträge der Listbox stimmen nicht mit den Dateinamen überein, richtig? Eine Möglichkeit wäre, intern die Dateinamen in ein Array zu speichern. Du müsstest dessen Einträge natürlich im Falle eines hinzugefügten Eintrages so ändern, dass die Indizes der Listboxeinträge mit den Indizes des Arrays übereinstimmen.
Alternativ überdenkst du nochmal die Art und Weise, wie du speicherst und lädst, aber ich kann dir nicht sagen, ob das zu einem besseren Ergebnis führt.
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
Nersgatt
      
Beiträge: 1581
Erhaltene Danke: 279
Delphi 10 Seattle Prof.
|
Verfasst: Fr 30.01.09 15:38
Du kannst zu jedem Item in den Listbox zusätzle Infos in einem Objekt speichern. So kannst Du den angezeigten Text vom Dateinamen entkoppeln:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm2.FormCreate(Sender: TObject); type TDateiName = Record Dateiname : String; end; var datei : TDateiname; begin datei.Dateiname := '0.txt'; listbox1.AddItem('A', TObject(Datei));
datei.Dateiname := '1.txt'; listbox1.AddItem('Blah', TObject(Datei));
datei.Dateiname := '2.txt'; listbox1.AddItem('Blubb', TObject(Datei));
datei.Dateiname := '3.txt'; listbox1.AddItem('Quassel', TObject(Datei)); end; |
Dann kannst Du sortieren wie Du lustig bist ohne an den Dateinamen etwas zu ändern.
_________________ Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 30.01.09 16:03
Moin!
Nersgatt hat folgendes geschrieben : | | Du kannst zu jedem Item in den Listbox zusätzle Infos in einem Objekt speichern. So kannst Du den angezeigten Text vom Dateinamen entkoppeln: |
Idee gut, Ansatz schlecht. Mit diesem Code hängst du die Compiler-Magic für die Stringverwaltung ab!
Besser: Stringliste anlegen und in dem .Objects[] der Listbox-Items den Index (auf Pointer gecastet, damit der Compiler es "frisst") in die Stringliste.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
JayEff
      
Beiträge: 2971
Windows Vista Ultimate
D7 Enterprise
|
Verfasst: Fr 30.01.09 16:05
_________________ >+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 30.01.09 16:12
JayEff hat folgendes geschrieben : | Ok das interessiert mich jetzt (und ist auch relevant für den Thread, oder? ): Was genau bedeutet das, wie verwaltet die Compiler-Magic hier Strings bzw tut dies nicht mehr? |
Die Compilermagic zählt intern einen Referenzzähler wie oft ein String verwendet wird.
Sobald dieser Zähler 0 ist, wird der String freigegeben.
Wenn du ein Zeichen in einem String änderst, wird deshalb vorher UniqueString aufgerufen, um sicherzustellen, dass nicht anderswo noch eine Referenz auf den selben (und damit dann geänderten) String zeigt. Denn intern sind lange Strings ja Pointer (mit internen Daten vor dem Anfang des Strings).
|
|
MephistoFFF 
      
Beiträge: 60
Win 7
|
Verfasst: Do 05.02.09 15:58
Da ich keine andere Lösung gefunden habe, hab ich jetzt die gesamte Dateistruktur nochmal geändert und rufe die Dateien jetzt über
Delphi-Quelltext 1:
| extractFilePath(Application.Exename)+'Data\Files\'+ListBox1.Items.Strings[strtoint(Index)]+'\file.txt' |
auf.
Trotzdem nochmal vielen Dank an alle  .
mfG
|
|