Autor Beitrag
Massa
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Do 08.01.09 18:07 
Hallo zusammen.

Ich habe eine Liste erstellt in der Buchtitel, mit dessen Autor und sowas steht.
Diese habe ich als txt-Datei gespeichert und mit LoadFromFile in ein Memofeld kopiert.
Aus dem Memofeld werden dann die einzelnen Angaben wie Titel und Autor in einzelne Editfelder geschrieben.
Sortiert habe ich sie auch, und zwar nach Titel, doch nun tut sich bei mir das Problem auf, dass ich nicht weiß,
wie ich diese Aktualisierung auch in mein Memofeld bringe.
Also im Memofeld steht sozusagen noch die alte "Version" von der Bücherliste.

Ich brauche dabei unbedingt Hilfe.
Danke im Voraus


Gruß
Massa
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 18:09 
Wie sortierst du denn? Da müsstest du schon den Quelltext zeigen.

Eine ListView wäre vermutlich besser geeignet, diese kann auch schon selbst sortieren.
Massa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Do 08.01.09 19:04 
Hallo jaenicke und danke für deine Antwort.

Hier das Sortieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure   SortListe.sort;
  var getauscht:boolean;
      a, b:tSortelement;
  begin
    repeat
      self.tofirst;
      getauscht:=false;
        repeat
          a:=self.getObject;
          self.next;
        if not self.isbehind then
         if self.getObject.kleiner(a)
           then begin
             b:=self.getObject;
             self.previous;
             self.update(b);
             self.next;
             self.update(a);
             getauscht:=true;
          end;
       until self.isBehind;
     until not getauscht;
  end;


Wie eben schon geschrieben, wird nur in den Editfeldern die richtige Reihenfolge angezeigt, jedoch nicht im Memofeld.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 19:08 
Ich meinte vor allem den Zusammenhang zwischen den Daten im Memo, in den Edits und der sortierten Liste. Ich meine, du schreibst die sortierten Daten ja anscheinend nicht ins Memo wieder.

So ganz weiß ich auch noch nicht, wie du das mit den Edits meinst.
Massa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Do 08.01.09 19:23 
Hier müsste eigentlich das drinstehen, was du suchst...


ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
constructor TBuch.create (pSachgebiet, pAutor, pTitel, pOrt, pVerlag:String;
                        pNr, pJahr: Integer);
begin
  inherited Create;
  Sachgebiet := pSachgebiet;
  Autor := pAutor;
  Titel := pTitel;
  Ort := pOrt;
  Verlag := pVerlag;
  Nr := pNr;
  Jahr := pJahr;
end;

function TBuch.getSachgebiet : String;
begin
  getSachgebiet := Sachgebiet
end;
function TBuch.getAutor : String;
begin
  getAutor :=  Autor
end;
function TBuch.getTitel : String;
begin
  getTitel := Titel
end;
function TBuch.getOrt : String;
begin
  getOrt := Ort
end;
function TBuch.getVerlag : String;
begin
  getVerlag :=  Verlag
end;
function TBuch.getNr : Integer;
begin
  getNr := Nr
end;
function TBuch.getJahr : Integer;
begin
  getJahr := Jahr
end;


procedure TForm1.Anzeigen;
var buch :TBuch;
begin
  if not (Titelliste.isBehind  or Titelliste.isBefore) then begin
    buch := TBuch(TitelListe.GetObject);
    with buch do begin
      edTitel.Text := getTitel;
      edAutor.Text := getAutor;
      edSachgebiet.Text := getSachgebiet;
      EdNr.text:=inttostr(getNr);
      EdVerlag.text:=getVerlag;
      EdOrt.text:=getOrt;
      EdJahr.text:=inttostr(getjahr);
    end;
  end;
end;


procedure TForm1.BtEinlesenClick(Sender: TObject);
var i, Code, aNr, aJahr:integer;
    Zeile, aSachgebiet, aAutor, aTitel, aOrt, aVerlag : String;
    neu : TBuch;
