Autor Beitrag
MephistoFFF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60

Win 7

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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? :nixweiss:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
MephistoFFF Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60

Win 7

BeitragVerfasst: Fr 30.01.09 15:32 
user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
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? :nixweiss:


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 30.01.09 16:03 
Moin!

user profile iconNersgatt hat folgendes geschrieben Zum zitierten Posting springen:
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! :shock:

Besser: Stringliste anlegen und in dem .Objects[] der Listbox-Items den Index (auf Pointer gecastet, damit der Compiler es "frisst") in die Stringliste. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 30.01.09 16:05 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Mit diesem Code hängst du die Compiler-Magic für die Stringverwaltung ab! :shock:
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?

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 30.01.09 16:12 
user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60

Win 7

BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
extractFilePath(Application.Exename)+'Data\Files\'+ListBox1.Items.Strings[strtoint(Index)]+'\file.txt'					

auf.

Trotzdem nochmal vielen Dank an alle ;) .

mfG