begin
  memo1.Lines.LoadFromFile('Buecher.txt');
  Anzahl := memo1.Lines.Count;
  TitelListe := SortListe.Init;
  for i := 0 to Anzahl-1 do begin
      Zeile := Memo1.Lines[i];
      aNr := strtoint(copy(Zeile, 1, pos(';', zeile)-1));
      delete (zeile, 1, pos(';', zeile));
      aSachgebiet := copy(Zeile, 1, pos(';', zeile)-1);
      delete (zeile, 1, pos(';', zeile));
      aAutor := copy(Zeile, 1, pos(';', zeile)-1);
      delete (zeile, 1, pos(';', zeile));
      aTitel := copy(Zeile, 1, pos(';', zeile)-1);
      delete (zeile, 1, pos(';', zeile));
      aOrt := copy(Zeile, 1, pos(';', zeile)-1);
      delete (zeile, 1, pos(';', zeile));
      if copy(Zeile, 1, pos(';', zeile)-1) = ''
      then aJahr :=0
      else val(copy(Zeile, 1, pos(';', zeile)-1),aJahr,Code );
      delete (zeile, 1, pos(';', zeile));
      aVerlag := Zeile;
      neu := TBuch.Create(aSachgebiet, aAutor, aTitel, aOrt, aVerlag, aNr, aJahr);
      Titelliste.toLast;
      TitelListe.InsertBehind(neu);
  end;
  TitelListe.toFirst;
  lbAnzahl.Caption := intToStr(Anzahlen)+' Datensätze';
  Anzeigen;
end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 19:28 
Ein Programm, das auch Bücher verwaltet, habe ich auch schonmal geschrieben. Da wäre ich allerdings nicht darauf gekommen ein TMemo zu verwenden. Warum nimmst du nicht TListView oder noch besser eine VirtualTreeView?

Zum Problem: Du liest zwar aus dem Memo aus, du müsstest aber danach sortieren und die sortierten Daten wieder ins Memo schreiben.
Massa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Do 08.01.09 19:39 
Nur wie schreibe ich die sortierten Daten wieder ins Memo rein?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 19:44 
Du musst deine Buchliste durchgehen und mit Memo1.Lines.Add die Zeilen wieder hineinlegen.

Besser wäre aber gleich nur eine TStringList unsichtbar statt der visuellen Komponente TMemo zu benutzen und dann die Daten aus der Liste in eine TListView zu schreiben. Ein Memo hat ja keine Spalten.

Eine ListView hat auch den Vorteil, dass du durch Klick auf die Überschriften nach dieser Spalte sortieren kannst, wenn du das anbieten möchtest.
Massa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Do 08.01.09 19:47 
Ok...
Könntest du mir denn vieleicht eine kleine Hilfe dazu geben? Also zur TStringList und mit dem Umgang von dem TListView.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 20:09 
Aus dem Kopf geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
  FileContents: TStringList;
begin
  FileContents := TStringList.Create;
  FileContents.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Buecher.txt');
  for i := 0 to FileContents.Count - 1 do
  begin
    Zeile := FileContents[i];
...
ListView (ViewStyle auf vsReport und unter Column zwei neue Spalten erzeugt):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  NewItem: TListItem;
begin
  for i := 0 to 2 do
  begin
    NewItem := ListView1.Items.Add;
    NewItem.Caption := IntToStr(i);
    NewItem.Subitems.Add('Huch');
    NewItem.Subitems.Add('Noch mehr');
  end;
Du hast die Datei Buecher.txt im selben Verzeichnis wie die Exe liegen. Wenn du das machst, dann musst du trotzdem den Pfad angeben, wie ich es jetzt auch gemacht habe.

Dir muss aber klar sein, dass das auf anderen PCs so nicht immer funktioniert. Ich glaube aber, dass es für den Anfang reicht, wenn du die Datei korrekt im selben Verzeichnis wie die Exe verwendest.

Mehr dazu habe ich hier geschrieben, aber ich glaube das ist für dich noch etwas zu kompliziert evtl., ist aber später wichtig, wenn du Programme auch veröffentlichen willst.